Added Cloudstack provider sources from Kubernetes
diff --git a/Gopkg.lock b/Gopkg.lock
index e87a440..3f4677b 100644
--- a/Gopkg.lock
+++ b/Gopkg.lock
@@ -86,6 +86,22 @@
   version = "v18"
 
 [[projects]]
+  branch = "master"
+  digest = "1:d4cdaee0b210c90e76f895778ef8b54ab68eac94537216775e2692b565e6c6bf"
+  name = "github.com/d2g/dhcp4"
+  packages = ["."]
+  pruneopts = ""
+  revision = "a1d1b6c41b1ce8a71a5121a9cee31809c4707d9c"
+
+[[projects]]
+  digest = "1:6ecd75b89037757b74ab549f7f9f673a429a0c44a70ab8f3b07d5d9bdbd98e00"
+  name = "github.com/d2g/dhcp4client"
+  packages = ["."]
+  pruneopts = ""
+  revision = "b7a004ff1a09ab6723625e179a44e476306977a6"
+  version = "v1.0.0"
+
+[[projects]]
   digest = "1:0deddd908b6b4b768cfc272c16ee61e7088a60f7fe2f06c547bd3d8e1f8b8e77"
   name = "github.com/davecgh/go-spew"
   packages = ["spew"]
@@ -197,14 +213,6 @@
 
 [[projects]]
   branch = "master"
-  digest = "1:107b233e45174dbab5b1324201d092ea9448e58243ab9f039e4c0f332e121e3a"
-  name = "github.com/golang/glog"
-  packages = ["."]
-  pruneopts = ""
-  revision = "23def4e6c14b4da8ac2ed8007337bc5eb5007998"
-
-[[projects]]
-  branch = "master"
   digest = "1:aa2251148505e561bfa8cd6b69a319b37761da57b0b25529c4af08389559e3b9"
   name = "github.com/golang/groupcache"
   packages = ["lru"]
@@ -316,6 +324,14 @@
   version = "v1.1.5"
 
 [[projects]]
+  branch = "master"
+  digest = "1:2c5ad58492804c40bdaf5d92039b0cde8b5becd2b7feeb37d7d1cc36a8aa8dbe"
+  name = "github.com/kardianos/osext"
+  packages = ["."]
+  pruneopts = ""
+  revision = "ae77be60afb1dcacde03767a8c37337fad28ac14"
+
+[[projects]]
   digest = "1:6a874e3ddfb9db2b42bd8c85b6875407c702fa868eed20634ff489bc896ccfd3"
   name = "github.com/konsorten/go-windows-terminal-sequences"
   packages = ["."]
@@ -452,6 +468,14 @@
   version = "v1.0.3"
 
 [[projects]]
+  digest = "1:622a2d180e8318f2b85e259fdef60b1d093b36e973b4eaed9da4f88e951c1f90"
+  name = "github.com/xanzy/go-cloudstack"
+  packages = ["cloudstack"]
+  pruneopts = ""
+  revision = "0bc524282c2afc7da6ef19291cac338b8c6b12a7"
+  version = "v2.3.3"
+
+[[projects]]
   branch = "master"
   digest = "1:f7be435e0ca22e2cd62b2d2542081a231685837170a87a3662abb7cdf9f3f1cd"
   name = "golang.org/x/crypto"
@@ -597,6 +621,19 @@
   version = "v1.16.0"
 
 [[projects]]
+  digest = "1:bb864e9881b2c241fc6348ba5ed57e6ccf8a675903f1f5c3d81c1b3d7cc4b8f8"
+  name = "gopkg.in/gcfg.v1"
+  packages = [
+    ".",
+    "scanner",
+    "token",
+    "types",
+  ]
+  pruneopts = ""
+  revision = "61b2c08bc8f6068f7c5ca684372f9a6cb1c45ebe"
+  version = "v1.2.3"
+
+[[projects]]
   digest = "1:75fb3fcfc73a8c723efde7777b40e8e8ff9babf30d8c56160d01beffea8a95a6"
   name = "gopkg.in/inf.v0"
   packages = ["."]
@@ -626,6 +663,14 @@
   version = "v2.1.9"
 
 [[projects]]
+  digest = "1:ceec7e96590fb8168f36df4795fefe17051d4b0c2acc7ec4e260d8138c4dafac"
+  name = "gopkg.in/warnings.v0"
+  packages = ["."]
+  pruneopts = ""
+  revision = "ec4a0fea49c7b46c2aeb0b51aac55779c607e52b"
+  version = "v0.1.2"
+
+[[projects]]
   digest = "1:f0620375dd1f6251d9973b5f2596228cc8042e887cd7f827e4220bc1ce8c30e2"
   name = "gopkg.in/yaml.v2"
   packages = ["."]
@@ -1145,17 +1190,22 @@
   analyzer-name = "dep"
   analyzer-version = 1
   input-imports = [
-    "github.com/golang/glog",
+    "github.com/d2g/dhcp4",
+    "github.com/d2g/dhcp4client",
+    "github.com/kardianos/osext",
     "github.com/spf13/pflag",
-    "k8s.io/apiserver/pkg/server/healthz",
+    "github.com/xanzy/go-cloudstack/cloudstack",
+    "gopkg.in/gcfg.v1",
+    "k8s.io/api/core/v1",
+    "k8s.io/apimachinery/pkg/apis/meta/v1",
+    "k8s.io/apimachinery/pkg/types",
     "k8s.io/apiserver/pkg/util/flag",
     "k8s.io/apiserver/pkg/util/logs",
     "k8s.io/cloud-provider",
+    "k8s.io/klog",
     "k8s.io/kubernetes/cmd/cloud-controller-manager/app",
-    "k8s.io/kubernetes/cmd/cloud-controller-manager/app/options",
     "k8s.io/kubernetes/pkg/client/metrics/prometheus",
     "k8s.io/kubernetes/pkg/version/prometheus",
-    "k8s.io/kubernetes/pkg/version/verflag",
   ]
   solver-name = "gps-cdcl"
   solver-version = 1
diff --git a/Makefile b/Makefile
index 2a0102c..553239b 100644
--- a/Makefile
+++ b/Makefile
@@ -2,7 +2,7 @@
 
 VERSION=v0.0.1
 BUILD_DATE=$(shell date -u +'%Y-%m-%dT%H:%M:%SZ')
-GIT_COMMIT=$(shell git rev-parse HEAD --)
+GIT_COMMIT=$(shell git rev-parse HEAD)
 GIT_VERSION=${VERSION}-master+${GIT_COMMIT}
 LDFLAGS="-X github.com/swisstxt/cloudstack-cloud-controller-manager/vendor/k8s.io/kubernetes/pkg/version.gitVersion=${GIT_VERSION} -X github.com/swisstxt/cloudstack-cloud-controller-manager/vendor/k8s.io/kubernetes/pkg/version.gitCommit=${GIT_COMMIT} -X github.com/swisstxt/cloudstack-cloud-controller-manager/vendor/k8s.io/kubernetes/pkg/version.buildDate=${BUILD_DATE}"
 
diff --git a/README.md b/README.md
index ba5cc7c..fe6c612 100644
--- a/README.md
+++ b/README.md
@@ -14,8 +14,10 @@
 make
 ```
 
-## Usage
+## Use
+
+Make sure your apiserver is running locally and keep your cloudstack config ready:
 
 ```bash
-./cloudstack-ccm --cloud-provider custom-cloudstack --master localhost
+./cloudstack-ccm --cloud-provider external-cloudstack --cloud-config cloud.config --master localhost
 ```
diff --git a/cloudstack.go b/cloudstack.go
index 5030186..736d4b9 100644
--- a/cloudstack.go
+++ b/cloudstack.go
@@ -1,93 +1,260 @@
 /*
- * Copyright 2018 SWISS TXT AG
- *
- * Licensed 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
- *
- *     https://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.
- */
+Copyright 2016 The Kubernetes Authors.
+
+Licensed 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 cloudstack
 
 import (
+	"context"
+	"errors"
+	"fmt"
 	"io"
+	"os"
+	"path/filepath"
 
-	"k8s.io/klog"
-
+	"github.com/kardianos/osext"
+	"github.com/xanzy/go-cloudstack/cloudstack"
+	"gopkg.in/gcfg.v1"
+	"k8s.io/apimachinery/pkg/types"
 	cloudprovider "k8s.io/cloud-provider"
+	"k8s.io/klog"
 )
 
-type CloudstackProvider struct {
+// ProviderName is the name of this cloud provider.
+const ProviderName = "external-cloudstack"
+
+// CSConfig wraps the config for the CloudStack cloud provider.
+type CSConfig struct {
+	Global struct {
+		APIURL      string `gcfg:"api-url"`
+		APIKey      string `gcfg:"api-key"`
+		SecretKey   string `gcfg:"secret-key"`
+		SSLNoVerify bool   `gcfg:"ssl-no-verify"`
+		ProjectID   string `gcfg:"project-id"`
+		Zone        string `gcfg:"zone"`
+	}
 }
 
-const (
-	cloudstackProviderName string = "custom-cloudstack"
-)
+// CSCloud is an implementation of Interface for CloudStack.
+type CSCloud struct {
+	client    *cloudstack.CloudStackClient
+	metadata  *metadata
+	projectID string // If non-"", all resources will be created within this project
+	zone      string
+}
 
 func init() {
-	cloudprovider.RegisterCloudProvider(cloudstackProviderName, func(r io.Reader) (cloudprovider.Interface, error) {
-		klog.Infof("Creating Cloudstack provider from config %v", r)
-		return &CloudstackProvider{}, nil
+	cloudprovider.RegisterCloudProvider(ProviderName, func(config io.Reader) (cloudprovider.Interface, error) {
+		cfg, err := readConfig(config)
+		if err != nil {
+			return nil, err
+		}
+
+		return newCSCloud(cfg)
 	})
 }
 
-// Initialize provides the cloud with a kubernetes client builder and may spawn goroutines
-// to perform housekeeping or run custom controllers specific to the cloud provider.
-// Any tasks started here should be cleaned up when the stop channel closes.
-func (p *CloudstackProvider) Initialize(clientBuilder cloudprovider.ControllerClientBuilder, stop <-chan struct{}) {
-	klog.Infof("Initializing Cloudstack provider")
-	// initialize
+func readConfig(config io.Reader) (*CSConfig, error) {
+	cfg := &CSConfig{}
 
-	go func() {
-		<-stop
-		// cleanup
+	if config == nil {
+		return cfg, nil
+	}
 
-	}()
+	if err := gcfg.ReadInto(cfg, config); err != nil {
+		return nil, fmt.Errorf("could not parse cloud provider config: %v", err)
+	}
+
+	return cfg, nil
 }
 
-// LoadBalancer returns a balancer interface. Also returns true if the interface is supported, false otherwise.
-func (p *CloudstackProvider) LoadBalancer() (cloudprovider.LoadBalancer, bool) {
-	klog.Infof("Getting LoadBalancers from Cloudstack provider")
+// newCSCloud creates a new instance of CSCloud.
+func newCSCloud(cfg *CSConfig) (*CSCloud, error) {
+	cs := &CSCloud{
+		projectID: cfg.Global.ProjectID,
+		zone:      cfg.Global.Zone,
+	}
+
+	exe, err := osext.Executable()
+	if err != nil {
+		return nil, fmt.Errorf("cloud not find the service executable: %v", err)
+	}
+
+	// When running the kubelet service it's fine to not specify a config file (or only a
+	// partial config file) as all needed info can be retrieved anonymously using metadata.
+	if filepath.Base(exe) == "kubelet" || filepath.Base(exe) == "kubelet.exe" {
+		// In CloudStack your metadata is always served by the DHCP server.
+		dhcpServer, err := findDHCPServer()
+		if err == nil {
+			klog.V(4).Infof("Found metadata server: %v", dhcpServer)
+			cs.metadata = &metadata{dhcpServer: dhcpServer, zone: cs.zone}
+		} else {
+			klog.Errorf("Error searching metadata server: %v", err)
+		}
+	}
+
+	if cfg.Global.APIURL != "" && cfg.Global.APIKey != "" && cfg.Global.SecretKey != "" {
+		cs.client = cloudstack.NewAsyncClient(cfg.Global.APIURL, cfg.Global.APIKey, cfg.Global.SecretKey, !cfg.Global.SSLNoVerify)
+	}
+
+	if cs.client == nil {
+		if cs.metadata != nil {
+			klog.V(2).Infof("No API URL, key and secret are provided, so only using metadata!")
+		} else {
+			return nil, errors.New("no cloud provider config given")
+		}
+	}
+
+	return cs, nil
+}
+
+// Initialize passes a Kubernetes clientBuilder interface to the cloud provider
+func (cs *CSCloud) Initialize(clientBuilder cloudprovider.ControllerClientBuilder, stop <-chan struct{}) {
+}
+
+// LoadBalancer returns an implementation of LoadBalancer for CloudStack.
+func (cs *CSCloud) LoadBalancer() (cloudprovider.LoadBalancer, bool) {
+	if cs.client == nil {
+		return nil, false
+	}
+
+	return cs, true
+}
+
+// Instances returns an implementation of Instances for CloudStack.
+func (cs *CSCloud) Instances() (cloudprovider.Instances, bool) {
+	if cs.metadata != nil {
+		return cs.metadata, true
+	}
+
+	if cs.client == nil {
+		return nil, false
+	}
+
+	return cs, true
+}
+
+// Zones returns an implementation of Zones for CloudStack.
+func (cs *CSCloud) Zones() (cloudprovider.Zones, bool) {
+	if cs.metadata != nil {
+		return cs.metadata, true
+	}
+
+	if cs.client == nil {
+		return nil, false
+	}
+
+	return cs, true
+}
+
+// Clusters returns an implementation of Clusters for CloudStack.
+func (cs *CSCloud) Clusters() (cloudprovider.Clusters, bool) {
+	if cs.client == nil {
+		return nil, false
+	}
+
 	return nil, false
 }
 
-// Instances returns an instances interface. Also returns true if the interface is supported, false otherwise.
-func (p *CloudstackProvider) Instances() (cloudprovider.Instances, bool) {
-	klog.Infof("Getting Instances from Cloudstack provider")
-	return nil, false
-}
+// Routes returns an implementation of Routes for CloudStack.
+func (cs *CSCloud) Routes() (cloudprovider.Routes, bool) {
+	if cs.client == nil {
+		return nil, false
+	}
 
-// Zones returns a zones interface. Also returns true if the interface is supported, false otherwise.
-func (p *CloudstackProvider) Zones() (cloudprovider.Zones, bool) {
-	klog.Infof("Getting Zones from Cloudstack provider")
-	return nil, false
-}
-
-// Clusters returns a clusters interface.  Also returns true if the interface is supported, false otherwise.
-func (p *CloudstackProvider) Clusters() (cloudprovider.Clusters, bool) {
-	klog.Infof("Getting Clusters from Cloudstack provider")
-	return nil, false
-}
-
-// Routes returns a routes interface along with whether the interface is supported.
-func (p *CloudstackProvider) Routes() (cloudprovider.Routes, bool) {
-	klog.Infof("Getting Routes from Cloudstack provider")
 	return nil, false
 }
 
 // ProviderName returns the cloud provider ID.
-func (p *CloudstackProvider) ProviderName() string {
-	return cloudstackProviderName
+func (cs *CSCloud) ProviderName() string {
+	return ProviderName
 }
 
-// HasClusterID returns true if a ClusterID is required and set
-func (p *CloudstackProvider) HasClusterID() bool {
-	return false
+// HasClusterID returns true if the cluster has a clusterID
+func (cs *CSCloud) HasClusterID() bool {
+	return true
+}
+
+// GetZone returns the Zone containing the region that the program is running in.
+func (cs *CSCloud) GetZone(ctx context.Context) (cloudprovider.Zone, error) {
+	zone := cloudprovider.Zone{}
+
+	if cs.zone == "" {
+		hostname, err := os.Hostname()
+		if err != nil {
+			return zone, fmt.Errorf("failed to get hostname for retrieving the zone: %v", err)
+		}
+
+		instance, count, err := cs.client.VirtualMachine.GetVirtualMachineByName(hostname)
+		if err != nil {
+			if count == 0 {
+				return zone, fmt.Errorf("could not find instance for retrieving the zone: %v", err)
+			}
+			return zone, fmt.Errorf("error getting instance for retrieving the zone: %v", err)
+		}
+
+		cs.zone = instance.Zonename
+	}
+
+	klog.V(2).Infof("Current zone is %v", cs.zone)
+	zone.FailureDomain = cs.zone
+	zone.Region = cs.zone
+
+	return zone, nil
+}
+
+// GetZoneByProviderID returns the Zone, found by using the provider ID.
+func (cs *CSCloud) GetZoneByProviderID(ctx context.Context, providerID string) (cloudprovider.Zone, error) {
+	zone := cloudprovider.Zone{}
+
+	instance, count, err := cs.client.VirtualMachine.GetVirtualMachineByID(
+		providerID,
+		cloudstack.WithProject(cs.projectID),
+	)
+	if err != nil {
+		if count == 0 {
+			return zone, fmt.Errorf("could not find node by ID: %v", providerID)
+		}
+		return zone, fmt.Errorf("error retrieving zone: %v", err)
+	}
+
+	klog.V(2).Infof("Current zone is %v", cs.zone)
+	zone.FailureDomain = instance.Zonename
+	zone.Region = instance.Zonename
+
+	return zone, nil
+}
+
+// GetZoneByNodeName returns the Zone, found by using the node name.
+func (cs *CSCloud) GetZoneByNodeName(ctx context.Context, nodeName types.NodeName) (cloudprovider.Zone, error) {
+	zone := cloudprovider.Zone{}
+
+	instance, count, err := cs.client.VirtualMachine.GetVirtualMachineByName(
+		string(nodeName),
+		cloudstack.WithProject(cs.projectID),
+	)
+	if err != nil {
+		if count == 0 {
+			return zone, fmt.Errorf("could not find node: %v", nodeName)
+		}
+		return zone, fmt.Errorf("error retrieving zone: %v", err)
+	}
+
+	klog.V(2).Infof("Current zone is %v", cs.zone)
+	zone.FailureDomain = instance.Zonename
+	zone.Region = instance.Zonename
+
+	return zone, nil
 }
diff --git a/cloudstack_instances.go b/cloudstack_instances.go
new file mode 100644
index 0000000..55a81bd
--- /dev/null
+++ b/cloudstack_instances.go
@@ -0,0 +1,164 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+Licensed 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 cloudstack
+
+import (
+	"context"
+	"errors"
+	"fmt"
+
+	"github.com/xanzy/go-cloudstack/cloudstack"
+	"k8s.io/api/core/v1"
+	"k8s.io/apimachinery/pkg/types"
+	cloudprovider "k8s.io/cloud-provider"
+	"k8s.io/klog"
+)
+
+// NodeAddresses returns the addresses of the specified instance.
+func (cs *CSCloud) NodeAddresses(ctx context.Context, name types.NodeName) ([]v1.NodeAddress, error) {
+	instance, count, err := cs.client.VirtualMachine.GetVirtualMachineByName(
+		string(name),
+		cloudstack.WithProject(cs.projectID),
+	)
+	if err != nil {
+		if count == 0 {
+			return nil, cloudprovider.InstanceNotFound
+		}
+		return nil, fmt.Errorf("error retrieving node addresses: %v", err)
+	}
+
+	return cs.nodeAddresses(instance)
+}
+
+// NodeAddressesByProviderID returns the addresses of the specified instance.
+func (cs *CSCloud) NodeAddressesByProviderID(ctx context.Context, providerID string) ([]v1.NodeAddress, error) {
+	instance, count, err := cs.client.VirtualMachine.GetVirtualMachineByID(
+		providerID,
+		cloudstack.WithProject(cs.projectID),
+	)
+	if err != nil {
+		if count == 0 {
+			return nil, cloudprovider.InstanceNotFound
+		}
+		return nil, fmt.Errorf("error retrieving node addresses: %v", err)
+	}
+
+	return cs.nodeAddresses(instance)
+}
+
+func (cs *CSCloud) nodeAddresses(instance *cloudstack.VirtualMachine) ([]v1.NodeAddress, error) {
+	if len(instance.Nic) == 0 {
+		return nil, errors.New("instance does not have an internal IP")
+	}
+
+	addresses := []v1.NodeAddress{
+		{Type: v1.NodeInternalIP, Address: instance.Nic[0].Ipaddress},
+	}
+
+	if instance.Hostname != "" {
+		addresses = append(addresses, v1.NodeAddress{Type: v1.NodeHostName, Address: instance.Hostname})
+	}
+
+	if instance.Publicip != "" {
+		addresses = append(addresses, v1.NodeAddress{Type: v1.NodeExternalIP, Address: instance.Publicip})
+	} else {
+		// Since there is no sane way to determine the external IP if the host isn't
+		// using static NAT, we will just fire a log message and omit the external IP.
+		klog.V(4).Infof("Could not determine the public IP of host %v (%v)", instance.Name, instance.Id)
+	}
+
+	return addresses, nil
+}
+
+// InstanceID returns the cloud provider ID of the specified instance.
+func (cs *CSCloud) InstanceID(ctx context.Context, name types.NodeName) (string, error) {
+	instance, count, err := cs.client.VirtualMachine.GetVirtualMachineByName(
+		string(name),
+		cloudstack.WithProject(cs.projectID),
+	)
+	if err != nil {
+		if count == 0 {
+			return "", cloudprovider.InstanceNotFound
+		}
+		return "", fmt.Errorf("error retrieving instance ID: %v", err)
+	}
+
+	return instance.Id, nil
+}
+
+// InstanceType returns the type of the specified instance.
+func (cs *CSCloud) InstanceType(ctx context.Context, name types.NodeName) (string, error) {
+	instance, count, err := cs.client.VirtualMachine.GetVirtualMachineByName(
+		string(name),
+		cloudstack.WithProject(cs.projectID),
+	)
+	if err != nil {
+		if count == 0 {
+			return "", cloudprovider.InstanceNotFound
+		}
+		return "", fmt.Errorf("error retrieving instance type: %v", err)
+	}
+
+	return instance.Serviceofferingname, nil
+}
+
+// InstanceTypeByProviderID returns the type of the specified instance.
+func (cs *CSCloud) InstanceTypeByProviderID(ctx context.Context, providerID string) (string, error) {
+	instance, count, err := cs.client.VirtualMachine.GetVirtualMachineByID(
+		providerID,
+		cloudstack.WithProject(cs.projectID),
+	)
+	if err != nil {
+		if count == 0 {
+			return "", cloudprovider.InstanceNotFound
+		}
+		return "", fmt.Errorf("error retrieving instance type: %v", err)
+	}
+
+	return instance.Serviceofferingname, nil
+}
+
+// AddSSHKeyToAllInstances is currently not implemented.
+func (cs *CSCloud) AddSSHKeyToAllInstances(ctx context.Context, user string, keyData []byte) error {
+	return cloudprovider.NotImplemented
+}
+
+// CurrentNodeName returns the name of the node we are currently running on.
+func (cs *CSCloud) CurrentNodeName(ctx context.Context, hostname string) (types.NodeName, error) {
+	return types.NodeName(hostname), nil
+}
+
+// InstanceExistsByProviderID returns if the instance still exists.
+func (cs *CSCloud) InstanceExistsByProviderID(ctx context.Context, providerID string) (bool, error) {
+	_, count, err := cs.client.VirtualMachine.GetVirtualMachineByID(
+		providerID,
+		cloudstack.WithProject(cs.projectID),
+	)
+	if err != nil {
+		if count == 0 {
+			return false, nil
+		}
+		return false, fmt.Errorf("error retrieving instance: %v", err)
+	}
+
+	return true, nil
+}
+
+// InstanceShutdownByProviderID returns true if the instance is in safe state to detach volumes
+func (cs *CSCloud) InstanceShutdownByProviderID(ctx context.Context, providerID string) (bool, error) {
+	return false, cloudprovider.NotImplemented
+}
diff --git a/cloudstack_loadbalancer.go b/cloudstack_loadbalancer.go
new file mode 100644
index 0000000..64971d0
--- /dev/null
+++ b/cloudstack_loadbalancer.go
@@ -0,0 +1,549 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+Licensed 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 cloudstack
+
+import (
+	"context"
+	"fmt"
+	"strconv"
+
+	"github.com/xanzy/go-cloudstack/cloudstack"
+	"k8s.io/klog"
+
+	"k8s.io/api/core/v1"
+	cloudprovider "k8s.io/cloud-provider"
+)
+
+type loadBalancer struct {
+	*cloudstack.CloudStackClient
+
+	name      string
+	algorithm string
+	hostIDs   []string
+	ipAddr    string
+	ipAddrID  string
+	networkID string
+	projectID string
+	rules     map[string]*cloudstack.LoadBalancerRule
+}
+
+// GetLoadBalancer returns whether the specified load balancer exists, and if so, what its status is.
+func (cs *CSCloud) GetLoadBalancer(ctx context.Context, clusterName string, service *v1.Service) (*v1.LoadBalancerStatus, bool, error) {
+	klog.V(4).Infof("GetLoadBalancer(%v, %v, %v)", clusterName, service.Namespace, service.Name)
+
+	// Get the load balancer details and existing rules.
+	lb, err := cs.getLoadBalancer(service)
+	if err != nil {
+		return nil, false, err
+	}
+
+	// If we don't have any rules, the load balancer does not exist.
+	if len(lb.rules) == 0 {
+		return nil, false, nil
+	}
+
+	klog.V(4).Infof("Found a load balancer associated with IP %v", lb.ipAddr)
+
+	status := &v1.LoadBalancerStatus{}
+	status.Ingress = append(status.Ingress, v1.LoadBalancerIngress{IP: lb.ipAddr})
+
+	return status, true, nil
+}
+
+// EnsureLoadBalancer creates a new load balancer, or updates the existing one. Returns the status of the balancer.
+func (cs *CSCloud) EnsureLoadBalancer(ctx context.Context, clusterName string, service *v1.Service, nodes []*v1.Node) (status *v1.LoadBalancerStatus, err error) {
+	klog.V(4).Infof("EnsureLoadBalancer(%v, %v, %v, %v, %v, %v)", clusterName, service.Namespace, service.Name, service.Spec.LoadBalancerIP, service.Spec.Ports, nodes)
+
+	if len(service.Spec.Ports) == 0 {
+		return nil, fmt.Errorf("requested load balancer with no ports")
+	}
+
+	// Get the load balancer details and existing rules.
+	lb, err := cs.getLoadBalancer(service)
+	if err != nil {
+		return nil, err
+	}
+
+	// Set the load balancer algorithm.
+	switch service.Spec.SessionAffinity {
+	case v1.ServiceAffinityNone:
+		lb.algorithm = "roundrobin"
+	case v1.ServiceAffinityClientIP:
+		lb.algorithm = "source"
+	default:
+		return nil, fmt.Errorf("unsupported load balancer affinity: %v", service.Spec.SessionAffinity)
+	}
+
+	// Verify that all the hosts belong to the same network, and retrieve their ID's.
+	lb.hostIDs, lb.networkID, err = cs.verifyHosts(nodes)
+	if err != nil {
+		return nil, err
+	}
+
+	if !lb.hasLoadBalancerIP() {
+		// Create or retrieve the load balancer IP.
+		if err := lb.getLoadBalancerIP(service.Spec.LoadBalancerIP); err != nil {
+			return nil, err
+		}
+
+		if lb.ipAddr != "" && lb.ipAddr != service.Spec.LoadBalancerIP {
+			defer func(lb *loadBalancer) {
+				if err != nil {
+					if err := lb.releaseLoadBalancerIP(); err != nil {
+						klog.Errorf(err.Error())
+					}
+				}
+			}(lb)
+		}
+	}
+
+	klog.V(4).Infof("Load balancer %v is associated with IP %v", lb.name, lb.ipAddr)
+
+	for _, port := range service.Spec.Ports {
+		// All ports have their own load balancer rule, so add the port to lbName to keep the names unique.
+		lbRuleName := fmt.Sprintf("%s-%d", lb.name, port.Port)
+
+		// If the load balancer rule exists and is up-to-date, we move on to the next rule.
+		exists, needsUpdate, err := lb.checkLoadBalancerRule(lbRuleName, port)
+		if err != nil {
+			return nil, err
+		}
+		if exists && !needsUpdate {
+			klog.V(4).Infof("Load balancer rule %v is up-to-date", lbRuleName)
+			// Delete the rule from the map, to prevent it being deleted.
+			delete(lb.rules, lbRuleName)
+			continue
+		}
+
+		if needsUpdate {
+			klog.V(4).Infof("Updating load balancer rule: %v", lbRuleName)
+			if err := lb.updateLoadBalancerRule(lbRuleName); err != nil {
+				return nil, err
+			}
+			// Delete the rule from the map, to prevent it being deleted.
+			delete(lb.rules, lbRuleName)
+			continue
+		}
+
+		klog.V(4).Infof("Creating load balancer rule: %v", lbRuleName)
+		lbRule, err := lb.createLoadBalancerRule(lbRuleName, port)
+		if err != nil {
+			return nil, err
+		}
+
+		klog.V(4).Infof("Assigning hosts (%v) to load balancer rule: %v", lb.hostIDs, lbRuleName)
+		if err = lb.assignHostsToRule(lbRule, lb.hostIDs); err != nil {
+			return nil, err
+		}
+
+	}
+
+	// Cleanup any rules that are now still in the rules map, as they are no longer needed.
+	for _, lbRule := range lb.rules {
+		klog.V(4).Infof("Deleting obsolete load balancer rule: %v", lbRule.Name)
+		if err := lb.deleteLoadBalancerRule(lbRule); err != nil {
+			return nil, err
+		}
+	}
+
+	status = &v1.LoadBalancerStatus{}
+	status.Ingress = []v1.LoadBalancerIngress{{IP: lb.ipAddr}}
+
+	return status, nil
+}
+
+// UpdateLoadBalancer updates hosts under the specified load balancer.
+func (cs *CSCloud) UpdateLoadBalancer(ctx context.Context, clusterName string, service *v1.Service, nodes []*v1.Node) error {
+	klog.V(4).Infof("UpdateLoadBalancer(%v, %v, %v, %v)", clusterName, service.Namespace, service.Name, nodes)
+
+	// Get the load balancer details and existing rules.
+	lb, err := cs.getLoadBalancer(service)
+	if err != nil {
+		return err
+	}
+
+	// Verify that all the hosts belong to the same network, and retrieve their ID's.
+	lb.hostIDs, _, err = cs.verifyHosts(nodes)
+	if err != nil {
+		return err
+	}
+
+	for _, lbRule := range lb.rules {
+		p := lb.LoadBalancer.NewListLoadBalancerRuleInstancesParams(lbRule.Id)
+
+		// Retrieve all VMs currently associated to this load balancer rule.
+		l, err := lb.LoadBalancer.ListLoadBalancerRuleInstances(p)
+		if err != nil {
+			return fmt.Errorf("error retrieving associated instances: %v", err)
+		}
+
+		assign, remove := symmetricDifference(lb.hostIDs, l.LoadBalancerRuleInstances)
+
+		if len(assign) > 0 {
+			klog.V(4).Infof("Assigning new hosts (%v) to load balancer rule: %v", assign, lbRule.Name)
+			if err := lb.assignHostsToRule(lbRule, assign); err != nil {
+				return err
+			}
+		}
+
+		if len(remove) > 0 {
+			klog.V(4).Infof("Removing old hosts (%v) from load balancer rule: %v", assign, lbRule.Name)
+			if err := lb.removeHostsFromRule(lbRule, remove); err != nil {
+				return err
+			}
+		}
+	}
+
+	return nil
+}
+
+// EnsureLoadBalancerDeleted deletes the specified load balancer if it exists, returning
+// nil if the load balancer specified either didn't exist or was successfully deleted.
+func (cs *CSCloud) EnsureLoadBalancerDeleted(ctx context.Context, clusterName string, service *v1.Service) error {
+	klog.V(4).Infof("EnsureLoadBalancerDeleted(%v, %v, %v)", clusterName, service.Namespace, service.Name)
+
+	// Get the load balancer details and existing rules.
+	lb, err := cs.getLoadBalancer(service)
+	if err != nil {
+		return err
+	}
+
+	for _, lbRule := range lb.rules {
+		klog.V(4).Infof("Deleting load balancer rule: %v", lbRule.Name)
+		if err := lb.deleteLoadBalancerRule(lbRule); err != nil {
+			return err
+		}
+	}
+
+	if lb.ipAddr != "" && lb.ipAddr != service.Spec.LoadBalancerIP {
+		klog.V(4).Infof("Releasing load balancer IP: %v", lb.ipAddr)
+		if err := lb.releaseLoadBalancerIP(); err != nil {
+			return err
+		}
+	}
+
+	return nil
+}
+
+// GetLoadBalancerName retrieves the name of the LoadBalancer.
+func (cs *CSCloud) GetLoadBalancerName(ctx context.Context, clusterName string, service *v1.Service) string {
+	return cloudprovider.DefaultLoadBalancerName(service)
+}
+
+// getLoadBalancer retrieves the IP address and ID and all the existing rules it can find.
+func (cs *CSCloud) getLoadBalancer(service *v1.Service) (*loadBalancer, error) {
+	lb := &loadBalancer{
+		CloudStackClient: cs.client,
+		name:             cs.GetLoadBalancerName(context.TODO(), "", service),
+		projectID:        cs.projectID,
+		rules:            make(map[string]*cloudstack.LoadBalancerRule),
+	}
+
+	p := cs.client.LoadBalancer.NewListLoadBalancerRulesParams()
+	p.SetKeyword(lb.name)
+	p.SetListall(true)
+
+	if cs.projectID != "" {
+		p.SetProjectid(cs.projectID)
+	}
+
+	l, err := cs.client.LoadBalancer.ListLoadBalancerRules(p)
+	if err != nil {
+		return nil, fmt.Errorf("error retrieving load balancer rules: %v", err)
+	}
+
+	for _, lbRule := range l.LoadBalancerRules {
+		lb.rules[lbRule.Name] = lbRule
+
+		if lb.ipAddr != "" && lb.ipAddr != lbRule.Publicip {
+			klog.Warningf("Load balancer for service %v/%v has rules associated with different IP's: %v, %v", service.Namespace, service.Name, lb.ipAddr, lbRule.Publicip)
+		}
+
+		lb.ipAddr = lbRule.Publicip
+		lb.ipAddrID = lbRule.Publicipid
+	}
+
+	klog.V(4).Infof("Load balancer %v contains %d rule(s)", lb.name, len(lb.rules))
+
+	return lb, nil
+}
+
+// verifyHosts verifies if all hosts belong to the same network, and returns the host ID's and network ID.
+func (cs *CSCloud) verifyHosts(nodes []*v1.Node) ([]string, string, error) {
+	hostNames := map[string]bool{}
+	for _, node := range nodes {
+		hostNames[node.Name] = true
+	}
+
+	p := cs.client.VirtualMachine.NewListVirtualMachinesParams()
+	p.SetListall(true)
+
+	if cs.projectID != "" {
+		p.SetProjectid(cs.projectID)
+	}
+
+	l, err := cs.client.VirtualMachine.ListVirtualMachines(p)
+	if err != nil {
+		return nil, "", fmt.Errorf("error retrieving list of hosts: %v", err)
+	}
+
+	var hostIDs []string
+	var networkID string
+
+	// Check if the virtual machine is in the hosts slice, then add the corresponding ID.
+	for _, vm := range l.VirtualMachines {
+		if hostNames[vm.Name] {
+			if networkID != "" && networkID != vm.Nic[0].Networkid {
+				return nil, "", fmt.Errorf("found hosts that belong to different networks")
+			}
+
+			networkID = vm.Nic[0].Networkid
+			hostIDs = append(hostIDs, vm.Id)
+		}
+	}
+
+	return hostIDs, networkID, nil
+}
+
+// hasLoadBalancerIP returns true if we have a load balancer address and ID.
+func (lb *loadBalancer) hasLoadBalancerIP() bool {
+	return lb.ipAddr != "" && lb.ipAddrID != ""
+}
+
+// getLoadBalancerIP retieves an existing IP or associates a new IP.
+func (lb *loadBalancer) getLoadBalancerIP(loadBalancerIP string) error {
+	if loadBalancerIP != "" {
+		return lb.getPublicIPAddress(loadBalancerIP)
+	}
+
+	return lb.associatePublicIPAddress()
+}
+
+// getPublicIPAddressID retrieves the ID of the given IP, and sets the address and it's ID.
+func (lb *loadBalancer) getPublicIPAddress(loadBalancerIP string) error {
+	klog.V(4).Infof("Retrieve load balancer IP details: %v", loadBalancerIP)
+
+	p := lb.Address.NewListPublicIpAddressesParams()
+	p.SetIpaddress(loadBalancerIP)
+	p.SetListall(true)
+
+	if lb.projectID != "" {
+		p.SetProjectid(lb.projectID)
+	}
+
+	l, err := lb.Address.ListPublicIpAddresses(p)
+	if err != nil {
+		return fmt.Errorf("error retrieving IP address: %v", err)
+	}
+
+	if l.Count != 1 {
+		return fmt.Errorf("could not find IP address %v", loadBalancerIP)
+	}
+
+	lb.ipAddr = l.PublicIpAddresses[0].Ipaddress
+	lb.ipAddrID = l.PublicIpAddresses[0].Id
+
+	return nil
+}
+
+// associatePublicIPAddress associates a new IP and sets the address and it's ID.
+func (lb *loadBalancer) associatePublicIPAddress() error {
+	klog.V(4).Infof("Allocate new IP for load balancer: %v", lb.name)
+	// If a network belongs to a VPC, the IP address needs to be associated with
+	// the VPC instead of with the network.
+	network, count, err := lb.Network.GetNetworkByID(lb.networkID, cloudstack.WithProject(lb.projectID))
+	if err != nil {
+		if count == 0 {
+			return fmt.Errorf("could not find network %v", lb.networkID)
+		}
+		return fmt.Errorf("error retrieving network: %v", err)
+	}
+
+	p := lb.Address.NewAssociateIpAddressParams()
+
+	if network.Vpcid != "" {
+		p.SetVpcid(network.Vpcid)
+	} else {
+		p.SetNetworkid(lb.networkID)
+	}
+
+	if lb.projectID != "" {
+		p.SetProjectid(lb.projectID)
+	}
+
+	// Associate a new IP address
+	r, err := lb.Address.AssociateIpAddress(p)
+	if err != nil {
+		return fmt.Errorf("error associating new IP address: %v", err)
+	}
+
+	lb.ipAddr = r.Ipaddress
+	lb.ipAddrID = r.Id
+
+	return nil
+}
+
+// releasePublicIPAddress releases an associated IP.
+func (lb *loadBalancer) releaseLoadBalancerIP() error {
+	p := lb.Address.NewDisassociateIpAddressParams(lb.ipAddrID)
+
+	if _, err := lb.Address.DisassociateIpAddress(p); err != nil {
+		return fmt.Errorf("error releasing load balancer IP %v: %v", lb.ipAddr, err)
+	}
+
+	return nil
+}
+
+// checkLoadBalancerRule checks if the rule already exists and if it does, if it can be updated. If
+// it does exist but cannot be updated, it will delete the existing rule so it can be created again.
+func (lb *loadBalancer) checkLoadBalancerRule(lbRuleName string, port v1.ServicePort) (bool, bool, error) {
+	lbRule, ok := lb.rules[lbRuleName]
+	if !ok {
+		return false, false, nil
+	}
+
+	// Check if any of the values we cannot update (those that require a new load balancer rule) are changed.
+	if lbRule.Publicip == lb.ipAddr && lbRule.Privateport == strconv.Itoa(int(port.NodePort)) && lbRule.Publicport == strconv.Itoa(int(port.Port)) {
+		return true, lbRule.Algorithm != lb.algorithm, nil
+	}
+
+	// Delete the load balancer rule so we can create a new one using the new values.
+	if err := lb.deleteLoadBalancerRule(lbRule); err != nil {
+		return false, false, err
+	}
+
+	return false, false, nil
+}
+
+// updateLoadBalancerRule updates a load balancer rule.
+func (lb *loadBalancer) updateLoadBalancerRule(lbRuleName string) error {
+	lbRule := lb.rules[lbRuleName]
+
+	p := lb.LoadBalancer.NewUpdateLoadBalancerRuleParams(lbRule.Id)
+	p.SetAlgorithm(lb.algorithm)
+
+	_, err := lb.LoadBalancer.UpdateLoadBalancerRule(p)
+	return err
+}
+
+// createLoadBalancerRule creates a new load balancer rule and returns it's ID.
+func (lb *loadBalancer) createLoadBalancerRule(lbRuleName string, port v1.ServicePort) (*cloudstack.LoadBalancerRule, error) {
+	p := lb.LoadBalancer.NewCreateLoadBalancerRuleParams(
+		lb.algorithm,
+		lbRuleName,
+		int(port.NodePort),
+		int(port.Port),
+	)
+
+	p.SetNetworkid(lb.networkID)
+	p.SetPublicipid(lb.ipAddrID)
+
+	switch port.Protocol {
+	case v1.ProtocolTCP:
+		p.SetProtocol("TCP")
+	case v1.ProtocolUDP:
+		p.SetProtocol("UDP")
+	default:
+		return nil, fmt.Errorf("unsupported load balancer protocol: %v", port.Protocol)
+	}
+
+	// Do not create corresponding firewall rule.
+	p.SetOpenfirewall(false)
+
+	// Create a new load balancer rule.
+	r, err := lb.LoadBalancer.CreateLoadBalancerRule(p)
+	if err != nil {
+		return nil, fmt.Errorf("error creating load balancer rule %v: %v", lbRuleName, err)
+	}
+
+	lbRule := &cloudstack.LoadBalancerRule{
+		Id:          r.Id,
+		Algorithm:   r.Algorithm,
+		Cidrlist:    r.Cidrlist,
+		Name:        r.Name,
+		Networkid:   r.Networkid,
+		Privateport: r.Privateport,
+		Publicport:  r.Publicport,
+		Publicip:    r.Publicip,
+		Publicipid:  r.Publicipid,
+	}
+
+	return lbRule, nil
+}
+
+// deleteLoadBalancerRule deletes a load balancer rule.
+func (lb *loadBalancer) deleteLoadBalancerRule(lbRule *cloudstack.LoadBalancerRule) error {
+	p := lb.LoadBalancer.NewDeleteLoadBalancerRuleParams(lbRule.Id)
+
+	if _, err := lb.LoadBalancer.DeleteLoadBalancerRule(p); err != nil {
+		return fmt.Errorf("error deleting load balancer rule %v: %v", lbRule.Name, err)
+	}
+
+	// Delete the rule from the map as it no longer exists
+	delete(lb.rules, lbRule.Name)
+
+	return nil
+}
+
+// assignHostsToRule assigns hosts to a load balancer rule.
+func (lb *loadBalancer) assignHostsToRule(lbRule *cloudstack.LoadBalancerRule, hostIDs []string) error {
+	p := lb.LoadBalancer.NewAssignToLoadBalancerRuleParams(lbRule.Id)
+	p.SetVirtualmachineids(hostIDs)
+
+	if _, err := lb.LoadBalancer.AssignToLoadBalancerRule(p); err != nil {
+		return fmt.Errorf("error assigning hosts to load balancer rule %v: %v", lbRule.Name, err)
+	}
+
+	return nil
+}
+
+// removeHostsFromRule removes hosts from a load balancer rule.
+func (lb *loadBalancer) removeHostsFromRule(lbRule *cloudstack.LoadBalancerRule, hostIDs []string) error {
+	p := lb.LoadBalancer.NewRemoveFromLoadBalancerRuleParams(lbRule.Id)
+	p.SetVirtualmachineids(hostIDs)
+
+	if _, err := lb.LoadBalancer.RemoveFromLoadBalancerRule(p); err != nil {
+		return fmt.Errorf("error removing hosts from load balancer rule %v: %v", lbRule.Name, err)
+	}
+
+	return nil
+}
+
+// symmetricDifference returns the symmetric difference between the old (existing) and new (wanted) host ID's.
+func symmetricDifference(hostIDs []string, lbInstances []*cloudstack.VirtualMachine) ([]string, []string) {
+	new := make(map[string]bool)
+	for _, hostID := range hostIDs {
+		new[hostID] = true
+	}
+
+	var remove []string
+	for _, instance := range lbInstances {
+		if new[instance.Id] {
+			delete(new, instance.Id)
+			continue
+		}
+
+		remove = append(remove, instance.Id)
+	}
+
+	var assign []string
+	for hostID := range new {
+		assign = append(assign, hostID)
+	}
+
+	return assign, remove
+}
diff --git a/cloudstack_test.go b/cloudstack_test.go
new file mode 100644
index 0000000..2a7b3a2
--- /dev/null
+++ b/cloudstack_test.go
@@ -0,0 +1,118 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+Licensed 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 cloudstack
+
+import (
+	"context"
+	"os"
+	"strconv"
+	"strings"
+	"testing"
+
+	"k8s.io/api/core/v1"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+)
+
+const testClusterName = "testCluster"
+
+func TestReadConfig(t *testing.T) {
+	_, err := readConfig(nil)
+	if err != nil {
+		t.Fatalf("Should not return an error when no config is provided: %v", err)
+	}
+
+	cfg, err := readConfig(strings.NewReader(`
+ [Global]
+ api-url				= https://cloudstack.url
+ api-key				= a-valid-api-key
+ secret-key			= a-valid-secret-key
+ ssl-no-verify	= true
+ project-id			= a-valid-project-id
+ `))
+	if err != nil {
+		t.Fatalf("Should succeed when a valid config is provided: %v", err)
+	}
+
+	if cfg.Global.APIURL != "https://cloudstack.url" {
+		t.Errorf("incorrect api-url: %s", cfg.Global.APIURL)
+	}
+	if cfg.Global.APIKey != "a-valid-api-key" {
+		t.Errorf("incorrect api-key: %s", cfg.Global.APIKey)
+	}
+	if cfg.Global.SecretKey != "a-valid-secret-key" {
+		t.Errorf("incorrect secret-key: %s", cfg.Global.SecretKey)
+	}
+	if !cfg.Global.SSLNoVerify {
+		t.Errorf("incorrect ssl-no-verify: %t", cfg.Global.SSLNoVerify)
+	}
+}
+
+// This allows acceptance testing against an existing CloudStack environment.
+func configFromEnv() (*CSConfig, bool) {
+	cfg := &CSConfig{}
+
+	cfg.Global.APIURL = os.Getenv("CS_API_URL")
+	cfg.Global.APIKey = os.Getenv("CS_API_KEY")
+	cfg.Global.SecretKey = os.Getenv("CS_SECRET_KEY")
+	cfg.Global.ProjectID = os.Getenv("CS_PROJECT_ID")
+
+	// It is save to ignore the error here. If the input cannot be parsed SSLNoVerify
+	// will still be a bool with its zero value (false) which is the expected default.
+	cfg.Global.SSLNoVerify, _ = strconv.ParseBool(os.Getenv("CS_SSL_NO_VERIFY"))
+
+	// Check if we have the minimum required info to be able to connect to CloudStack.
+	ok := cfg.Global.APIURL != "" && cfg.Global.APIKey != "" && cfg.Global.SecretKey != ""
+
+	return cfg, ok
+}
+
+func TestNewCSCloud(t *testing.T) {
+	cfg, ok := configFromEnv()
+	if !ok {
+		t.Skipf("No config found in environment")
+	}
+
+	_, err := newCSCloud(cfg)
+	if err != nil {
+		t.Fatalf("Failed to construct/authenticate CloudStack: %v", err)
+	}
+}
+
+func TestLoadBalancer(t *testing.T) {
+	cfg, ok := configFromEnv()
+	if !ok {
+		t.Skipf("No config found in environment")
+	}
+
+	cs, err := newCSCloud(cfg)
+	if err != nil {
+		t.Fatalf("Failed to construct/authenticate CloudStack: %v", err)
+	}
+
+	lb, ok := cs.LoadBalancer()
+	if !ok {
+		t.Fatalf("LoadBalancer() returned false")
+	}
+
+	_, exists, err := lb.GetLoadBalancer(context.TODO(), testClusterName, &v1.Service{ObjectMeta: metav1.ObjectMeta{Name: "noexist"}})
+	if err != nil {
+		t.Fatalf("GetLoadBalancer(\"noexist\") returned error: %s", err)
+	}
+	if exists {
+		t.Fatalf("GetLoadBalancer(\"noexist\") returned exists")
+	}
+}
diff --git a/metadata.go b/metadata.go
new file mode 100644
index 0000000..f2deccc
--- /dev/null
+++ b/metadata.go
@@ -0,0 +1,223 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+Licensed 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 cloudstack
+
+import (
+	"context"
+	"errors"
+	"fmt"
+	"io/ioutil"
+	"net"
+	"net/http"
+
+	"github.com/d2g/dhcp4"
+	"k8s.io/api/core/v1"
+	"k8s.io/apimachinery/pkg/types"
+	cloudprovider "k8s.io/cloud-provider"
+	"k8s.io/klog"
+)
+
+type metadata struct {
+	dhcpServer string
+	zone       string
+}
+
+type metadataType string
+
+const (
+	metadataTypeHostname     metadataType = "local-hostname"
+	metadataTypeExternalIP   metadataType = "public-ipv4"
+	metadataTypeInternalIP   metadataType = "local-ipv4"
+	metadataTypeInstanceID   metadataType = "instance-id"
+	metadataTypeInstanceType metadataType = "service-offering"
+	metadataTypeZone         metadataType = "availability-zone"
+)
+
+// NodeAddresses returns the addresses of the specified instance.
+func (m *metadata) NodeAddresses(ctx context.Context, name types.NodeName) ([]v1.NodeAddress, error) {
+	externalIP, err := m.get(metadataTypeExternalIP)
+	if err != nil {
+		return nil, fmt.Errorf("could not get external IP: %v", err)
+	}
+
+	internalIP, err := m.get(metadataTypeInternalIP)
+	if err != nil {
+		return nil, fmt.Errorf("could not get internal IP: %v", err)
+	}
+
+	addresses := []v1.NodeAddress{
+		{Type: v1.NodeExternalIP, Address: externalIP},
+		{Type: v1.NodeInternalIP, Address: internalIP},
+	}
+
+	hostname, err := m.get(metadataTypeHostname)
+	if err != nil {
+		return nil, fmt.Errorf("could not get hostname: %v", err)
+	}
+	if hostname != "" {
+		addresses = append(addresses, v1.NodeAddress{Type: v1.NodeHostName, Address: hostname})
+	}
+
+	return addresses, nil
+}
+
+// NodeAddressesByProviderID returns the addresses of the specified instance.
+func (m *metadata) NodeAddressesByProviderID(ctx context.Context, providerID string) ([]v1.NodeAddress, error) {
+	return nil, errors.New("NodeAddressesByProviderID not implemented")
+}
+
+// InstanceID returns the cloud provider ID of the specified instance.
+func (m *metadata) InstanceID(ctx context.Context, name types.NodeName) (string, error) {
+	instanceID, err := m.get(metadataTypeInstanceID)
+	if err != nil {
+		return "", fmt.Errorf("could not get instance ID: %v", err)
+	}
+
+	zone, err := m.get(metadataTypeZone)
+	if err != nil {
+		return "", fmt.Errorf("could not get zone: %v", err)
+	}
+
+	return "/" + zone + "/" + instanceID, nil
+}
+
+// InstanceType returns the type of the specified instance.
+func (m *metadata) InstanceType(ctx context.Context, name types.NodeName) (string, error) {
+	instanceType, err := m.get(metadataTypeInstanceType)
+	if err != nil {
+		return "", fmt.Errorf("could not get instance type: %v", err)
+	}
+
+	return instanceType, nil
+}
+
+// InstanceTypeByProviderID returns the type of the specified instance.
+func (m *metadata) InstanceTypeByProviderID(ctx context.Context, providerID string) (string, error) {
+	return "", errors.New("InstanceTypeByProviderID not implemented")
+}
+
+// AddSSHKeyToAllInstances is currently not implemented.
+func (m *metadata) AddSSHKeyToAllInstances(ctx context.Context, user string, keyData []byte) error {
+	return cloudprovider.NotImplemented
+}
+
+// CurrentNodeName returns the name of the node we are currently running on.
+func (m *metadata) CurrentNodeName(ctx context.Context, hostname string) (types.NodeName, error) {
+	return types.NodeName(hostname), nil
+}
+
+// InstanceExistsByProviderID returns if the instance still exists.
+func (m *metadata) InstanceExistsByProviderID(ctx context.Context, providerID string) (bool, error) {
+	return false, errors.New("InstanceExistsByProviderID not implemented")
+}
+
+// InstanceShutdownByProviderID returns if the instance is shutdown.
+func (m *metadata) InstanceShutdownByProviderID(ctx context.Context, providerID string) (bool, error) {
+	return false, cloudprovider.NotImplemented
+}
+
+// GetZone returns the Zone containing the region that the program is running in.
+func (m *metadata) GetZone(ctx context.Context) (cloudprovider.Zone, error) {
+	zone := cloudprovider.Zone{}
+
+	if m.zone == "" {
+		zoneName, err := m.get(metadataTypeZone)
+		if err != nil {
+			return zone, fmt.Errorf("could not get zone: %v", err)
+		}
+
+		m.zone = zoneName
+	}
+
+	klog.V(2).Infof("Current zone is %v", zone)
+	zone.FailureDomain = m.zone
+	zone.Region = m.zone
+
+	return zone, nil
+}
+
+// GetZoneByProviderID returns the Zone, found by using the provider ID.
+func (m *metadata) GetZoneByProviderID(ctx context.Context, providerID string) (cloudprovider.Zone, error) {
+	return cloudprovider.Zone{}, errors.New("GetZoneByProviderID not implemented")
+}
+
+// GetZoneByNodeName returns the Zone, found by using the node name.
+func (m *metadata) GetZoneByNodeName(ctx context.Context, nodeName types.NodeName) (cloudprovider.Zone, error) {
+	return cloudprovider.Zone{}, errors.New("GetZoneByNodeName not implemented")
+}
+
+func (m *metadata) get(mdType metadataType) (string, error) {
+	url := fmt.Sprintf("http://%s/latest/meta-data/%s", m.dhcpServer, mdType)
+
+	resp, err := http.Get(url)
+	if err != nil {
+		return "", fmt.Errorf("error reading metadata: %v", err)
+	}
+	defer resp.Body.Close()
+
+	if resp.StatusCode != http.StatusOK {
+		return "", fmt.Errorf("unexpected HTTP status: %d", resp.StatusCode)
+	}
+
+	data, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return "", fmt.Errorf("error reading response body: %d", resp.StatusCode)
+	}
+
+	return string(data), nil
+}
+
+func findDHCPServer() (string, error) {
+	nics, err := net.Interfaces()
+	if err != nil {
+		return "", fmt.Errorf("could not get interfaces: %v", err)
+	}
+
+	for _, nic := range nics {
+		if nic.Flags&net.FlagUp == 1 && nic.Flags&net.FlagLoopback == 0 && nic.Flags&net.FlagPointToPoint == 0 {
+			addrs, err := nic.Addrs()
+			if err != nil {
+				return "", fmt.Errorf("error reading IP addresses from interface %v: %v", nic.Name, err)
+			}
+
+			if addrs != nil {
+				client, err := newDHCPClient(&nic)
+				if err != nil {
+					return "", fmt.Errorf("error creating new DHCP client: %v", err)
+				}
+
+				discoverPacket, err := client.SendDiscoverPacket()
+				if err != nil {
+					return "", fmt.Errorf("error sending DHCP discover package: %v", err)
+				}
+
+				offerPacket, err := client.GetOffer(&discoverPacket)
+				if err != nil {
+					return "", fmt.Errorf("error receiving DHCP offer package: %v", err)
+				}
+
+				offerPacketOptions := offerPacket.ParseOptions()
+
+				if ipaddr, ok := offerPacketOptions[dhcp4.OptionServerIdentifier]; ok {
+					return net.IP(ipaddr).String(), nil
+				}
+			}
+		}
+	}
+
+	return "", errors.New("no server found")
+}
diff --git a/metadata_linux.go b/metadata_linux.go
new file mode 100644
index 0000000..02603bf
--- /dev/null
+++ b/metadata_linux.go
@@ -0,0 +1,40 @@
+// +build linux
+
+/*
+Copyright 2016 The Kubernetes Authors.
+
+Licensed 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 cloudstack
+
+import (
+	"net"
+	"time"
+
+	"github.com/d2g/dhcp4client"
+)
+
+func newDHCPClient(nic *net.Interface) (*dhcp4client.Client, error) {
+	pktsock, err := dhcp4client.NewPacketSock(nic.Index)
+	if err != nil {
+		return nil, err
+	}
+
+	return dhcp4client.New(
+		dhcp4client.HardwareAddr(nic.HardwareAddr),
+		dhcp4client.Timeout(2*time.Second),
+		dhcp4client.Broadcast(false),
+		dhcp4client.Connection(pktsock),
+	)
+}
diff --git a/metadata_other.go b/metadata_other.go
new file mode 100644
index 0000000..74a7fe2
--- /dev/null
+++ b/metadata_other.go
@@ -0,0 +1,40 @@
+// +build !linux
+
+/*
+Copyright 2016 The Kubernetes Authors.
+
+Licensed 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 cloudstack
+
+import (
+	"net"
+	"time"
+
+	"github.com/d2g/dhcp4client"
+)
+
+func newDHCPClient(nic *net.Interface) (*dhcp4client.Client, error) {
+	inetsock, err := dhcp4client.NewInetSock()
+	if err != nil {
+		return nil, err
+	}
+
+	return dhcp4client.New(
+		dhcp4client.HardwareAddr(nic.HardwareAddr),
+		dhcp4client.Timeout(2*time.Second),
+		dhcp4client.Broadcast(false),
+		dhcp4client.Connection(inetsock),
+	)
+}
diff --git a/vendor/github.com/d2g/dhcp4/LICENSE b/vendor/github.com/d2g/dhcp4/LICENSE
new file mode 100644
index 0000000..f7d058a
--- /dev/null
+++ b/vendor/github.com/d2g/dhcp4/LICENSE
@@ -0,0 +1,27 @@
+Copyright (c) 2013 Skagerrak Software Limited. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+   * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+   * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+   * Neither the name of Skagerrak Software Limited nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
\ No newline at end of file
diff --git a/vendor/github.com/d2g/dhcp4/README.md b/vendor/github.com/d2g/dhcp4/README.md
new file mode 100644
index 0000000..6752dc7
--- /dev/null
+++ b/vendor/github.com/d2g/dhcp4/README.md
@@ -0,0 +1,5 @@
+# DHCP4 - A DHCP library written in Go.
+
+Warning: This library is still being developed.  Function calls will change.
+
+I've removed Server Functionality, for me this project supports the underlying DHCP format not the implementation.
diff --git a/vendor/github.com/d2g/dhcp4/constants.go b/vendor/github.com/d2g/dhcp4/constants.go
new file mode 100644
index 0000000..183a778
--- /dev/null
+++ b/vendor/github.com/d2g/dhcp4/constants.go
@@ -0,0 +1,121 @@
+package dhcp4
+
+// OpCodes
+const (
+	BootRequest OpCode = 1 // From Client
+	BootReply   OpCode = 2 // From Server
+)
+
+// DHCP Message Type 53
+const (
+	Discover MessageType = 1 // Broadcast Packet From Client - Can I have an IP?
+	Offer    MessageType = 2 // Broadcast From Server - Here's an IP
+	Request  MessageType = 3 // Broadcast From Client - I'll take that IP (Also start for renewals)
+	Decline  MessageType = 4 // Broadcast From Client - Sorry I can't use that IP
+	ACK      MessageType = 5 // From Server, Yes you can have that IP
+	NAK      MessageType = 6 // From Server, No you cannot have that IP
+	Release  MessageType = 7 // From Client, I don't need that IP anymore
+	Inform   MessageType = 8 // From Client, I have this IP and there's nothing you can do about it
+)
+
+// DHCP Options
+const (
+	End                          OptionCode = 255
+	Pad                          OptionCode = 0
+	OptionSubnetMask             OptionCode = 1
+	OptionTimeOffset             OptionCode = 2
+	OptionRouter                 OptionCode = 3
+	OptionTimeServer             OptionCode = 4
+	OptionNameServer             OptionCode = 5
+	OptionDomainNameServer       OptionCode = 6
+	OptionLogServer              OptionCode = 7
+	OptionCookieServer           OptionCode = 8
+	OptionLPRServer              OptionCode = 9
+	OptionImpressServer          OptionCode = 10
+	OptionResourceLocationServer OptionCode = 11
+	OptionHostName               OptionCode = 12
+	OptionBootFileSize           OptionCode = 13
+	OptionMeritDumpFile          OptionCode = 14
+	OptionDomainName             OptionCode = 15
+	OptionSwapServer             OptionCode = 16
+	OptionRootPath               OptionCode = 17
+	OptionExtensionsPath         OptionCode = 18
+
+	// IP Layer Parameters per Host
+	OptionIPForwardingEnableDisable          OptionCode = 19
+	OptionNonLocalSourceRoutingEnableDisable OptionCode = 20
+	OptionPolicyFilter                       OptionCode = 21
+	OptionMaximumDatagramReassemblySize      OptionCode = 22
+	OptionDefaultIPTimeToLive                OptionCode = 23
+	OptionPathMTUAgingTimeout                OptionCode = 24
+	OptionPathMTUPlateauTable                OptionCode = 25
+
+	// IP Layer Parameters per Interface
+	OptionInterfaceMTU              OptionCode = 26
+	OptionAllSubnetsAreLocal        OptionCode = 27
+	OptionBroadcastAddress          OptionCode = 28
+	OptionPerformMaskDiscovery      OptionCode = 29
+	OptionMaskSupplier              OptionCode = 30
+	OptionPerformRouterDiscovery    OptionCode = 31
+	OptionRouterSolicitationAddress OptionCode = 32
+	OptionStaticRoute               OptionCode = 33
+
+	// Link Layer Parameters per Interface
+	OptionTrailerEncapsulation  OptionCode = 34
+	OptionARPCacheTimeout       OptionCode = 35
+	OptionEthernetEncapsulation OptionCode = 36
+
+	// TCP Parameters
+	OptionTCPDefaultTTL        OptionCode = 37
+	OptionTCPKeepaliveInterval OptionCode = 38
+	OptionTCPKeepaliveGarbage  OptionCode = 39
+
+	// Application and Service Parameters
+	OptionNetworkInformationServiceDomain            OptionCode = 40
+	OptionNetworkInformationServers                  OptionCode = 41
+	OptionNetworkTimeProtocolServers                 OptionCode = 42
+	OptionVendorSpecificInformation                  OptionCode = 43
+	OptionNetBIOSOverTCPIPNameServer                 OptionCode = 44
+	OptionNetBIOSOverTCPIPDatagramDistributionServer OptionCode = 45
+	OptionNetBIOSOverTCPIPNodeType                   OptionCode = 46
+	OptionNetBIOSOverTCPIPScope                      OptionCode = 47
+	OptionXWindowSystemFontServer                    OptionCode = 48
+	OptionXWindowSystemDisplayManager                OptionCode = 49
+	OptionNetworkInformationServicePlusDomain        OptionCode = 64
+	OptionNetworkInformationServicePlusServers       OptionCode = 65
+	OptionMobileIPHomeAgent                          OptionCode = 68
+	OptionSimpleMailTransportProtocol                OptionCode = 69
+	OptionPostOfficeProtocolServer                   OptionCode = 70
+	OptionNetworkNewsTransportProtocol               OptionCode = 71
+	OptionDefaultWorldWideWebServer                  OptionCode = 72
+	OptionDefaultFingerServer                        OptionCode = 73
+	OptionDefaultInternetRelayChatServer             OptionCode = 74
+	OptionStreetTalkServer                           OptionCode = 75
+	OptionStreetTalkDirectoryAssistance              OptionCode = 76
+
+	// DHCP Extensions
+	OptionRequestedIPAddress     OptionCode = 50
+	OptionIPAddressLeaseTime     OptionCode = 51
+	OptionOverload               OptionCode = 52
+	OptionDHCPMessageType        OptionCode = 53
+	OptionServerIdentifier       OptionCode = 54
+	OptionParameterRequestList   OptionCode = 55
+	OptionMessage                OptionCode = 56
+	OptionMaximumDHCPMessageSize OptionCode = 57
+	OptionRenewalTimeValue       OptionCode = 58
+	OptionRebindingTimeValue     OptionCode = 59
+	OptionVendorClassIdentifier  OptionCode = 60
+	OptionClientIdentifier       OptionCode = 61
+
+	OptionTFTPServerName OptionCode = 66
+	OptionBootFileName   OptionCode = 67
+
+	OptionUserClass OptionCode = 77
+
+	OptionClientArchitecture OptionCode = 93
+
+	OptionTZPOSIXString    OptionCode = 100
+	OptionTZDatabaseString OptionCode = 101
+
+	OptionClasslessRouteFormat OptionCode = 121
+)
diff --git a/vendor/github.com/d2g/dhcp4/helpers.go b/vendor/github.com/d2g/dhcp4/helpers.go
new file mode 100644
index 0000000..4b14638
--- /dev/null
+++ b/vendor/github.com/d2g/dhcp4/helpers.go
@@ -0,0 +1,58 @@
+package dhcp4
+
+import (
+	"encoding/binary"
+	"net"
+	"time"
+)
+
+// IPRange returns how many ips in the ip range from start to stop (inclusive)
+func IPRange(start, stop net.IP) int {
+	//return int(Uint([]byte(stop))-Uint([]byte(start))) + 1
+	return int(binary.BigEndian.Uint32(stop.To4())) - int(binary.BigEndian.Uint32(start.To4())) + 1
+}
+
+// IPAdd returns a copy of start + add.
+// IPAdd(net.IP{192,168,1,1},30) returns net.IP{192.168.1.31}
+func IPAdd(start net.IP, add int) net.IP { // IPv4 only
+	start = start.To4()
+	//v := Uvarint([]byte(start))
+	result := make(net.IP, 4)
+	binary.BigEndian.PutUint32(result, binary.BigEndian.Uint32(start)+uint32(add))
+	//PutUint([]byte(result), v+uint64(add))
+	return result
+}
+
+// IPLess returns where IP a is less than IP b.
+func IPLess(a, b net.IP) bool {
+	b = b.To4()
+	for i, ai := range a.To4() {
+		if ai != b[i] {
+			return ai < b[i]
+		}
+	}
+	return false
+}
+
+// IPInRange returns true if ip is between (inclusive) start and stop.
+func IPInRange(start, stop, ip net.IP) bool {
+	return !(IPLess(ip, start) || IPLess(stop, ip))
+}
+
+// OptionsLeaseTime - converts a time.Duration to a 4 byte slice, compatible
+// with OptionIPAddressLeaseTime.
+func OptionsLeaseTime(d time.Duration) []byte {
+	leaseBytes := make([]byte, 4)
+	binary.BigEndian.PutUint32(leaseBytes, uint32(d/time.Second))
+	//PutUvarint(leaseBytes, uint64(d/time.Second))
+	return leaseBytes
+}
+
+// JoinIPs returns a byte slice of IP addresses, one immediately after the other
+// This may be useful for creating multiple IP options such as OptionRouter.
+func JoinIPs(ips []net.IP) (b []byte) {
+	for _, v := range ips {
+		b = append(b, v.To4()...)
+	}
+	return
+}
diff --git a/vendor/github.com/d2g/dhcp4/helpers_test.go b/vendor/github.com/d2g/dhcp4/helpers_test.go
new file mode 100644
index 0000000..6b364e8
--- /dev/null
+++ b/vendor/github.com/d2g/dhcp4/helpers_test.go
@@ -0,0 +1,397 @@
+package dhcp4
+
+import (
+	"bytes"
+	"net"
+	"reflect"
+	"sort"
+	"testing"
+	"time"
+)
+
+// Verify that all options are returned by Options.SelectOrderOrAll if
+// the input order value is nil.
+func TestSelectOrderOrAllNil(t *testing.T) {
+	assertOptionsSlices(t, 0, "nil order", allOptionsSlice, optMap.SelectOrderOrAll(nil))
+}
+
+// Verify that all options are returned by Options.SelectOrderOrAll if
+// the input order value is not nil over several tests.
+func TestSelectOrderOrAllNotNil(t *testing.T) {
+	for i, tt := range selectOrderTests {
+		assertOptionsSlices(t, i, tt.description, tt.result, optMap.SelectOrderOrAll(tt.order))
+	}
+}
+
+// Verify that no options are returned by Options.SelectOrder if
+// the input order value is nil.
+func TestSelectOrderNil(t *testing.T) {
+	assertOptionsSlices(t, 0, "nil order", nil, optMap.SelectOrder(nil))
+}
+
+// Verify that all options are returned by Options.SelectOrder if
+// the input order value is not nil over several tests.
+func TestSelectOrderNotNil(t *testing.T) {
+	for i, tt := range selectOrderTests {
+		assertOptionsSlices(t, i, tt.description, tt.result, optMap.SelectOrder(tt.order))
+	}
+}
+
+func TestIPRange(t *testing.T) {
+	var tests = []struct {
+		start  net.IP
+		stop   net.IP
+		result int
+	}{
+		{
+			start:  net.IPv4(192, 168, 1, 1),
+			stop:   net.IPv4(192, 168, 1, 1),
+			result: 1,
+		},
+		{
+			start:  net.IPv4(192, 168, 1, 1),
+			stop:   net.IPv4(192, 168, 1, 254),
+			result: 254,
+		},
+		{
+			start:  net.IPv4(192, 168, 1, 1),
+			stop:   net.IPv4(192, 168, 10, 1),
+			result: 2305,
+		},
+		{
+			start:  net.IPv4(172, 16, 1, 1),
+			stop:   net.IPv4(192, 168, 1, 1),
+			result: 345505793,
+		},
+	}
+
+	for _, tt := range tests {
+		if result := IPRange(tt.start, tt.stop); result != tt.result {
+			t.Fatalf("IPRange(%s, %s), unexpected result: %v != %v",
+				tt.start, tt.stop, result, tt.result)
+		}
+	}
+}
+
+func TestIPAdd(t *testing.T) {
+	var tests = []struct {
+		start  net.IP
+		add    int
+		result net.IP
+	}{
+		{
+			start:  net.IPv4(192, 168, 1, 1),
+			add:    0,
+			result: net.IPv4(192, 168, 1, 1),
+		},
+		{
+			start:  net.IPv4(192, 168, 1, 1),
+			add:    253,
+			result: net.IPv4(192, 168, 1, 254),
+		},
+		{
+			start:  net.IPv4(192, 168, 1, 1),
+			add:    1024,
+			result: net.IPv4(192, 168, 5, 1),
+		},
+		{
+			start:  net.IPv4(192, 168, 1, 1),
+			add:    4096,
+			result: net.IPv4(192, 168, 17, 1),
+		},
+	}
+
+	for _, tt := range tests {
+		if result := IPAdd(tt.start, tt.add); !result.Equal(tt.result) {
+			t.Fatalf("IPAdd(%s, %d), unexpected result: %v != %v",
+				tt.start, tt.add, result, tt.result)
+		}
+	}
+}
+
+func TestIPLess(t *testing.T) {
+	var tests = []struct {
+		a      net.IP
+		b      net.IP
+		result bool
+	}{
+		{
+			a:      net.IPv4(192, 168, 1, 1),
+			b:      net.IPv4(192, 168, 1, 1),
+			result: false,
+		},
+		{
+			a:      net.IPv4(192, 168, 1, 1),
+			b:      net.IPv4(192, 168, 0, 1),
+			result: false,
+		},
+		{
+			a:      net.IPv4(192, 168, 0, 1),
+			b:      net.IPv4(192, 168, 1, 1),
+			result: true,
+		},
+		{
+			a:      net.IPv4(192, 168, 0, 1),
+			b:      net.IPv4(192, 168, 10, 1),
+			result: true,
+		},
+	}
+
+	for _, tt := range tests {
+		if result := IPLess(tt.a, tt.b); result != tt.result {
+			t.Fatalf("IPLess(%s, %s), unexpected result: %v != %v",
+				tt.a, tt.b, result, tt.result)
+		}
+	}
+}
+
+func TestIPInRange(t *testing.T) {
+	var tests = []struct {
+		start  net.IP
+		stop   net.IP
+		ip     net.IP
+		result bool
+	}{
+		{
+			start:  net.IPv4(192, 168, 1, 1),
+			stop:   net.IPv4(192, 168, 2, 1),
+			ip:     net.IPv4(192, 168, 3, 1),
+			result: false,
+		},
+		{
+			start:  net.IPv4(192, 168, 1, 1),
+			stop:   net.IPv4(192, 168, 10, 1),
+			ip:     net.IPv4(192, 168, 0, 1),
+			result: false,
+		},
+		{
+			start:  net.IPv4(192, 168, 1, 1),
+			stop:   net.IPv4(192, 168, 10, 1),
+			ip:     net.IPv4(192, 168, 5, 1),
+			result: true,
+		},
+		{
+			start:  net.IPv4(192, 168, 1, 1),
+			stop:   net.IPv4(192, 168, 3, 1),
+			ip:     net.IPv4(192, 168, 3, 0),
+			result: true,
+		},
+		{
+			start:  net.IPv4(192, 168, 1, 1),
+			stop:   net.IPv4(192, 168, 1, 1),
+			ip:     net.IPv4(192, 168, 1, 1),
+			result: true,
+		},
+	}
+
+	for _, tt := range tests {
+		if result := IPInRange(tt.start, tt.stop, tt.ip); result != tt.result {
+			t.Fatalf("IPInRange(%s, %s, %s), unexpected result: %v != %v",
+				tt.start, tt.stop, tt.ip, result, tt.result)
+		}
+	}
+}
+
+func TestOptionsLeaseTime(t *testing.T) {
+	var tests = []struct {
+		duration time.Duration
+		result   []byte
+	}{
+		{
+			duration: 0 * time.Second,
+			result:   []byte{0, 0, 0, 0},
+		},
+		{
+			duration: 2 * time.Second,
+			result:   []byte{0, 0, 0, 2},
+		},
+		{
+			duration: 60 * time.Second,
+			result:   []byte{0, 0, 0, 60},
+		},
+		{
+			duration: 6 * time.Hour,
+			result:   []byte{0, 0, 84, 96},
+		},
+		{
+			duration: 24 * time.Hour,
+			result:   []byte{0, 1, 81, 128},
+		},
+		{
+			duration: 365 * 24 * time.Hour,
+			result:   []byte{1, 225, 51, 128},
+		},
+	}
+
+	for _, tt := range tests {
+		if result := OptionsLeaseTime(tt.duration); !bytes.Equal(result, tt.result) {
+			t.Fatalf("OptionsLeaseTime(%s), unexpected result: %v != %v",
+				tt.duration, result, tt.result)
+		}
+	}
+}
+
+func TestJoinIPs(t *testing.T) {
+	var tests = []struct {
+		ips    []net.IP
+		result []byte
+	}{
+		{
+			ips:    []net.IP{net.IPv4(10, 0, 0, 1)},
+			result: []byte{10, 0, 0, 1},
+		},
+		{
+			ips:    []net.IP{net.IPv4(192, 168, 1, 1), net.IPv4(192, 168, 2, 1)},
+			result: []byte{192, 168, 1, 1, 192, 168, 2, 1},
+		},
+		{
+			ips:    []net.IP{net.IPv4(10, 0, 0, 1), net.IPv4(255, 255, 255, 254)},
+			result: []byte{10, 0, 0, 1, 255, 255, 255, 254},
+		},
+		{
+			ips:    []net.IP{net.IPv4(8, 8, 8, 8), net.IPv4(8, 8, 4, 4), net.IPv4(192, 168, 1, 1)},
+			result: []byte{8, 8, 8, 8, 8, 8, 4, 4, 192, 168, 1, 1},
+		},
+	}
+
+	for _, tt := range tests {
+		if result := JoinIPs(tt.ips); !bytes.Equal(result, tt.result) {
+			t.Fatalf("JoinIPs(%s), unexpected result: %v != %v",
+				tt.ips, result, tt.result)
+		}
+	}
+}
+
+// byOptionCode implements sort.Interface for []Option.
+type byOptionCode []Option
+
+func (b byOptionCode) Len() int               { return len(b) }
+func (b byOptionCode) Less(i int, j int) bool { return b[i].Code < b[j].Code }
+func (b byOptionCode) Swap(i int, j int)      { b[i], b[j] = b[j], b[i] }
+
+// assertOptionsSlices is a test helper which verifies that two options slices
+// are identical.  Several parameters are passed for easy identification of
+// failing tests.
+func assertOptionsSlices(t *testing.T, i int, description string, want []Option, got []Option) {
+	// Verify slices are same length
+	if want, got := len(want), len(got); want != got {
+		t.Fatalf("%02d: test %q, mismatched length: %d != %d",
+			i, description, want, got)
+	}
+
+	// Sort slices
+	sort.Sort(byOptionCode(want))
+	sort.Sort(byOptionCode(got))
+
+	// Verify slices are identical
+	if len(want) > 0 && len(got) > 0 && !reflect.DeepEqual(want, got) {
+		t.Fatalf("%02d: test %q, unexpected options: %v != %v",
+			i, description, want, got)
+	}
+}
+
+// optMap is an Options map which contains a number of option
+// codes and values, used for testing.
+var optMap = Options{
+	OptionSubnetMask:       []byte{255, 255, 255, 0},
+	OptionRouter:           []byte{192, 168, 1, 1},
+	OptionDomainNameServer: []byte{192, 168, 1, 2},
+	OptionTimeServer:       []byte{192, 168, 1, 3},
+	OptionLogServer:        []byte{192, 168, 1, 4},
+}
+
+// allOptionsSlice is a []Option derived from optMap.  It is used
+// for some tests.
+var allOptionsSlice = []Option{
+	Option{
+		Code:  OptionSubnetMask,
+		Value: optMap[OptionSubnetMask],
+	},
+	Option{
+		Code:  OptionRouter,
+		Value: optMap[OptionRouter],
+	},
+	Option{
+		Code:  OptionDomainNameServer,
+		Value: optMap[OptionDomainNameServer],
+	},
+	Option{
+		Code:  OptionTimeServer,
+		Value: optMap[OptionTimeServer],
+	},
+	Option{
+		Code:  OptionLogServer,
+		Value: optMap[OptionLogServer],
+	},
+}
+
+// selectOrderTests is a set of tests used for Options.SelectOrder
+// and Options.SelectOrderOrAll methods.
+var selectOrderTests = []struct {
+	description string
+	order       []byte
+	result      []Option
+}{
+	{
+		description: "subnet mask only",
+		order: []byte{
+			byte(OptionSubnetMask),
+		},
+		result: []Option{
+			Option{
+				Code:  OptionSubnetMask,
+				Value: optMap[OptionSubnetMask],
+			},
+		},
+	},
+	{
+		description: "subnet mask and time server",
+		order: []byte{
+			byte(OptionSubnetMask),
+			byte(OptionTimeServer),
+		},
+		result: []Option{
+			Option{
+				Code:  OptionSubnetMask,
+				Value: optMap[OptionSubnetMask],
+			},
+			Option{
+				Code:  OptionTimeServer,
+				Value: optMap[OptionTimeServer],
+			},
+		},
+	},
+	{
+		description: "domain name server, time server, router",
+		order: []byte{
+			byte(OptionDomainNameServer),
+			byte(OptionTimeServer),
+			byte(OptionRouter),
+		},
+		result: []Option{
+			Option{
+				Code:  OptionDomainNameServer,
+				Value: optMap[OptionDomainNameServer],
+			},
+			Option{
+				Code:  OptionTimeServer,
+				Value: optMap[OptionTimeServer],
+			},
+			Option{
+				Code:  OptionRouter,
+				Value: optMap[OptionRouter],
+			},
+		},
+	},
+	{
+		description: "all options in order",
+		order: []byte{
+			byte(OptionSubnetMask),
+			byte(OptionRouter),
+			byte(OptionDomainNameServer),
+			byte(OptionTimeServer),
+			byte(OptionLogServer),
+		},
+		result: allOptionsSlice,
+	},
+}
diff --git a/vendor/github.com/d2g/dhcp4/option.go b/vendor/github.com/d2g/dhcp4/option.go
new file mode 100644
index 0000000..fbf86e6
--- /dev/null
+++ b/vendor/github.com/d2g/dhcp4/option.go
@@ -0,0 +1,40 @@
+package dhcp4
+
+type OptionCode byte
+
+type Option struct {
+	Code  OptionCode
+	Value []byte
+}
+
+// Map of DHCP options
+type Options map[OptionCode][]byte
+
+// SelectOrderOrAll has same functionality as SelectOrder, except if the order
+// param is nil, whereby all options are added (in arbitrary order).
+func (o Options) SelectOrderOrAll(order []byte) []Option {
+	if order == nil {
+		opts := make([]Option, 0, len(o))
+		for i, v := range o {
+			opts = append(opts, Option{Code: i, Value: v})
+		}
+		return opts
+	}
+	return o.SelectOrder(order)
+}
+
+// SelectOrder returns a slice of options ordered and selected by a byte array
+// usually defined by OptionParameterRequestList.  This result is expected to be
+// used in ReplyPacket()'s []Option parameter.
+func (o Options) SelectOrder(order []byte) []Option {
+	opts := make([]Option, 0, len(order))
+	for _, v := range order {
+		if data, ok := o[OptionCode(v)]; ok {
+			opts = append(opts, Option{Code: OptionCode(v), Value: data})
+		}
+	}
+	return opts
+}
+
+type OpCode byte
+type MessageType byte // Option 53
diff --git a/vendor/github.com/d2g/dhcp4/packet.go b/vendor/github.com/d2g/dhcp4/packet.go
new file mode 100644
index 0000000..25d69fb
--- /dev/null
+++ b/vendor/github.com/d2g/dhcp4/packet.go
@@ -0,0 +1,150 @@
+package dhcp4
+
+import (
+	"net"
+	"time"
+)
+
+// A DHCP packet
+type Packet []byte
+
+func (p Packet) OpCode() OpCode { return OpCode(p[0]) }
+func (p Packet) HType() byte    { return p[1] }
+func (p Packet) HLen() byte     { return p[2] }
+func (p Packet) Hops() byte     { return p[3] }
+func (p Packet) XId() []byte    { return p[4:8] }
+func (p Packet) Secs() []byte   { return p[8:10] } // Never Used?
+func (p Packet) Flags() []byte  { return p[10:12] }
+func (p Packet) CIAddr() net.IP { return net.IP(p[12:16]) }
+func (p Packet) YIAddr() net.IP { return net.IP(p[16:20]) }
+func (p Packet) SIAddr() net.IP { return net.IP(p[20:24]) }
+func (p Packet) GIAddr() net.IP { return net.IP(p[24:28]) }
+func (p Packet) CHAddr() net.HardwareAddr {
+	hLen := p.HLen()
+	if hLen > 16 { // Prevent chaddr exceeding p boundary
+		hLen = 16
+	}
+	return net.HardwareAddr(p[28 : 28+hLen]) // max endPos 44
+}
+
+// 192 bytes of zeros BOOTP legacy
+func (p Packet) Cookie() []byte { return p[236:240] }
+func (p Packet) Options() []byte {
+	if len(p) > 240 {
+		return p[240:]
+	}
+	return nil
+}
+
+func (p Packet) Broadcast() bool { return p.Flags()[0] > 127 }
+
+func (p Packet) SetBroadcast(broadcast bool) {
+	if p.Broadcast() != broadcast {
+		p.Flags()[0] ^= 128
+	}
+}
+
+func (p Packet) SetOpCode(c OpCode) { p[0] = byte(c) }
+func (p Packet) SetCHAddr(a net.HardwareAddr) {
+	copy(p[28:44], a)
+	p[2] = byte(len(a))
+}
+func (p Packet) SetHType(hType byte)     { p[1] = hType }
+func (p Packet) SetCookie(cookie []byte) { copy(p.Cookie(), cookie) }
+func (p Packet) SetHops(hops byte)       { p[3] = hops }
+func (p Packet) SetXId(xId []byte)       { copy(p.XId(), xId) }
+func (p Packet) SetSecs(secs []byte)     { copy(p.Secs(), secs) }
+func (p Packet) SetFlags(flags []byte)   { copy(p.Flags(), flags) }
+func (p Packet) SetCIAddr(ip net.IP)     { copy(p.CIAddr(), ip.To4()) }
+func (p Packet) SetYIAddr(ip net.IP)     { copy(p.YIAddr(), ip.To4()) }
+func (p Packet) SetSIAddr(ip net.IP)     { copy(p.SIAddr(), ip.To4()) }
+func (p Packet) SetGIAddr(ip net.IP)     { copy(p.GIAddr(), ip.To4()) }
+
+// Parses the packet's options into an Options map
+func (p Packet) ParseOptions() Options {
+	opts := p.Options()
+	options := make(Options, 10)
+	for len(opts) >= 2 && OptionCode(opts[0]) != End {
+		if OptionCode(opts[0]) == Pad {
+			opts = opts[1:]
+			continue
+		}
+		size := int(opts[1])
+		if len(opts) < 2+size {
+			break
+		}
+		options[OptionCode(opts[0])] = opts[2 : 2+size]
+		opts = opts[2+size:]
+	}
+	return options
+}
+
+func NewPacket(opCode OpCode) Packet {
+	p := make(Packet, 241)
+	p.SetOpCode(opCode)
+	p.SetHType(1) // Ethernet
+	p.SetCookie([]byte{99, 130, 83, 99})
+	p[240] = byte(End)
+	return p
+}
+
+// Appends a DHCP option to the end of a packet
+func (p *Packet) AddOption(o OptionCode, value []byte) {
+	*p = append((*p)[:len(*p)-1], []byte{byte(o), byte(len(value))}...) // Strip off End, Add OptionCode and Length
+	*p = append(*p, value...)                                           // Add Option Value
+	*p = append(*p, byte(End))                                          // Add on new End
+}
+
+// Removes all options from packet.
+func (p *Packet) StripOptions() {
+	*p = append((*p)[:240], byte(End))
+}
+
+// Creates a request packet that a Client would send to a server.
+func RequestPacket(mt MessageType, chAddr net.HardwareAddr, cIAddr net.IP, xId []byte, broadcast bool, options []Option) Packet {
+	p := NewPacket(BootRequest)
+	p.SetCHAddr(chAddr)
+	p.SetXId(xId)
+	if cIAddr != nil {
+		p.SetCIAddr(cIAddr)
+	}
+	p.SetBroadcast(broadcast)
+	p.AddOption(OptionDHCPMessageType, []byte{byte(mt)})
+	for _, o := range options {
+		p.AddOption(o.Code, o.Value)
+	}
+	p.PadToMinSize()
+	return p
+}
+
+// ReplyPacket creates a reply packet that a Server would send to a client.
+// It uses the req Packet param to copy across common/necessary fields to
+// associate the reply the request.
+func ReplyPacket(req Packet, mt MessageType, serverId, yIAddr net.IP, leaseDuration time.Duration, options []Option) Packet {
+	p := NewPacket(BootReply)
+	p.SetXId(req.XId())
+	p.SetFlags(req.Flags())
+	p.SetYIAddr(yIAddr)
+	p.SetGIAddr(req.GIAddr())
+	p.SetCHAddr(req.CHAddr())
+	p.AddOption(OptionDHCPMessageType, []byte{byte(mt)})
+	p.AddOption(OptionServerIdentifier, []byte(serverId))
+	if leaseDuration > 0 {
+		p.AddOption(OptionIPAddressLeaseTime, OptionsLeaseTime(leaseDuration))
+	}
+	for _, o := range options {
+		p.AddOption(o.Code, o.Value)
+	}
+	p.PadToMinSize()
+	return p
+}
+
+// PadToMinSize pads a packet so that when sent over UDP, the entire packet,
+// is 300 bytes (BOOTP min), to be compatible with really old devices.
+var padder [272]byte
+
+func (p *Packet) PadToMinSize() {
+	if n := len(*p); n < 272 {
+		*p = append(*p, padder[:272-n]...)
+	}
+}
diff --git a/vendor/github.com/d2g/dhcp4/packet_test.go b/vendor/github.com/d2g/dhcp4/packet_test.go
new file mode 100644
index 0000000..b0839cb
--- /dev/null
+++ b/vendor/github.com/d2g/dhcp4/packet_test.go
@@ -0,0 +1,433 @@
+package dhcp4
+
+import (
+	"bytes"
+	"net"
+	"testing"
+	"time"
+)
+
+func TestNewPacket(t *testing.T) {
+	var tests = []struct {
+		description string
+		opCode      OpCode
+	}{
+		{
+			description: "boot request",
+			opCode:      BootRequest,
+		},
+		{
+			description: "boot reply",
+			opCode:      BootReply,
+		},
+		{
+			description: "unknown opcode",
+			opCode:      3,
+		},
+	}
+
+	for i, tt := range tests {
+		if want, got := newPacket(tt.opCode), NewPacket(tt.opCode); !bytes.Equal(want, got) {
+			t.Fatalf("%02d: NewPacket(%d), test %q, unexpected result: %v != %v",
+				i, tt.opCode, tt.description, want, got)
+		}
+	}
+}
+
+func TestPacketAddOption(t *testing.T) {
+	for i, tt := range optionsTests {
+		// Set up new packet, apply options from slice
+		p := NewPacket(BootRequest)
+		for _, o := range tt.options {
+			p.AddOption(o.Code, o.Value)
+		}
+
+		// Empty options should result in no changes
+		if tt.options == nil || len(tt.options) == 0 {
+			if !bytes.Equal(p, NewPacket(BootRequest)) {
+				t.Fatalf("%02d: test %q, no options applied, but packet contained extra data",
+					i, tt.description)
+			}
+		}
+
+		// Check that each option was properly applied, in order
+
+		// Track length of previous option bytes
+		var offset int
+		for ii, o := range tt.options {
+			// Options start at byte 240 on an empty packet, adding
+			// offset as loops continue
+			start := offset + 240
+			end := start + 2 + len(o.Value)
+
+			// Options bytes: [option] [length] [value...]
+			check := append([]byte{byte(o.Code)}, byte(len(o.Value)))
+			check = append(check, o.Value...)
+
+			// Verify option correctly applied
+			if want, got := p[start:end], check; !bytes.Equal(want, got) {
+				t.Fatalf("%02d: test %q, unexpected option bytes: %v != %v",
+					ii, tt.description, want, got)
+			}
+
+			// Track offset for next loop
+			offset = offset + len(check)
+		}
+
+		// Ensure last byte is always End
+		if p[len(p)-1] != byte(End) {
+			t.Fatalf("%02d: test %q, missing End byte", i, tt.description)
+		}
+	}
+}
+
+func TestPacketParseOptions(t *testing.T) {
+	for i, tt := range optionsTests {
+		// Set up new packet, apply options from slice
+		p := NewPacket(BootRequest)
+		for _, o := range tt.options {
+			p.AddOption(o.Code, o.Value)
+		}
+
+		// Parse options, verify all options are present
+		options := p.ParseOptions()
+		for _, o := range tt.options {
+			var found bool
+
+			// Search for expected option in result map
+			for k, v := range options {
+				if o.Code == k && bytes.Equal(o.Value, v) {
+					found = true
+					break
+				}
+			}
+
+			// Pad option is not parsed, but check all others
+			if !found && o.Code != Pad {
+				t.Fatalf("%02d: test %q, did not find option: %v",
+					i, tt.description, o)
+			}
+		}
+	}
+}
+
+func TestPacketStripOptions(t *testing.T) {
+	for i, tt := range optionsTests {
+		// Set up new packet, apply options from slice
+		p := NewPacket(BootRequest)
+		for _, o := range tt.options {
+			p.AddOption(o.Code, o.Value)
+		}
+
+		// Strip all options, verify options are gone
+		p.StripOptions()
+		if !bytes.Equal(p, NewPacket(BootRequest)) {
+			t.Fatalf("%02d: test %q, options stripped, but packet contained extra data",
+				i, tt.description)
+		}
+	}
+}
+
+func TestPacketPadToMinSize(t *testing.T) {
+	var tests = []struct {
+		before int
+		after  int
+	}{
+		{
+			before: 0,
+			after:  272,
+		},
+		{
+			before: 100,
+			after:  272,
+		},
+		{
+			before: 300,
+			after:  300,
+		},
+		{
+			before: 1024,
+			after:  1024,
+		},
+	}
+
+	for i, tt := range tests {
+		p := make(Packet, tt.before)
+		p.PadToMinSize()
+
+		if want, got := tt.after, len(p); want != got {
+			t.Fatalf("%02d: before %d, unexpected padded length: %d != %d",
+				i, tt.before, want, got)
+		}
+	}
+}
+
+func TestRequestPacket(t *testing.T) {
+	var tests = []struct {
+		description string
+		mt          MessageType
+		chAddr      net.HardwareAddr
+		cIAddr      net.IP
+		xId         []byte
+		broadcast   bool
+		options     []Option
+	}{
+		{
+			description: "discover request",
+			mt:          Discover,
+			chAddr:      net.HardwareAddr{1, 35, 69, 103, 117, 171}, // 01:23:45:67:89:ab
+			cIAddr:      net.IP([]byte{192, 168, 1, 1}),
+			xId:         []byte{0, 1, 2, 3},
+			broadcast:   true,
+			options:     nil,
+		},
+		{
+			description: "request request",
+			mt:          Request,
+			chAddr:      net.HardwareAddr{222, 173, 190, 239, 222, 173}, // de:ad:be:ef:de:ad
+			xId:         []byte{4, 5, 6, 7},
+			broadcast:   false,
+			options:     oneOptionSlice,
+		},
+		{
+			description: "decline request",
+			mt:          Decline,
+			chAddr:      net.HardwareAddr{255, 255, 255, 255, 255, 255}, // ff:ff:ff:ff:ff:ff
+			xId:         []byte{8, 9, 10, 11},
+			broadcast:   true,
+			options:     twoOptionsSlice,
+		},
+	}
+
+	for i, tt := range tests {
+		// Compare our basic test implementation's packet against the library's
+		// implementation
+		want := newRequestPacket(tt.mt, tt.chAddr, tt.cIAddr, tt.xId, tt.broadcast, tt.options)
+		got := RequestPacket(tt.mt, tt.chAddr, tt.cIAddr, tt.xId, tt.broadcast, tt.options)
+
+		if !bytes.Equal(want, got) {
+			t.Fatalf("%02d: RequestPacket(), test %q, unexpected result: %v != %v",
+				i, tt.description, want, got)
+		}
+	}
+}
+
+func TestReplyPacket(t *testing.T) {
+	var tests = []struct {
+		description   string
+		mt            MessageType
+		serverId      net.IP
+		yIAddr        net.IP
+		leaseDuration time.Duration
+		options       []Option
+	}{
+		{
+			description:   "offer reply",
+			mt:            Offer,
+			serverId:      []byte{192, 168, 1, 1},
+			yIAddr:        []byte{192, 168, 1, 1},
+			leaseDuration: 60 * time.Second,
+			options:       nil,
+		},
+		{
+			description:   "ACK reply",
+			mt:            ACK,
+			serverId:      []byte{10, 0, 0, 1},
+			yIAddr:        []byte{192, 168, 1, 1},
+			leaseDuration: 10 * time.Second,
+			options:       oneOptionSlice,
+		},
+		{
+			description:   "NAK reply",
+			mt:            NAK,
+			serverId:      []byte{8, 8, 8, 8},
+			yIAddr:        []byte{8, 8, 4, 4},
+			leaseDuration: 3600 * time.Second,
+			options:       twoOptionsSlice,
+		},
+	}
+
+	for i, tt := range tests {
+		// Compare our basic test implementation's packet against the library's
+		// implementation
+		req := NewPacket(BootRequest)
+		want := newReplyPacket(req, tt.mt, tt.serverId, tt.yIAddr, tt.leaseDuration, tt.options)
+		got := ReplyPacket(req, tt.mt, tt.serverId, tt.yIAddr, tt.leaseDuration, tt.options)
+
+		if !bytes.Equal(want, got) {
+			t.Fatalf("%02d: ReplyPacket(), test %q, unexpected result: %v != %v",
+				i, tt.description, want, got)
+		}
+	}
+}
+
+// newPacket mimics the raw logic of NewPacket, and verifies that its
+// behavior does not change.
+func newPacket(opCode OpCode) Packet {
+	const ethernetHType = 1
+	var cookie = []byte{99, 130, 83, 99}
+
+	p := make(Packet, 241)
+	p[0] = byte(opCode)
+	p[1] = ethernetHType
+	copy(p[236:240], cookie)
+	p[240] = byte(End)
+
+	return p
+}
+
+// newRequestPacket mimics the raw logic of RequestPacket, and verifies that
+// its behavior does not change.
+func newRequestPacket(mt MessageType, chAddr net.HardwareAddr, cIAddr net.IP, xId []byte, broadcast bool, options []Option) Packet {
+	// Craft packet using our test method
+	p := newPacket(BootRequest)
+
+	// SetCHAddr
+	copy(p[28:44], chAddr)
+	p[2] = byte(len(chAddr))
+
+	// SetXId
+	copy(p[4:8], xId)
+
+	// SetCIAddr
+	if cIAddr != nil {
+		copy(net.IP(p[12:16]), cIAddr.To4())
+	}
+
+	// SetBroadcast
+	if broadcast {
+		p[10:12][0] ^= 128
+	}
+
+	// AddOption already tested, so no need to duplicate the logic
+	p.AddOption(OptionDHCPMessageType, []byte{byte(mt)})
+	for _, o := range options {
+		p.AddOption(o.Code, o.Value)
+	}
+
+	// PadToMinSize already tested
+	p.PadToMinSize()
+
+	return p
+}
+
+// newReplyPacket mimics the raw logic of ReplyPacket, and verifies that
+// its behavior does not change.
+func newReplyPacket(req Packet, mt MessageType, serverId, yIAddr net.IP, leaseDuration time.Duration, options []Option) Packet {
+	// Craft packet using our test method
+	p := newPacket(BootReply)
+
+	// SetXId
+	copy(p[4:8], req[4:8])
+
+	// SetFlags
+	copy(p[10:22], req[10:12])
+
+	// SetYIAddr
+	copy(p[16:20], yIAddr)
+
+	// SetGIAddr
+	copy(p[24:28], req[24:28])
+
+	// SetCHAddr
+	hLen := req[2]
+	if hLen > 16 {
+		hLen = 16
+	}
+	c := make([]byte, hLen)
+	copy(c, p[28:28+hLen])
+
+	copy(p[28:44], c)
+	p[2] = byte(len(c))
+
+	// SetSecs
+	copy(p[8:10], req[8:10])
+
+	// AddOption already tested, so no need to duplicate the logic
+	p.AddOption(OptionDHCPMessageType, []byte{byte(mt)})
+	p.AddOption(OptionServerIdentifier, []byte(serverId))
+	p.AddOption(OptionIPAddressLeaseTime, OptionsLeaseTime(leaseDuration))
+	for _, o := range options {
+		p.AddOption(o.Code, o.Value)
+	}
+
+	// PadToMinSize already tested
+	p.PadToMinSize()
+
+	return p
+}
+
+// oneOptionSlice is a test helper of []Option with a single
+// Option.
+var oneOptionSlice = []Option{
+	Option{
+		Code:  OptionSubnetMask,
+		Value: []byte{255, 255, 255, 0},
+	},
+}
+
+// twoOptionSlice is a test helper of []Option with two
+// Option values.
+var twoOptionsSlice = []Option{
+	Option{
+		Code:  OptionSubnetMask,
+		Value: []byte{255, 255, 255, 0},
+	},
+	Option{
+		Code:  OptionDomainNameServer,
+		Value: []byte{8, 8, 8, 8},
+	},
+}
+
+// optionsTests are tests used when applying and stripping Options
+// from Packets.
+var optionsTests = []struct {
+	description string
+	options     []Option
+}{
+	{
+		description: "nil options",
+		options:     nil,
+	},
+	{
+		description: "empty options",
+		options:     []Option{},
+	},
+	{
+		description: "padding option",
+		options: []Option{
+			Option{
+				Code: Pad,
+			},
+		},
+	},
+	{
+		description: "one option",
+		options:     oneOptionSlice,
+	},
+	{
+		description: "two options",
+		options:     twoOptionsSlice,
+	},
+	{
+		description: "four options",
+		options: []Option{
+			Option{
+				Code:  OptionSubnetMask,
+				Value: []byte{255, 255, 255, 0},
+			},
+			Option{
+				Code:  OptionDomainNameServer,
+				Value: []byte{8, 8, 8, 8},
+			},
+			Option{
+				Code:  OptionTimeServer,
+				Value: []byte{127, 0, 0, 1},
+			},
+			Option{
+				Code:  OptionMessage,
+				Value: []byte{'h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd'},
+			},
+		},
+	},
+}
diff --git a/vendor/github.com/d2g/dhcp4client/LICENSE b/vendor/github.com/d2g/dhcp4client/LICENSE
new file mode 100644
index 0000000..c33dcc7
--- /dev/null
+++ b/vendor/github.com/d2g/dhcp4client/LICENSE
@@ -0,0 +1,354 @@
+Mozilla Public License, version 2.0
+
+1. Definitions
+
+1.1. “Contributor”
+
+     means each individual or legal entity that creates, contributes to the
+     creation of, or owns Covered Software.
+
+1.2. “Contributor Version”
+
+     means the combination of the Contributions of others (if any) used by a
+     Contributor and that particular Contributor’s Contribution.
+
+1.3. “Contribution”
+
+     means Covered Software of a particular Contributor.
+
+1.4. “Covered Software”
+
+     means Source Code Form to which the initial Contributor has attached the
+     notice in Exhibit A, the Executable Form of such Source Code Form, and
+     Modifications of such Source Code Form, in each case including portions
+     thereof.
+
+1.5. “Incompatible With Secondary Licenses”
+     means
+
+     a. that the initial Contributor has attached the notice described in
+        Exhibit B to the Covered Software; or
+
+     b. that the Covered Software was made available under the terms of version
+        1.1 or earlier of the License, but not also under the terms of a
+        Secondary License.
+
+1.6. “Executable Form”
+
+     means any form of the work other than Source Code Form.
+
+1.7. “Larger Work”
+
+     means a work that combines Covered Software with other material, in a separate
+     file or files, that is not Covered Software.
+
+1.8. “License”
+
+     means this document.
+
+1.9. “Licensable”
+
+     means having the right to grant, to the maximum extent possible, whether at the
+     time of the initial grant or subsequently, any and all of the rights conveyed by
+     this License.
+
+1.10. “Modifications”
+
+     means any of the following:
+
+     a. any file in Source Code Form that results from an addition to, deletion
+        from, or modification of the contents of Covered Software; or
+
+     b. any new file in Source Code Form that contains any Covered Software.
+
+1.11. “Patent Claims” of a Contributor
+
+      means any patent claim(s), including without limitation, method, process,
+      and apparatus claims, in any patent Licensable by such Contributor that
+      would be infringed, but for the grant of the License, by the making,
+      using, selling, offering for sale, having made, import, or transfer of
+      either its Contributions or its Contributor Version.
+
+1.12. “Secondary License”
+
+      means either the GNU General Public License, Version 2.0, the GNU Lesser
+      General Public License, Version 2.1, the GNU Affero General Public
+      License, Version 3.0, or any later versions of those licenses.
+
+1.13. “Source Code Form”
+
+      means the form of the work preferred for making modifications.
+
+1.14. “You” (or “Your”)
+
+      means an individual or a legal entity exercising rights under this
+      License. For legal entities, “You” includes any entity that controls, is
+      controlled by, or is under common control with You. For purposes of this
+      definition, “control” means (a) the power, direct or indirect, to cause
+      the direction or management of such entity, whether by contract or
+      otherwise, or (b) ownership of more than fifty percent (50%) of the
+      outstanding shares or beneficial ownership of such entity.
+
+
+2. License Grants and Conditions
+
+2.1. Grants
+
+     Each Contributor hereby grants You a world-wide, royalty-free,
+     non-exclusive license:
+
+     a. under intellectual property rights (other than patent or trademark)
+        Licensable by such Contributor to use, reproduce, make available,
+        modify, display, perform, distribute, and otherwise exploit its
+        Contributions, either on an unmodified basis, with Modifications, or as
+        part of a Larger Work; and
+
+     b. under Patent Claims of such Contributor to make, use, sell, offer for
+        sale, have made, import, and otherwise transfer either its Contributions
+        or its Contributor Version.
+
+2.2. Effective Date
+
+     The licenses granted in Section 2.1 with respect to any Contribution become
+     effective for each Contribution on the date the Contributor first distributes
+     such Contribution.
+
+2.3. Limitations on Grant Scope
+
+     The licenses granted in this Section 2 are the only rights granted under this
+     License. No additional rights or licenses will be implied from the distribution
+     or licensing of Covered Software under this License. Notwithstanding Section
+     2.1(b) above, no patent license is granted by a Contributor:
+
+     a. for any code that a Contributor has removed from Covered Software; or
+
+     b. for infringements caused by: (i) Your and any other third party’s
+        modifications of Covered Software, or (ii) the combination of its
+        Contributions with other software (except as part of its Contributor
+        Version); or
+
+     c. under Patent Claims infringed by Covered Software in the absence of its
+        Contributions.
+
+     This License does not grant any rights in the trademarks, service marks, or
+     logos of any Contributor (except as may be necessary to comply with the
+     notice requirements in Section 3.4).
+
+2.4. Subsequent Licenses
+
+     No Contributor makes additional grants as a result of Your choice to
+     distribute the Covered Software under a subsequent version of this License
+     (see Section 10.2) or under the terms of a Secondary License (if permitted
+     under the terms of Section 3.3).
+
+2.5. Representation
+
+     Each Contributor represents that the Contributor believes its Contributions
+     are its original creation(s) or it has sufficient rights to grant the
+     rights to its Contributions conveyed by this License.
+
+2.6. Fair Use
+
+     This License is not intended to limit any rights You have under applicable
+     copyright doctrines of fair use, fair dealing, or other equivalents.
+
+2.7. Conditions
+
+     Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in
+     Section 2.1.
+
+
+3. Responsibilities
+
+3.1. Distribution of Source Form
+
+     All distribution of Covered Software in Source Code Form, including any
+     Modifications that You create or to which You contribute, must be under the
+     terms of this License. You must inform recipients that the Source Code Form
+     of the Covered Software is governed by the terms of this License, and how
+     they can obtain a copy of this License. You may not attempt to alter or
+     restrict the recipients’ rights in the Source Code Form.
+
+3.2. Distribution of Executable Form
+
+     If You distribute Covered Software in Executable Form then:
+
+     a. such Covered Software must also be made available in Source Code Form,
+        as described in Section 3.1, and You must inform recipients of the
+        Executable Form how they can obtain a copy of such Source Code Form by
+        reasonable means in a timely manner, at a charge no more than the cost
+        of distribution to the recipient; and
+
+     b. You may distribute such Executable Form under the terms of this License,
+        or sublicense it under different terms, provided that the license for
+        the Executable Form does not attempt to limit or alter the recipients’
+        rights in the Source Code Form under this License.
+
+3.3. Distribution of a Larger Work
+
+     You may create and distribute a Larger Work under terms of Your choice,
+     provided that You also comply with the requirements of this License for the
+     Covered Software. If the Larger Work is a combination of Covered Software
+     with a work governed by one or more Secondary Licenses, and the Covered
+     Software is not Incompatible With Secondary Licenses, this License permits
+     You to additionally distribute such Covered Software under the terms of
+     such Secondary License(s), so that the recipient of the Larger Work may, at
+     their option, further distribute the Covered Software under the terms of
+     either this License or such Secondary License(s).
+
+3.4. Notices
+
+     You may not remove or alter the substance of any license notices (including
+     copyright notices, patent notices, disclaimers of warranty, or limitations
+     of liability) contained within the Source Code Form of the Covered
+     Software, except that You may alter any license notices to the extent
+     required to remedy known factual inaccuracies.
+
+3.5. Application of Additional Terms
+
+     You may choose to offer, and to charge a fee for, warranty, support,
+     indemnity or liability obligations to one or more recipients of Covered
+     Software. However, You may do so only on Your own behalf, and not on behalf
+     of any Contributor. You must make it absolutely clear that any such
+     warranty, support, indemnity, or liability obligation is offered by You
+     alone, and You hereby agree to indemnify every Contributor for any
+     liability incurred by such Contributor as a result of warranty, support,
+     indemnity or liability terms You offer. You may include additional
+     disclaimers of warranty and limitations of liability specific to any
+     jurisdiction.
+
+4. Inability to Comply Due to Statute or Regulation
+
+   If it is impossible for You to comply with any of the terms of this License
+   with respect to some or all of the Covered Software due to statute, judicial
+   order, or regulation then You must: (a) comply with the terms of this License
+   to the maximum extent possible; and (b) describe the limitations and the code
+   they affect. Such description must be placed in a text file included with all
+   distributions of the Covered Software under this License. Except to the
+   extent prohibited by statute or regulation, such description must be
+   sufficiently detailed for a recipient of ordinary skill to be able to
+   understand it.
+
+5. Termination
+
+5.1. The rights granted under this License will terminate automatically if You
+     fail to comply with any of its terms. However, if You become compliant,
+     then the rights granted under this License from a particular Contributor
+     are reinstated (a) provisionally, unless and until such Contributor
+     explicitly and finally terminates Your grants, and (b) on an ongoing basis,
+     if such Contributor fails to notify You of the non-compliance by some
+     reasonable means prior to 60 days after You have come back into compliance.
+     Moreover, Your grants from a particular Contributor are reinstated on an
+     ongoing basis if such Contributor notifies You of the non-compliance by
+     some reasonable means, this is the first time You have received notice of
+     non-compliance with this License from such Contributor, and You become
+     compliant prior to 30 days after Your receipt of the notice.
+
+5.2. If You initiate litigation against any entity by asserting a patent
+     infringement claim (excluding declaratory judgment actions, counter-claims,
+     and cross-claims) alleging that a Contributor Version directly or
+     indirectly infringes any patent, then the rights granted to You by any and
+     all Contributors for the Covered Software under Section 2.1 of this License
+     shall terminate.
+
+5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user
+     license agreements (excluding distributors and resellers) which have been
+     validly granted by You or Your distributors under this License prior to
+     termination shall survive termination.
+
+6. Disclaimer of Warranty
+
+   Covered Software is provided under this License on an “as is” basis, without
+   warranty of any kind, either expressed, implied, or statutory, including,
+   without limitation, warranties that the Covered Software is free of defects,
+   merchantable, fit for a particular purpose or non-infringing. The entire
+   risk as to the quality and performance of the Covered Software is with You.
+   Should any Covered Software prove defective in any respect, You (not any
+   Contributor) assume the cost of any necessary servicing, repair, or
+   correction. This disclaimer of warranty constitutes an essential part of this
+   License. No use of  any Covered Software is authorized under this License
+   except under this disclaimer.
+
+7. Limitation of Liability
+
+   Under no circumstances and under no legal theory, whether tort (including
+   negligence), contract, or otherwise, shall any Contributor, or anyone who
+   distributes Covered Software as permitted above, be liable to You for any
+   direct, indirect, special, incidental, or consequential damages of any
+   character including, without limitation, damages for lost profits, loss of
+   goodwill, work stoppage, computer failure or malfunction, or any and all
+   other commercial damages or losses, even if such party shall have been
+   informed of the possibility of such damages. This limitation of liability
+   shall not apply to liability for death or personal injury resulting from such
+   party’s negligence to the extent applicable law prohibits such limitation.
+   Some jurisdictions do not allow the exclusion or limitation of incidental or
+   consequential damages, so this exclusion and limitation may not apply to You.
+
+8. Litigation
+
+   Any litigation relating to this License may be brought only in the courts of
+   a jurisdiction where the defendant maintains its principal place of business
+   and such litigation shall be governed by laws of that jurisdiction, without
+   reference to its conflict-of-law provisions. Nothing in this Section shall
+   prevent a party’s ability to bring cross-claims or counter-claims.
+
+9. Miscellaneous
+
+   This License represents the complete agreement concerning the subject matter
+   hereof. If any provision of this License is held to be unenforceable, such
+   provision shall be reformed only to the extent necessary to make it
+   enforceable. Any law or regulation which provides that the language of a
+   contract shall be construed against the drafter shall not be used to construe
+   this License against a Contributor.
+
+
+10. Versions of the License
+
+10.1. New Versions
+
+      Mozilla Foundation is the license steward. Except as provided in Section
+      10.3, no one other than the license steward has the right to modify or
+      publish new versions of this License. Each version will be given a
+      distinguishing version number.
+
+10.2. Effect of New Versions
+
+      You may distribute the Covered Software under the terms of the version of
+      the License under which You originally received the Covered Software, or
+      under the terms of any subsequent version published by the license
+      steward.
+
+10.3. Modified Versions
+
+      If you create software not governed by this License, and you want to
+      create a new license for such software, you may create and use a modified
+      version of this License if you rename the license and remove any
+      references to the name of the license steward (except to note that such
+      modified license differs from this License).
+
+10.4. Distributing Source Code Form that is Incompatible With Secondary Licenses
+      If You choose to distribute Source Code Form that is Incompatible With
+      Secondary Licenses under the terms of this version of the License, the
+      notice described in Exhibit B of this License must be attached.
+
+Exhibit A - Source Code Form License Notice
+
+      This Source Code Form is subject to the
+      terms of the Mozilla Public License, v.
+      2.0. If a copy of the MPL was not
+      distributed with this file, You can
+      obtain one at
+      http://mozilla.org/MPL/2.0/.
+
+If it is not possible or desirable to put the notice in a particular file, then
+You may include the notice in a location (such as a LICENSE file in a relevant
+directory) where a recipient would be likely to look for such a notice.
+
+You may add additional accurate notices of copyright ownership.
+
+Exhibit B - “Incompatible With Secondary Licenses” Notice
+
+      This Source Code Form is “Incompatible
+      With Secondary Licenses”, as defined by
+      the Mozilla Public License, v. 2.0.
+
diff --git a/vendor/github.com/d2g/dhcp4client/README.md b/vendor/github.com/d2g/dhcp4client/README.md
new file mode 100644
index 0000000..785ac2c
--- /dev/null
+++ b/vendor/github.com/d2g/dhcp4client/README.md
@@ -0,0 +1,8 @@
+dhcp4client [![GoDoc](https://godoc.org/github.com/d2g/dhcp4client?status.svg)](http://godoc.org/github.com/d2g/dhcp4client) [![Coverage Status](https://coveralls.io/repos/d2g/dhcp4client/badge.svg?branch=HEAD)](https://coveralls.io/r/d2g/dhcp4client?branch=HEAD) [![Codeship Status for d2g/dhcp4client](https://codeship.com/projects/d75d9860-b364-0132-bc79-7e1d8cf367b9/status?branch=master)](https://codeship.com/projects/70187)
+===========
+
+DHCP Client
+
+
+###### Thanks to:
+@eyakubovich For AF_PACKET support.
diff --git a/vendor/github.com/d2g/dhcp4client/client.go b/vendor/github.com/d2g/dhcp4client/client.go
new file mode 100644
index 0000000..1d43e30
--- /dev/null
+++ b/vendor/github.com/d2g/dhcp4client/client.go
@@ -0,0 +1,416 @@
+package dhcp4client
+
+import (
+	"bytes"
+	"fmt"
+	"hash/fnv"
+	"math/rand"
+	"net"
+	"sync"
+	"syscall"
+	"time"
+
+	"github.com/d2g/dhcp4"
+)
+
+const (
+	MaxDHCPLen = 576
+)
+
+type Client struct {
+	hardwareAddr  net.HardwareAddr //The HardwareAddr to send in the request.
+	ignoreServers []net.IP         //List of Servers to Ignore requests from.
+	timeout       time.Duration    //Time before we timeout.
+	broadcast     bool             //Set the Bcast flag in BOOTP Flags
+	connection    ConnectionInt    //The Connection Method to use
+	generateXID   func([]byte)     //Function Used to Generate a XID
+}
+
+//Abstracts the type of underlying socket used
+type ConnectionInt interface {
+	Close() error
+	Write(packet []byte) error
+	ReadFrom() ([]byte, net.IP, error)
+	SetReadTimeout(t time.Duration) error
+}
+
+func New(options ...func(*Client) error) (*Client, error) {
+	c := Client{
+		timeout:   time.Second * 10,
+		broadcast: true,
+	}
+
+	err := c.SetOption(options...)
+	if err != nil {
+		return nil, err
+	}
+
+	if c.generateXID == nil {
+		// https://tools.ietf.org/html/rfc2131#section-4.1 explains:
+		//
+		// A DHCP client MUST choose 'xid's in such a way as to minimize the chance
+		// of using an 'xid' identical to one used by another client.
+		//
+		// Hence, seed a random number generator with the current time and hardware
+		// address.
+		h := fnv.New64()
+		h.Write(c.hardwareAddr)
+		seed := int64(h.Sum64()) + time.Now().Unix()
+		rnd := rand.New(rand.NewSource(seed))
+		var rndMu sync.Mutex
+		c.generateXID = func(b []byte) {
+			rndMu.Lock()
+			defer rndMu.Unlock()
+			rnd.Read(b)
+		}
+	}
+
+	//if connection hasn't been set as an option create the default.
+	if c.connection == nil {
+		conn, err := NewInetSock()
+		if err != nil {
+			return nil, err
+		}
+		c.connection = conn
+	}
+
+	return &c, nil
+}
+
+func (c *Client) SetOption(options ...func(*Client) error) error {
+	for _, opt := range options {
+		if err := opt(c); err != nil {
+			return err
+		}
+	}
+	return nil
+}
+
+func Timeout(t time.Duration) func(*Client) error {
+	return func(c *Client) error {
+		c.timeout = t
+		return nil
+	}
+}
+
+func IgnoreServers(s []net.IP) func(*Client) error {
+	return func(c *Client) error {
+		c.ignoreServers = s
+		return nil
+	}
+}
+
+func HardwareAddr(h net.HardwareAddr) func(*Client) error {
+	return func(c *Client) error {
+		c.hardwareAddr = h
+		return nil
+	}
+}
+
+func Broadcast(b bool) func(*Client) error {
+	return func(c *Client) error {
+		c.broadcast = b
+		return nil
+	}
+}
+
+func Connection(conn ConnectionInt) func(*Client) error {
+	return func(c *Client) error {
+		c.connection = conn
+		return nil
+	}
+}
+
+func GenerateXID(g func([]byte)) func(*Client) error {
+	return func(c *Client) error {
+		c.generateXID = g
+		return nil
+	}
+}
+
+//Close Connections
+func (c *Client) Close() error {
+	if c.connection != nil {
+		return c.connection.Close()
+	}
+	return nil
+}
+
+//Send the Discovery Packet to the Broadcast Channel
+func (c *Client) SendDiscoverPacket() (dhcp4.Packet, error) {
+	discoveryPacket := c.DiscoverPacket()
+	discoveryPacket.PadToMinSize()
+
+	return discoveryPacket, c.SendPacket(discoveryPacket)
+}
+
+// TimeoutError records a timeout when waiting for a DHCP packet.
+type TimeoutError struct {
+	Timeout time.Duration
+}
+
+func (te *TimeoutError) Error() string {
+	return fmt.Sprintf("no DHCP packet received within %v", te.Timeout)
+}
+
+//Retreive Offer...
+//Wait for the offer for a specific Discovery Packet.
+func (c *Client) GetOffer(discoverPacket *dhcp4.Packet) (dhcp4.Packet, error) {
+	start := time.Now()
+
+	for {
+		timeout := c.timeout - time.Since(start)
+		if timeout < 0 {
+			return dhcp4.Packet{}, &TimeoutError{Timeout: c.timeout}
+		}
+
+		c.connection.SetReadTimeout(timeout)
+		readBuffer, source, err := c.connection.ReadFrom()
+		if err != nil {
+			if errno, ok := err.(syscall.Errno); ok && errno == syscall.EAGAIN {
+				return dhcp4.Packet{}, &TimeoutError{Timeout: c.timeout}
+			}
+			return dhcp4.Packet{}, err
+		}
+
+		offerPacket := dhcp4.Packet(readBuffer)
+		offerPacketOptions := offerPacket.ParseOptions()
+
+		// Ignore Servers in my Ignore list
+		for _, ignoreServer := range c.ignoreServers {
+			if source.Equal(ignoreServer) {
+				continue
+			}
+
+			if offerPacket.SIAddr().Equal(ignoreServer) {
+				continue
+			}
+		}
+
+		if len(offerPacketOptions[dhcp4.OptionDHCPMessageType]) < 1 || dhcp4.MessageType(offerPacketOptions[dhcp4.OptionDHCPMessageType][0]) != dhcp4.Offer || !bytes.Equal(discoverPacket.XId(), offerPacket.XId()) {
+			continue
+		}
+
+		return offerPacket, nil
+	}
+
+}
+
+//Send Request Based On the offer Received.
+func (c *Client) SendRequest(offerPacket *dhcp4.Packet) (dhcp4.Packet, error) {
+	requestPacket := c.RequestPacket(offerPacket)
+	requestPacket.PadToMinSize()
+
+	return requestPacket, c.SendPacket(requestPacket)
+}
+
+//Retreive Acknowledgement
+//Wait for the offer for a specific Request Packet.
+func (c *Client) GetAcknowledgement(requestPacket *dhcp4.Packet) (dhcp4.Packet, error) {
+	start := time.Now()
+
+	for {
+		timeout := c.timeout - time.Since(start)
+		if timeout < 0 {
+			return dhcp4.Packet{}, &TimeoutError{Timeout: c.timeout}
+		}
+
+		c.connection.SetReadTimeout(timeout)
+		readBuffer, source, err := c.connection.ReadFrom()
+		if err != nil {
+			if errno, ok := err.(syscall.Errno); ok && errno == syscall.EAGAIN {
+				return dhcp4.Packet{}, &TimeoutError{Timeout: c.timeout}
+			}
+			return dhcp4.Packet{}, err
+		}
+
+		acknowledgementPacket := dhcp4.Packet(readBuffer)
+		acknowledgementPacketOptions := acknowledgementPacket.ParseOptions()
+
+		// Ignore Servers in my Ignore list
+		for _, ignoreServer := range c.ignoreServers {
+			if source.Equal(ignoreServer) {
+				continue
+			}
+
+			if acknowledgementPacket.SIAddr().Equal(ignoreServer) {
+				continue
+			}
+		}
+
+		if !bytes.Equal(requestPacket.XId(), acknowledgementPacket.XId()) || len(acknowledgementPacketOptions[dhcp4.OptionDHCPMessageType]) < 1 || (dhcp4.MessageType(acknowledgementPacketOptions[dhcp4.OptionDHCPMessageType][0]) != dhcp4.ACK && dhcp4.MessageType(acknowledgementPacketOptions[dhcp4.OptionDHCPMessageType][0]) != dhcp4.NAK) {
+			continue
+		}
+
+		return acknowledgementPacket, nil
+	}
+}
+
+//Send Decline to the received acknowledgement.
+func (c *Client) SendDecline(acknowledgementPacket *dhcp4.Packet) (dhcp4.Packet, error) {
+	declinePacket := c.DeclinePacket(acknowledgementPacket)
+	declinePacket.PadToMinSize()
+
+	return declinePacket, c.SendPacket(declinePacket)
+}
+
+//Send a DHCP Packet.
+func (c *Client) SendPacket(packet dhcp4.Packet) error {
+	return c.connection.Write(packet)
+}
+
+//Create Discover Packet
+func (c *Client) DiscoverPacket() dhcp4.Packet {
+	messageid := make([]byte, 4)
+	c.generateXID(messageid)
+
+	packet := dhcp4.NewPacket(dhcp4.BootRequest)
+	packet.SetCHAddr(c.hardwareAddr)
+	packet.SetXId(messageid)
+	packet.SetBroadcast(c.broadcast)
+
+	packet.AddOption(dhcp4.OptionDHCPMessageType, []byte{byte(dhcp4.Discover)})
+	//packet.PadToMinSize()
+	return packet
+}
+
+//Create Request Packet
+func (c *Client) RequestPacket(offerPacket *dhcp4.Packet) dhcp4.Packet {
+	offerOptions := offerPacket.ParseOptions()
+
+	packet := dhcp4.NewPacket(dhcp4.BootRequest)
+	packet.SetCHAddr(c.hardwareAddr)
+
+	packet.SetXId(offerPacket.XId())
+	packet.SetCIAddr(offerPacket.CIAddr())
+	packet.SetSIAddr(offerPacket.SIAddr())
+
+	packet.SetBroadcast(c.broadcast)
+	packet.AddOption(dhcp4.OptionDHCPMessageType, []byte{byte(dhcp4.Request)})
+	packet.AddOption(dhcp4.OptionRequestedIPAddress, (offerPacket.YIAddr()).To4())
+	packet.AddOption(dhcp4.OptionServerIdentifier, offerOptions[dhcp4.OptionServerIdentifier])
+
+	return packet
+}
+
+//Create Request Packet For a Renew
+func (c *Client) RenewalRequestPacket(acknowledgement *dhcp4.Packet) dhcp4.Packet {
+	messageid := make([]byte, 4)
+	c.generateXID(messageid)
+
+	acknowledgementOptions := acknowledgement.ParseOptions()
+
+	packet := dhcp4.NewPacket(dhcp4.BootRequest)
+	packet.SetCHAddr(acknowledgement.CHAddr())
+
+	packet.SetXId(messageid)
+	packet.SetCIAddr(acknowledgement.YIAddr())
+	packet.SetSIAddr(acknowledgement.SIAddr())
+
+	packet.SetBroadcast(c.broadcast)
+	packet.AddOption(dhcp4.OptionDHCPMessageType, []byte{byte(dhcp4.Request)})
+	packet.AddOption(dhcp4.OptionRequestedIPAddress, (acknowledgement.YIAddr()).To4())
+	packet.AddOption(dhcp4.OptionServerIdentifier, acknowledgementOptions[dhcp4.OptionServerIdentifier])
+
+	return packet
+}
+
+//Create Release Packet For a Release
+func (c *Client) ReleasePacket(acknowledgement *dhcp4.Packet) dhcp4.Packet {
+	messageid := make([]byte, 4)
+	c.generateXID(messageid)
+
+	acknowledgementOptions := acknowledgement.ParseOptions()
+
+	packet := dhcp4.NewPacket(dhcp4.BootRequest)
+	packet.SetCHAddr(acknowledgement.CHAddr())
+
+	packet.SetXId(messageid)
+	packet.SetCIAddr(acknowledgement.YIAddr())
+
+	packet.AddOption(dhcp4.OptionDHCPMessageType, []byte{byte(dhcp4.Release)})
+	packet.AddOption(dhcp4.OptionServerIdentifier, acknowledgementOptions[dhcp4.OptionServerIdentifier])
+
+	return packet
+}
+
+//Create Decline Packet
+func (c *Client) DeclinePacket(acknowledgement *dhcp4.Packet) dhcp4.Packet {
+	messageid := make([]byte, 4)
+	c.generateXID(messageid)
+
+	acknowledgementOptions := acknowledgement.ParseOptions()
+
+	packet := dhcp4.NewPacket(dhcp4.BootRequest)
+	packet.SetCHAddr(acknowledgement.CHAddr())
+	packet.SetXId(messageid)
+
+	packet.AddOption(dhcp4.OptionDHCPMessageType, []byte{byte(dhcp4.Decline)})
+	packet.AddOption(dhcp4.OptionRequestedIPAddress, (acknowledgement.YIAddr()).To4())
+	packet.AddOption(dhcp4.OptionServerIdentifier, acknowledgementOptions[dhcp4.OptionServerIdentifier])
+
+	return packet
+}
+
+//Lets do a Full DHCP Request.
+func (c *Client) Request() (bool, dhcp4.Packet, error) {
+	discoveryPacket, err := c.SendDiscoverPacket()
+	if err != nil {
+		return false, discoveryPacket, err
+	}
+
+	offerPacket, err := c.GetOffer(&discoveryPacket)
+	if err != nil {
+		return false, offerPacket, err
+	}
+
+	requestPacket, err := c.SendRequest(&offerPacket)
+	if err != nil {
+		return false, requestPacket, err
+	}
+
+	acknowledgement, err := c.GetAcknowledgement(&requestPacket)
+	if err != nil {
+		return false, acknowledgement, err
+	}
+
+	acknowledgementOptions := acknowledgement.ParseOptions()
+	if dhcp4.MessageType(acknowledgementOptions[dhcp4.OptionDHCPMessageType][0]) != dhcp4.ACK {
+		return false, acknowledgement, nil
+	}
+
+	return true, acknowledgement, nil
+}
+
+//Renew a lease backed on the Acknowledgement Packet.
+//Returns Sucessfull, The AcknoledgementPacket, Any Errors
+func (c *Client) Renew(acknowledgement dhcp4.Packet) (bool, dhcp4.Packet, error) {
+	renewRequest := c.RenewalRequestPacket(&acknowledgement)
+	renewRequest.PadToMinSize()
+
+	err := c.SendPacket(renewRequest)
+	if err != nil {
+		return false, renewRequest, err
+	}
+
+	newAcknowledgement, err := c.GetAcknowledgement(&renewRequest)
+	if err != nil {
+		return false, newAcknowledgement, err
+	}
+
+	newAcknowledgementOptions := newAcknowledgement.ParseOptions()
+	if dhcp4.MessageType(newAcknowledgementOptions[dhcp4.OptionDHCPMessageType][0]) != dhcp4.ACK {
+		return false, newAcknowledgement, nil
+	}
+
+	return true, newAcknowledgement, nil
+}
+
+//Release a lease backed on the Acknowledgement Packet.
+//Returns Any Errors
+func (c *Client) Release(acknowledgement dhcp4.Packet) error {
+	release := c.ReleasePacket(&acknowledgement)
+	release.PadToMinSize()
+
+	return c.SendPacket(release)
+}
diff --git a/vendor/github.com/d2g/dhcp4client/client_linux_test.go b/vendor/github.com/d2g/dhcp4client/client_linux_test.go
new file mode 100644
index 0000000..0b1b281
--- /dev/null
+++ b/vendor/github.com/d2g/dhcp4client/client_linux_test.go
@@ -0,0 +1,92 @@
+package dhcp4client_test
+
+import (
+	"log"
+	"net"
+	"testing"
+	"syscall"
+
+	"github.com/d2g/dhcp4"
+	"github.com/d2g/dhcp4client"
+)
+
+//Example Client
+func Test_ExampleLinuxClient(test *testing.T) {
+	var err error
+
+	m, err := net.ParseMAC("08-00-27-00-A8-E8")
+	if err != nil {
+		log.Printf("MAC Error:%v\n", err)
+	}
+
+	//Create a connection to use
+	c, err := dhcp4client.NewPacketSock(2)
+	if err != nil {
+		test.Error("Client Connection Generation:" + err.Error())
+	}
+	defer c.Close()
+
+	exampleClient, err := dhcp4client.New(dhcp4client.HardwareAddr(m), dhcp4client.Connection(c))
+	if err != nil {
+		test.Fatalf("Error:%v\n", err)
+	}
+	defer exampleClient.Close()
+
+	success := false
+
+	discoveryPacket, err := exampleClient.SendDiscoverPacket()
+	test.Logf("Discovery:%v\n", discoveryPacket)
+
+	if err != nil {
+		sc, ok := err.(syscall.Errno)
+		if ok {
+			//Don't report a network down
+			if sc != syscall.ENETDOWN {
+				test.Fatalf("Discovery Error:%v\n", err)
+			}
+		} else {
+			test.Fatalf("Discovery Error:%v\n", err)
+		}
+
+	}
+
+	offerPacket, err := exampleClient.GetOffer(&discoveryPacket)
+	if err != nil {
+		test.Fatalf("Offer Error:%v\n", err)
+	}
+
+	requestPacket, err := exampleClient.SendRequest(&offerPacket)
+	if err != nil {
+		test.Fatalf("Send Offer Error:%v\n", err)
+	}
+
+	acknowledgementpacket, err := exampleClient.GetAcknowledgement(&requestPacket)
+	if err != nil {
+		test.Fatalf("Get Ack Error:%v\n", err)
+	}
+
+	acknowledgementOptions := acknowledgementpacket.ParseOptions()
+	if dhcp4.MessageType(acknowledgementOptions[dhcp4.OptionDHCPMessageType][0]) != dhcp4.ACK {
+		test.Fatalf("Not Acknoledged")
+	} else {
+		success = true
+	}
+
+	test.Logf("Packet:%v\n", acknowledgementpacket)
+
+	if err != nil {
+		networkError, ok := err.(net.Error)
+		if ok && networkError.Timeout() {
+			test.Log("Test Skipping as it didn't find a DHCP Server")
+			test.SkipNow()
+		}
+		test.Fatalf("Error:%v\n", err)
+	}
+
+	if !success {
+		test.Error("We didn't sucessfully get a DHCP Lease?")
+	} else {
+		log.Printf("IP Received:%v\n", acknowledgementpacket.YIAddr().String())
+	}
+
+}
diff --git a/vendor/github.com/d2g/dhcp4client/client_test.go b/vendor/github.com/d2g/dhcp4client/client_test.go
new file mode 100644
index 0000000..b696501
--- /dev/null
+++ b/vendor/github.com/d2g/dhcp4client/client_test.go
@@ -0,0 +1,116 @@
+package dhcp4client_test
+
+import (
+	"log"
+	"net"
+	"testing"
+
+	"github.com/d2g/dhcp4client"
+)
+
+//Example Client
+func Test_ExampleClient(test *testing.T) {
+	var err error
+
+	m, err := net.ParseMAC("08-00-27-00-A8-E8")
+	if err != nil {
+		log.Printf("MAC Error:%v\n", err)
+	}
+
+	//Create a connection to use
+	//We need to set the connection ports to 1068 and 1067 so we don't need root access
+	c, err := dhcp4client.NewInetSock(dhcp4client.SetLocalAddr(net.UDPAddr{IP: net.IPv4(0, 0, 0, 0), Port: 1068}), dhcp4client.SetRemoteAddr(net.UDPAddr{IP: net.IPv4bcast, Port: 1067}))
+	if err != nil {
+		test.Error("Client Connection Generation:" + err.Error())
+	}
+	defer c.Close()
+
+	exampleClient, err := dhcp4client.New(dhcp4client.HardwareAddr(m), dhcp4client.Connection(c))
+	if err != nil {
+		test.Fatalf("Error:%v\n", err)
+	}
+	defer exampleClient.Close()
+
+	success, acknowledgementpacket, err := exampleClient.Request()
+
+	test.Logf("Success:%v\n", success)
+	test.Logf("Packet:%v\n", acknowledgementpacket)
+
+	if err != nil {
+		networkError, ok := err.(*net.OpError)
+		if ok && networkError.Timeout() {
+			test.Log("Test Skipping as it didn't find a DHCP Server")
+			test.SkipNow()
+		}
+		test.Fatalf("Error:%v\n", err)
+	}
+
+	if !success {
+		test.Error("We didn't sucessfully get a DHCP Lease?")
+	} else {
+		log.Printf("IP Received:%v\n", acknowledgementpacket.YIAddr().String())
+	}
+
+	test.Log("Start Renewing Lease")
+	success, acknowledgementpacket, err = exampleClient.Renew(acknowledgementpacket)
+	if err != nil {
+		networkError, ok := err.(*net.OpError)
+		if ok && networkError.Timeout() {
+			test.Log("Renewal Failed! Because it didn't find the DHCP server very Strange")
+			test.Errorf("Error" + err.Error())
+		}
+		test.Fatalf("Error:%v\n", err)
+	}
+
+	if !success {
+		test.Error("We didn't sucessfully Renew a DHCP Lease?")
+	} else {
+		log.Printf("IP Received:%v\n", acknowledgementpacket.YIAddr().String())
+	}
+
+}
+
+//Example Client (With MathGID)
+func Test_ExampleClientWithMathGenerateXID(test *testing.T) {
+	var err error
+
+	m, err := net.ParseMAC("08-00-27-00-A8-E8")
+	if err != nil {
+		log.Printf("MAC Error:%v\n", err)
+	}
+
+	//Create a connection to use
+	//We need to set the connection ports to 1068 and 1067 so we don't need root access
+	c, err := dhcp4client.NewInetSock(dhcp4client.SetLocalAddr(net.UDPAddr{IP: net.IPv4(0, 0, 0, 0), Port: 1068}), dhcp4client.SetRemoteAddr(net.UDPAddr{IP: net.IPv4bcast, Port: 1067}))
+	if err != nil {
+		test.Error("Client Connection Generation:" + err.Error())
+	}
+	defer c.Close()
+
+	// If you ar using MathGenerateXID then you are responsible for seeding math/rand
+	exampleClient, err := dhcp4client.New(dhcp4client.HardwareAddr(m), dhcp4client.Connection(c), dhcp4client.GenerateXID(dhcp4client.MathGenerateXID))
+	if err != nil {
+		test.Fatalf("Error:%v\n", err)
+	}
+	defer exampleClient.Close()
+
+	success, acknowledgementpacket, err := exampleClient.Request()
+
+	test.Logf("Success:%v\n", success)
+	test.Logf("Packet:%v\n", acknowledgementpacket)
+
+	if err != nil {
+		networkError, ok := err.(*net.OpError)
+		if ok && networkError.Timeout() {
+			test.Log("Test Skipping as it didn't find a DHCP Server")
+			test.SkipNow()
+		}
+		test.Fatalf("Error:%v\n", err)
+	}
+
+	if !success {
+		test.Error("We didn't sucessfully get a DHCP Lease?")
+	} else {
+		log.Printf("IP Received:%v\n", acknowledgementpacket.YIAddr().String())
+	}
+}
diff --git a/vendor/github.com/d2g/dhcp4client/generatexid.go b/vendor/github.com/d2g/dhcp4client/generatexid.go
new file mode 100644
index 0000000..6e9ffbc
--- /dev/null
+++ b/vendor/github.com/d2g/dhcp4client/generatexid.go
@@ -0,0 +1,18 @@
+package dhcp4client
+
+import (
+	cryptorand "crypto/rand"
+	mathrand "math/rand"
+)
+
+func CryptoGenerateXID(b []byte) {
+	if _, err := cryptorand.Read(b); err != nil {
+		panic(err)
+	}
+}
+
+func MathGenerateXID(b []byte) {
+	if _, err := mathrand.Read(b); err != nil {
+		panic(err)
+	}
+}
diff --git a/vendor/github.com/d2g/dhcp4client/generatexid_test.go b/vendor/github.com/d2g/dhcp4client/generatexid_test.go
new file mode 100644
index 0000000..9b5164e
--- /dev/null
+++ b/vendor/github.com/d2g/dhcp4client/generatexid_test.go
@@ -0,0 +1,29 @@
+package dhcp4client_test
+
+import (
+	"bytes"
+	"math/rand"
+	"testing"
+
+	"github.com/d2g/dhcp4client"
+)
+
+func Test_GenerateXID(t *testing.T) {
+	//Set the math seed so we always get the same result.
+	rand.Seed(1)
+
+	crypto_messageid := make([]byte, 4)
+	dhcp4client.CryptoGenerateXID(crypto_messageid)
+
+	t.Logf("Crypto Token: %v", crypto_messageid)
+
+	math_messageid := make([]byte, 4)
+	dhcp4client.MathGenerateXID(math_messageid)
+
+	//Math token shouldn't change as we don't seed it.
+	if !bytes.Equal(math_messageid, []byte{82, 253, 252, 7}) {
+		t.Errorf("Math Token was %v, expected %v", math_messageid, []byte{82, 253, 252, 7})
+		t.Fail()
+	}
+
+}
diff --git a/vendor/github.com/d2g/dhcp4client/inetsock.go b/vendor/github.com/d2g/dhcp4client/inetsock.go
new file mode 100644
index 0000000..293f186
--- /dev/null
+++ b/vendor/github.com/d2g/dhcp4client/inetsock.go
@@ -0,0 +1,75 @@
+package dhcp4client
+
+import (
+	"net"
+	"time"
+)
+
+type inetSock struct {
+	*net.UDPConn
+
+	laddr net.UDPAddr
+	raddr net.UDPAddr
+}
+
+func NewInetSock(options ...func(*inetSock) error) (*inetSock, error) {
+	c := &inetSock{
+		laddr: net.UDPAddr{IP: net.IPv4(0, 0, 0, 0), Port: 68},
+		raddr: net.UDPAddr{IP: net.IPv4bcast, Port: 67},
+	}
+
+	err := c.setOption(options...)
+	if err != nil {
+		return nil, err
+	}
+
+	conn, err := net.ListenUDP("udp4", &c.laddr)
+	if err != nil {
+		return nil, err
+	}
+
+	c.UDPConn = conn
+	return c, err
+}
+
+func (c *inetSock) setOption(options ...func(*inetSock) error) error {
+	for _, opt := range options {
+		if err := opt(c); err != nil {
+			return err
+		}
+	}
+	return nil
+}
+
+func SetLocalAddr(l net.UDPAddr) func(*inetSock) error {
+	return func(c *inetSock) error {
+		c.laddr = l
+		return nil
+	}
+}
+
+func SetRemoteAddr(r net.UDPAddr) func(*inetSock) error {
+	return func(c *inetSock) error {
+		c.raddr = r
+		return nil
+	}
+}
+
+func (c *inetSock) Write(packet []byte) error {
+	_, err := c.WriteToUDP(packet, &c.raddr)
+	return err
+}
+
+func (c *inetSock) ReadFrom() ([]byte, net.IP, error) {
+	readBuffer := make([]byte, MaxDHCPLen)
+	n, source, err := c.ReadFromUDP(readBuffer)
+	if source != nil {
+		return readBuffer[:n], source.IP, err
+	} else {
+		return readBuffer[:n], net.IP{}, err
+	}
+}
+
+func (c *inetSock) SetReadTimeout(t time.Duration) error {
+	return c.SetReadDeadline(time.Now().Add(t))
+}
diff --git a/vendor/github.com/d2g/dhcp4client/pktsock_linux.go b/vendor/github.com/d2g/dhcp4client/pktsock_linux.go
new file mode 100644
index 0000000..99b5352
--- /dev/null
+++ b/vendor/github.com/d2g/dhcp4client/pktsock_linux.go
@@ -0,0 +1,147 @@
+package dhcp4client
+
+import (
+	"encoding/binary"
+	"math/rand"
+	"net"
+	"time"
+
+	"golang.org/x/sys/unix"
+)
+
+const (
+	minIPHdrLen = 20
+	maxIPHdrLen = 60
+	udpHdrLen   = 8
+	ip4Ver      = 0x40
+	ttl         = 16
+	srcPort     = 68
+	dstPort     = 67
+)
+
+var (
+	bcastMAC = []byte{255, 255, 255, 255, 255, 255}
+)
+
+// abstracts AF_PACKET
+type packetSock struct {
+	fd      int
+	ifindex int
+}
+
+func NewPacketSock(ifindex int) (*packetSock, error) {
+	fd, err := unix.Socket(unix.AF_PACKET, unix.SOCK_DGRAM, int(swap16(unix.ETH_P_IP)))
+	if err != nil {
+		return nil, err
+	}
+
+	addr := unix.SockaddrLinklayer{
+		Ifindex:  ifindex,
+		Protocol: swap16(unix.ETH_P_IP),
+	}
+
+	if err = unix.Bind(fd, &addr); err != nil {
+		return nil, err
+	}
+
+	return &packetSock{
+		fd:      fd,
+		ifindex: ifindex,
+	}, nil
+}
+
+func (pc *packetSock) Close() error {
+	return unix.Close(pc.fd)
+}
+
+func (pc *packetSock) Write(packet []byte) error {
+	lladdr := unix.SockaddrLinklayer{
+		Ifindex:  pc.ifindex,
+		Protocol: swap16(unix.ETH_P_IP),
+		Halen:    uint8(len(bcastMAC)),
+	}
+	copy(lladdr.Addr[:], bcastMAC)
+
+	pkt := make([]byte, minIPHdrLen+udpHdrLen+len(packet))
+
+	fillIPHdr(pkt[0:minIPHdrLen], udpHdrLen+uint16(len(packet)))
+	fillUDPHdr(pkt[minIPHdrLen:minIPHdrLen+udpHdrLen], uint16(len(packet)))
+
+	// payload
+	copy(pkt[minIPHdrLen+udpHdrLen:len(pkt)], packet)
+
+	return unix.Sendto(pc.fd, pkt, 0, &lladdr)
+}
+
+func (pc *packetSock) ReadFrom() ([]byte, net.IP, error) {
+	pkt := make([]byte, maxIPHdrLen+udpHdrLen+MaxDHCPLen)
+	n, _, err := unix.Recvfrom(pc.fd, pkt, 0)
+	if err != nil {
+		return nil, nil, err
+	}
+
+	// IP hdr len
+	ihl := int(pkt[0]&0x0F) * 4
+	// Source IP address
+	src := net.IP(pkt[12:16])
+
+	return pkt[ihl+udpHdrLen : n], src, nil
+}
+
+func (pc *packetSock) SetReadTimeout(t time.Duration) error {
+
+	tv := unix.NsecToTimeval(t.Nanoseconds())
+	return unix.SetsockoptTimeval(pc.fd, unix.SOL_SOCKET, unix.SO_RCVTIMEO, &tv)
+}
+
+// compute's 1's complement checksum
+func chksum(p []byte, csum []byte) {
+	cklen := len(p)
+	s := uint32(0)
+	for i := 0; i < (cklen - 1); i += 2 {
+		s += uint32(p[i+1])<<8 | uint32(p[i])
+	}
+	if cklen&1 == 1 {
+		s += uint32(p[cklen-1])
+	}
+	s = (s >> 16) + (s & 0xffff)
+	s = s + (s >> 16)
+	s = ^s
+
+	csum[0] = uint8(s & 0xff)
+	csum[1] = uint8(s >> 8)
+}
+
+func fillIPHdr(hdr []byte, payloadLen uint16) {
+	// version + IHL
+	hdr[0] = ip4Ver | (minIPHdrLen / 4)
+	// total length
+	binary.BigEndian.PutUint16(hdr[2:4], uint16(len(hdr))+payloadLen)
+	// identification
+	if _, err := rand.Read(hdr[4:5]); err != nil {
+		panic(err)
+	}
+	// TTL
+	hdr[8] = 16
+	// Protocol
+	hdr[9] = unix.IPPROTO_UDP
+	// dst IP
+	copy(hdr[16:20], net.IPv4bcast.To4())
+	// compute IP hdr checksum
+	chksum(hdr[0:len(hdr)], hdr[10:12])
+}
+
+func fillUDPHdr(hdr []byte, payloadLen uint16) {
+	// src port
+	binary.BigEndian.PutUint16(hdr[0:2], srcPort)
+	// dest port
+	binary.BigEndian.PutUint16(hdr[2:4], dstPort)
+	// length
+	binary.BigEndian.PutUint16(hdr[4:6], udpHdrLen+payloadLen)
+}
+
+func swap16(x uint16) uint16 {
+	var b [2]byte
+	binary.BigEndian.PutUint16(b[:], x)
+	return binary.LittleEndian.Uint16(b[:])
+}
diff --git a/vendor/github.com/golang/glog/LICENSE b/vendor/github.com/golang/glog/LICENSE
deleted file mode 100644
index 37ec93a..0000000
--- a/vendor/github.com/golang/glog/LICENSE
+++ /dev/null
@@ -1,191 +0,0 @@
-Apache License
-Version 2.0, January 2004
-http://www.apache.org/licenses/
-
-TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-1. Definitions.
-
-"License" shall mean the terms and conditions for use, reproduction, and
-distribution as defined by Sections 1 through 9 of this document.
-
-"Licensor" shall mean the copyright owner or entity authorized by the copyright
-owner that is granting the License.
-
-"Legal Entity" shall mean the union of the acting entity and all other entities
-that control, are controlled by, or are under common control with that entity.
-For the purposes of this definition, "control" means (i) the power, direct or
-indirect, to cause the direction or management of such entity, whether by
-contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the
-outstanding shares, or (iii) beneficial ownership of such entity.
-
-"You" (or "Your") shall mean an individual or Legal Entity exercising
-permissions granted by this License.
-
-"Source" form shall mean the preferred form for making modifications, including
-but not limited to software source code, documentation source, and configuration
-files.
-
-"Object" form shall mean any form resulting from mechanical transformation or
-translation of a Source form, including but not limited to compiled object code,
-generated documentation, and conversions to other media types.
-
-"Work" shall mean the work of authorship, whether in Source or Object form, made
-available under the License, as indicated by a copyright notice that is included
-in or attached to the work (an example is provided in the Appendix below).
-
-"Derivative Works" shall mean any work, whether in Source or Object form, that
-is based on (or derived from) the Work and for which the editorial revisions,
-annotations, elaborations, or other modifications represent, as a whole, an
-original work of authorship. For the purposes of this License, Derivative Works
-shall not include works that remain separable from, or merely link (or bind by
-name) to the interfaces of, the Work and Derivative Works thereof.
-
-"Contribution" shall mean any work of authorship, including the original version
-of the Work and any modifications or additions to that Work or Derivative Works
-thereof, that is intentionally submitted to Licensor for inclusion in the Work
-by the copyright owner or by an individual or Legal Entity authorized to submit
-on behalf of the copyright owner. For the purposes of this definition,
-"submitted" means any form of electronic, verbal, or written communication sent
-to the Licensor or its representatives, including but not limited to
-communication on electronic mailing lists, source code control systems, and
-issue tracking systems that are managed by, or on behalf of, the Licensor for
-the purpose of discussing and improving the Work, but excluding communication
-that is conspicuously marked or otherwise designated in writing by the copyright
-owner as "Not a Contribution."
-
-"Contributor" shall mean Licensor and any individual or Legal Entity on behalf
-of whom a Contribution has been received by Licensor and subsequently
-incorporated within the Work.
-
-2. Grant of Copyright License.
-
-Subject to the terms and conditions of this License, each Contributor hereby
-grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
-irrevocable copyright license to reproduce, prepare Derivative Works of,
-publicly display, publicly perform, sublicense, and distribute the Work and such
-Derivative Works in Source or Object form.
-
-3. Grant of Patent License.
-
-Subject to the terms and conditions of this License, each Contributor hereby
-grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
-irrevocable (except as stated in this section) patent license to make, have
-made, use, offer to sell, sell, import, and otherwise transfer the Work, where
-such license applies only to those patent claims licensable by such Contributor
-that are necessarily infringed by their Contribution(s) alone or by combination
-of their Contribution(s) with the Work to which such Contribution(s) was
-submitted. If You institute patent litigation against any entity (including a
-cross-claim or counterclaim in a lawsuit) alleging that the Work or a
-Contribution incorporated within the Work constitutes direct or contributory
-patent infringement, then any patent licenses granted to You under this License
-for that Work shall terminate as of the date such litigation is filed.
-
-4. Redistribution.
-
-You may reproduce and distribute copies of the Work or Derivative Works thereof
-in any medium, with or without modifications, and in Source or Object form,
-provided that You meet the following conditions:
-
-You must give any other recipients of the Work or Derivative Works a copy of
-this License; and
-You must cause any modified files to carry prominent notices stating that You
-changed the files; and
-You must retain, in the Source form of any Derivative Works that You distribute,
-all copyright, patent, trademark, and attribution notices from the Source form
-of the Work, excluding those notices that do not pertain to any part of the
-Derivative Works; and
-If the Work includes a "NOTICE" text file as part of its distribution, then any
-Derivative Works that You distribute must include a readable copy of the
-attribution notices contained within such NOTICE file, excluding those notices
-that do not pertain to any part of the Derivative Works, in at least one of the
-following places: within a NOTICE text file distributed as part of the
-Derivative Works; within the Source form or documentation, if provided along
-with the Derivative Works; or, within a display generated by the Derivative
-Works, if and wherever such third-party notices normally appear. The contents of
-the NOTICE file are for informational purposes only and do not modify the
-License. You may add Your own attribution notices within Derivative Works that
-You distribute, alongside or as an addendum to the NOTICE text from the Work,
-provided that such additional attribution notices cannot be construed as
-modifying the License.
-You may add Your own copyright statement to Your modifications and may provide
-additional or different license terms and conditions for use, reproduction, or
-distribution of Your modifications, or for any such Derivative Works as a whole,
-provided Your use, reproduction, and distribution of the Work otherwise complies
-with the conditions stated in this License.
-
-5. Submission of Contributions.
-
-Unless You explicitly state otherwise, any Contribution intentionally submitted
-for inclusion in the Work by You to the Licensor shall be under the terms and
-conditions of this License, without any additional terms or conditions.
-Notwithstanding the above, nothing herein shall supersede or modify the terms of
-any separate license agreement you may have executed with Licensor regarding
-such Contributions.
-
-6. Trademarks.
-
-This License does not grant permission to use the trade names, trademarks,
-service marks, or product names of the Licensor, except as required for
-reasonable and customary use in describing the origin of the Work and
-reproducing the content of the NOTICE file.
-
-7. Disclaimer of Warranty.
-
-Unless required by applicable law or agreed to in writing, Licensor provides the
-Work (and each Contributor provides its Contributions) on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied,
-including, without limitation, any warranties or conditions of TITLE,
-NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are
-solely responsible for determining the appropriateness of using or
-redistributing the Work and assume any risks associated with Your exercise of
-permissions under this License.
-
-8. Limitation of Liability.
-
-In no event and under no legal theory, whether in tort (including negligence),
-contract, or otherwise, unless required by applicable law (such as deliberate
-and grossly negligent acts) or agreed to in writing, shall any Contributor be
-liable to You for damages, including any direct, indirect, special, incidental,
-or consequential damages of any character arising as a result of this License or
-out of the use or inability to use the Work (including but not limited to
-damages for loss of goodwill, work stoppage, computer failure or malfunction, or
-any and all other commercial damages or losses), even if such Contributor has
-been advised of the possibility of such damages.
-
-9. Accepting Warranty or Additional Liability.
-
-While redistributing the Work or Derivative Works thereof, You may choose to
-offer, and charge a fee for, acceptance of support, warranty, indemnity, or
-other liability obligations and/or rights consistent with this License. However,
-in accepting such obligations, You may act only on Your own behalf and on Your
-sole responsibility, not on behalf of any other Contributor, and only if You
-agree to indemnify, defend, and hold each Contributor harmless for any liability
-incurred by, or claims asserted against, such Contributor by reason of your
-accepting any such warranty or additional liability.
-
-END OF TERMS AND CONDITIONS
-
-APPENDIX: How to apply the Apache License to your work
-
-To apply the Apache License to your work, attach the following boilerplate
-notice, with the fields enclosed by brackets "[]" replaced with your own
-identifying information. (Don't include the brackets!) The text should be
-enclosed in the appropriate comment syntax for the file format. We also
-recommend that a file or class name and description of purpose be included on
-the same "printed page" as the copyright notice for easier identification within
-third-party archives.
-
-   Copyright [yyyy] [name of copyright owner]
-
-   Licensed 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.
diff --git a/vendor/github.com/golang/glog/README b/vendor/github.com/golang/glog/README
deleted file mode 100644
index 387b4eb..0000000
--- a/vendor/github.com/golang/glog/README
+++ /dev/null
@@ -1,44 +0,0 @@
-glog
-====
-
-Leveled execution logs for Go.
-
-This is an efficient pure Go implementation of leveled logs in the
-manner of the open source C++ package
-	https://github.com/google/glog
-
-By binding methods to booleans it is possible to use the log package
-without paying the expense of evaluating the arguments to the log.
-Through the -vmodule flag, the package also provides fine-grained
-control over logging at the file level.
-
-The comment from glog.go introduces the ideas:
-
-	Package glog implements logging analogous to the Google-internal
-	C++ INFO/ERROR/V setup.  It provides functions Info, Warning,
-	Error, Fatal, plus formatting variants such as Infof. It
-	also provides V-style logging controlled by the -v and
-	-vmodule=file=2 flags.
-	
-	Basic examples:
-	
-		glog.Info("Prepare to repel boarders")
-	
-		glog.Fatalf("Initialization failed: %s", err)
-	
-	See the documentation for the V function for an explanation
-	of these examples:
-	
-		if glog.V(2) {
-			glog.Info("Starting transaction...")
-		}
-	
-		glog.V(2).Infoln("Processed", nItems, "elements")
-
-
-The repository contains an open source version of the log package
-used inside Google. The master copy of the source lives inside
-Google, not here. The code in this repo is for export only and is not itself
-under development. Feature requests will be ignored.
-
-Send bug reports to golang-nuts@googlegroups.com.
diff --git a/vendor/github.com/golang/glog/glog.go b/vendor/github.com/golang/glog/glog.go
deleted file mode 100644
index 54bd7af..0000000
--- a/vendor/github.com/golang/glog/glog.go
+++ /dev/null
@@ -1,1180 +0,0 @@
-// Go support for leveled logs, analogous to https://code.google.com/p/google-glog/
-//
-// Copyright 2013 Google Inc. All Rights Reserved.
-//
-// Licensed 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 glog implements logging analogous to the Google-internal C++ INFO/ERROR/V setup.
-// It provides functions Info, Warning, Error, Fatal, plus formatting variants such as
-// Infof. It also provides V-style logging controlled by the -v and -vmodule=file=2 flags.
-//
-// Basic examples:
-//
-//	glog.Info("Prepare to repel boarders")
-//
-//	glog.Fatalf("Initialization failed: %s", err)
-//
-// See the documentation for the V function for an explanation of these examples:
-//
-//	if glog.V(2) {
-//		glog.Info("Starting transaction...")
-//	}
-//
-//	glog.V(2).Infoln("Processed", nItems, "elements")
-//
-// Log output is buffered and written periodically using Flush. Programs
-// should call Flush before exiting to guarantee all log output is written.
-//
-// By default, all log statements write to files in a temporary directory.
-// This package provides several flags that modify this behavior.
-// As a result, flag.Parse must be called before any logging is done.
-//
-//	-logtostderr=false
-//		Logs are written to standard error instead of to files.
-//	-alsologtostderr=false
-//		Logs are written to standard error as well as to files.
-//	-stderrthreshold=ERROR
-//		Log events at or above this severity are logged to standard
-//		error as well as to files.
-//	-log_dir=""
-//		Log files will be written to this directory instead of the
-//		default temporary directory.
-//
-//	Other flags provide aids to debugging.
-//
-//	-log_backtrace_at=""
-//		When set to a file and line number holding a logging statement,
-//		such as
-//			-log_backtrace_at=gopherflakes.go:234
-//		a stack trace will be written to the Info log whenever execution
-//		hits that statement. (Unlike with -vmodule, the ".go" must be
-//		present.)
-//	-v=0
-//		Enable V-leveled logging at the specified level.
-//	-vmodule=""
-//		The syntax of the argument is a comma-separated list of pattern=N,
-//		where pattern is a literal file name (minus the ".go" suffix) or
-//		"glob" pattern and N is a V level. For instance,
-//			-vmodule=gopher*=3
-//		sets the V level to 3 in all Go files whose names begin "gopher".
-//
-package glog
-
-import (
-	"bufio"
-	"bytes"
-	"errors"
-	"flag"
-	"fmt"
-	"io"
-	stdLog "log"
-	"os"
-	"path/filepath"
-	"runtime"
-	"strconv"
-	"strings"
-	"sync"
-	"sync/atomic"
-	"time"
-)
-
-// severity identifies the sort of log: info, warning etc. It also implements
-// the flag.Value interface. The -stderrthreshold flag is of type severity and
-// should be modified only through the flag.Value interface. The values match
-// the corresponding constants in C++.
-type severity int32 // sync/atomic int32
-
-// These constants identify the log levels in order of increasing severity.
-// A message written to a high-severity log file is also written to each
-// lower-severity log file.
-const (
-	infoLog severity = iota
-	warningLog
-	errorLog
-	fatalLog
-	numSeverity = 4
-)
-
-const severityChar = "IWEF"
-
-var severityName = []string{
-	infoLog:    "INFO",
-	warningLog: "WARNING",
-	errorLog:   "ERROR",
-	fatalLog:   "FATAL",
-}
-
-// get returns the value of the severity.
-func (s *severity) get() severity {
-	return severity(atomic.LoadInt32((*int32)(s)))
-}
-
-// set sets the value of the severity.
-func (s *severity) set(val severity) {
-	atomic.StoreInt32((*int32)(s), int32(val))
-}
-
-// String is part of the flag.Value interface.
-func (s *severity) String() string {
-	return strconv.FormatInt(int64(*s), 10)
-}
-
-// Get is part of the flag.Value interface.
-func (s *severity) Get() interface{} {
-	return *s
-}
-
-// Set is part of the flag.Value interface.
-func (s *severity) Set(value string) error {
-	var threshold severity
-	// Is it a known name?
-	if v, ok := severityByName(value); ok {
-		threshold = v
-	} else {
-		v, err := strconv.Atoi(value)
-		if err != nil {
-			return err
-		}
-		threshold = severity(v)
-	}
-	logging.stderrThreshold.set(threshold)
-	return nil
-}
-
-func severityByName(s string) (severity, bool) {
-	s = strings.ToUpper(s)
-	for i, name := range severityName {
-		if name == s {
-			return severity(i), true
-		}
-	}
-	return 0, false
-}
-
-// OutputStats tracks the number of output lines and bytes written.
-type OutputStats struct {
-	lines int64
-	bytes int64
-}
-
-// Lines returns the number of lines written.
-func (s *OutputStats) Lines() int64 {
-	return atomic.LoadInt64(&s.lines)
-}
-
-// Bytes returns the number of bytes written.
-func (s *OutputStats) Bytes() int64 {
-	return atomic.LoadInt64(&s.bytes)
-}
-
-// Stats tracks the number of lines of output and number of bytes
-// per severity level. Values must be read with atomic.LoadInt64.
-var Stats struct {
-	Info, Warning, Error OutputStats
-}
-
-var severityStats = [numSeverity]*OutputStats{
-	infoLog:    &Stats.Info,
-	warningLog: &Stats.Warning,
-	errorLog:   &Stats.Error,
-}
-
-// Level is exported because it appears in the arguments to V and is
-// the type of the v flag, which can be set programmatically.
-// It's a distinct type because we want to discriminate it from logType.
-// Variables of type level are only changed under logging.mu.
-// The -v flag is read only with atomic ops, so the state of the logging
-// module is consistent.
-
-// Level is treated as a sync/atomic int32.
-
-// Level specifies a level of verbosity for V logs. *Level implements
-// flag.Value; the -v flag is of type Level and should be modified
-// only through the flag.Value interface.
-type Level int32
-
-// get returns the value of the Level.
-func (l *Level) get() Level {
-	return Level(atomic.LoadInt32((*int32)(l)))
-}
-
-// set sets the value of the Level.
-func (l *Level) set(val Level) {
-	atomic.StoreInt32((*int32)(l), int32(val))
-}
-
-// String is part of the flag.Value interface.
-func (l *Level) String() string {
-	return strconv.FormatInt(int64(*l), 10)
-}
-
-// Get is part of the flag.Value interface.
-func (l *Level) Get() interface{} {
-	return *l
-}
-
-// Set is part of the flag.Value interface.
-func (l *Level) Set(value string) error {
-	v, err := strconv.Atoi(value)
-	if err != nil {
-		return err
-	}
-	logging.mu.Lock()
-	defer logging.mu.Unlock()
-	logging.setVState(Level(v), logging.vmodule.filter, false)
-	return nil
-}
-
-// moduleSpec represents the setting of the -vmodule flag.
-type moduleSpec struct {
-	filter []modulePat
-}
-
-// modulePat contains a filter for the -vmodule flag.
-// It holds a verbosity level and a file pattern to match.
-type modulePat struct {
-	pattern string
-	literal bool // The pattern is a literal string
-	level   Level
-}
-
-// match reports whether the file matches the pattern. It uses a string
-// comparison if the pattern contains no metacharacters.
-func (m *modulePat) match(file string) bool {
-	if m.literal {
-		return file == m.pattern
-	}
-	match, _ := filepath.Match(m.pattern, file)
-	return match
-}
-
-func (m *moduleSpec) String() string {
-	// Lock because the type is not atomic. TODO: clean this up.
-	logging.mu.Lock()
-	defer logging.mu.Unlock()
-	var b bytes.Buffer
-	for i, f := range m.filter {
-		if i > 0 {
-			b.WriteRune(',')
-		}
-		fmt.Fprintf(&b, "%s=%d", f.pattern, f.level)
-	}
-	return b.String()
-}
-
-// Get is part of the (Go 1.2)  flag.Getter interface. It always returns nil for this flag type since the
-// struct is not exported.
-func (m *moduleSpec) Get() interface{} {
-	return nil
-}
-
-var errVmoduleSyntax = errors.New("syntax error: expect comma-separated list of filename=N")
-
-// Syntax: -vmodule=recordio=2,file=1,gfs*=3
-func (m *moduleSpec) Set(value string) error {
-	var filter []modulePat
-	for _, pat := range strings.Split(value, ",") {
-		if len(pat) == 0 {
-			// Empty strings such as from a trailing comma can be ignored.
-			continue
-		}
-		patLev := strings.Split(pat, "=")
-		if len(patLev) != 2 || len(patLev[0]) == 0 || len(patLev[1]) == 0 {
-			return errVmoduleSyntax
-		}
-		pattern := patLev[0]
-		v, err := strconv.Atoi(patLev[1])
-		if err != nil {
-			return errors.New("syntax error: expect comma-separated list of filename=N")
-		}
-		if v < 0 {
-			return errors.New("negative value for vmodule level")
-		}
-		if v == 0 {
-			continue // Ignore. It's harmless but no point in paying the overhead.
-		}
-		// TODO: check syntax of filter?
-		filter = append(filter, modulePat{pattern, isLiteral(pattern), Level(v)})
-	}
-	logging.mu.Lock()
-	defer logging.mu.Unlock()
-	logging.setVState(logging.verbosity, filter, true)
-	return nil
-}
-
-// isLiteral reports whether the pattern is a literal string, that is, has no metacharacters
-// that require filepath.Match to be called to match the pattern.
-func isLiteral(pattern string) bool {
-	return !strings.ContainsAny(pattern, `\*?[]`)
-}
-
-// traceLocation represents the setting of the -log_backtrace_at flag.
-type traceLocation struct {
-	file string
-	line int
-}
-
-// isSet reports whether the trace location has been specified.
-// logging.mu is held.
-func (t *traceLocation) isSet() bool {
-	return t.line > 0
-}
-
-// match reports whether the specified file and line matches the trace location.
-// The argument file name is the full path, not the basename specified in the flag.
-// logging.mu is held.
-func (t *traceLocation) match(file string, line int) bool {
-	if t.line != line {
-		return false
-	}
-	if i := strings.LastIndex(file, "/"); i >= 0 {
-		file = file[i+1:]
-	}
-	return t.file == file
-}
-
-func (t *traceLocation) String() string {
-	// Lock because the type is not atomic. TODO: clean this up.
-	logging.mu.Lock()
-	defer logging.mu.Unlock()
-	return fmt.Sprintf("%s:%d", t.file, t.line)
-}
-
-// Get is part of the (Go 1.2) flag.Getter interface. It always returns nil for this flag type since the
-// struct is not exported
-func (t *traceLocation) Get() interface{} {
-	return nil
-}
-
-var errTraceSyntax = errors.New("syntax error: expect file.go:234")
-
-// Syntax: -log_backtrace_at=gopherflakes.go:234
-// Note that unlike vmodule the file extension is included here.
-func (t *traceLocation) Set(value string) error {
-	if value == "" {
-		// Unset.
-		t.line = 0
-		t.file = ""
-	}
-	fields := strings.Split(value, ":")
-	if len(fields) != 2 {
-		return errTraceSyntax
-	}
-	file, line := fields[0], fields[1]
-	if !strings.Contains(file, ".") {
-		return errTraceSyntax
-	}
-	v, err := strconv.Atoi(line)
-	if err != nil {
-		return errTraceSyntax
-	}
-	if v <= 0 {
-		return errors.New("negative or zero value for level")
-	}
-	logging.mu.Lock()
-	defer logging.mu.Unlock()
-	t.line = v
-	t.file = file
-	return nil
-}
-
-// flushSyncWriter is the interface satisfied by logging destinations.
-type flushSyncWriter interface {
-	Flush() error
-	Sync() error
-	io.Writer
-}
-
-func init() {
-	flag.BoolVar(&logging.toStderr, "logtostderr", false, "log to standard error instead of files")
-	flag.BoolVar(&logging.alsoToStderr, "alsologtostderr", false, "log to standard error as well as files")
-	flag.Var(&logging.verbosity, "v", "log level for V logs")
-	flag.Var(&logging.stderrThreshold, "stderrthreshold", "logs at or above this threshold go to stderr")
-	flag.Var(&logging.vmodule, "vmodule", "comma-separated list of pattern=N settings for file-filtered logging")
-	flag.Var(&logging.traceLocation, "log_backtrace_at", "when logging hits line file:N, emit a stack trace")
-
-	// Default stderrThreshold is ERROR.
-	logging.stderrThreshold = errorLog
-
-	logging.setVState(0, nil, false)
-	go logging.flushDaemon()
-}
-
-// Flush flushes all pending log I/O.
-func Flush() {
-	logging.lockAndFlushAll()
-}
-
-// loggingT collects all the global state of the logging setup.
-type loggingT struct {
-	// Boolean flags. Not handled atomically because the flag.Value interface
-	// does not let us avoid the =true, and that shorthand is necessary for
-	// compatibility. TODO: does this matter enough to fix? Seems unlikely.
-	toStderr     bool // The -logtostderr flag.
-	alsoToStderr bool // The -alsologtostderr flag.
-
-	// Level flag. Handled atomically.
-	stderrThreshold severity // The -stderrthreshold flag.
-
-	// freeList is a list of byte buffers, maintained under freeListMu.
-	freeList *buffer
-	// freeListMu maintains the free list. It is separate from the main mutex
-	// so buffers can be grabbed and printed to without holding the main lock,
-	// for better parallelization.
-	freeListMu sync.Mutex
-
-	// mu protects the remaining elements of this structure and is
-	// used to synchronize logging.
-	mu sync.Mutex
-	// file holds writer for each of the log types.
-	file [numSeverity]flushSyncWriter
-	// pcs is used in V to avoid an allocation when computing the caller's PC.
-	pcs [1]uintptr
-	// vmap is a cache of the V Level for each V() call site, identified by PC.
-	// It is wiped whenever the vmodule flag changes state.
-	vmap map[uintptr]Level
-	// filterLength stores the length of the vmodule filter chain. If greater
-	// than zero, it means vmodule is enabled. It may be read safely
-	// using sync.LoadInt32, but is only modified under mu.
-	filterLength int32
-	// traceLocation is the state of the -log_backtrace_at flag.
-	traceLocation traceLocation
-	// These flags are modified only under lock, although verbosity may be fetched
-	// safely using atomic.LoadInt32.
-	vmodule   moduleSpec // The state of the -vmodule flag.
-	verbosity Level      // V logging level, the value of the -v flag/
-}
-
-// buffer holds a byte Buffer for reuse. The zero value is ready for use.
-type buffer struct {
-	bytes.Buffer
-	tmp  [64]byte // temporary byte array for creating headers.
-	next *buffer
-}
-
-var logging loggingT
-
-// setVState sets a consistent state for V logging.
-// l.mu is held.
-func (l *loggingT) setVState(verbosity Level, filter []modulePat, setFilter bool) {
-	// Turn verbosity off so V will not fire while we are in transition.
-	logging.verbosity.set(0)
-	// Ditto for filter length.
-	atomic.StoreInt32(&logging.filterLength, 0)
-
-	// Set the new filters and wipe the pc->Level map if the filter has changed.
-	if setFilter {
-		logging.vmodule.filter = filter
-		logging.vmap = make(map[uintptr]Level)
-	}
-
-	// Things are consistent now, so enable filtering and verbosity.
-	// They are enabled in order opposite to that in V.
-	atomic.StoreInt32(&logging.filterLength, int32(len(filter)))
-	logging.verbosity.set(verbosity)
-}
-
-// getBuffer returns a new, ready-to-use buffer.
-func (l *loggingT) getBuffer() *buffer {
-	l.freeListMu.Lock()
-	b := l.freeList
-	if b != nil {
-		l.freeList = b.next
-	}
-	l.freeListMu.Unlock()
-	if b == nil {
-		b = new(buffer)
-	} else {
-		b.next = nil
-		b.Reset()
-	}
-	return b
-}
-
-// putBuffer returns a buffer to the free list.
-func (l *loggingT) putBuffer(b *buffer) {
-	if b.Len() >= 256 {
-		// Let big buffers die a natural death.
-		return
-	}
-	l.freeListMu.Lock()
-	b.next = l.freeList
-	l.freeList = b
-	l.freeListMu.Unlock()
-}
-
-var timeNow = time.Now // Stubbed out for testing.
-
-/*
-header formats a log header as defined by the C++ implementation.
-It returns a buffer containing the formatted header and the user's file and line number.
-The depth specifies how many stack frames above lives the source line to be identified in the log message.
-
-Log lines have this form:
-	Lmmdd hh:mm:ss.uuuuuu threadid file:line] msg...
-where the fields are defined as follows:
-	L                A single character, representing the log level (eg 'I' for INFO)
-	mm               The month (zero padded; ie May is '05')
-	dd               The day (zero padded)
-	hh:mm:ss.uuuuuu  Time in hours, minutes and fractional seconds
-	threadid         The space-padded thread ID as returned by GetTID()
-	file             The file name
-	line             The line number
-	msg              The user-supplied message
-*/
-func (l *loggingT) header(s severity, depth int) (*buffer, string, int) {
-	_, file, line, ok := runtime.Caller(3 + depth)
-	if !ok {
-		file = "???"
-		line = 1
-	} else {
-		slash := strings.LastIndex(file, "/")
-		if slash >= 0 {
-			file = file[slash+1:]
-		}
-	}
-	return l.formatHeader(s, file, line), file, line
-}
-
-// formatHeader formats a log header using the provided file name and line number.
-func (l *loggingT) formatHeader(s severity, file string, line int) *buffer {
-	now := timeNow()
-	if line < 0 {
-		line = 0 // not a real line number, but acceptable to someDigits
-	}
-	if s > fatalLog {
-		s = infoLog // for safety.
-	}
-	buf := l.getBuffer()
-
-	// Avoid Fprintf, for speed. The format is so simple that we can do it quickly by hand.
-	// It's worth about 3X. Fprintf is hard.
-	_, month, day := now.Date()
-	hour, minute, second := now.Clock()
-	// Lmmdd hh:mm:ss.uuuuuu threadid file:line]
-	buf.tmp[0] = severityChar[s]
-	buf.twoDigits(1, int(month))
-	buf.twoDigits(3, day)
-	buf.tmp[5] = ' '
-	buf.twoDigits(6, hour)
-	buf.tmp[8] = ':'
-	buf.twoDigits(9, minute)
-	buf.tmp[11] = ':'
-	buf.twoDigits(12, second)
-	buf.tmp[14] = '.'
-	buf.nDigits(6, 15, now.Nanosecond()/1000, '0')
-	buf.tmp[21] = ' '
-	buf.nDigits(7, 22, pid, ' ') // TODO: should be TID
-	buf.tmp[29] = ' '
-	buf.Write(buf.tmp[:30])
-	buf.WriteString(file)
-	buf.tmp[0] = ':'
-	n := buf.someDigits(1, line)
-	buf.tmp[n+1] = ']'
-	buf.tmp[n+2] = ' '
-	buf.Write(buf.tmp[:n+3])
-	return buf
-}
-
-// Some custom tiny helper functions to print the log header efficiently.
-
-const digits = "0123456789"
-
-// twoDigits formats a zero-prefixed two-digit integer at buf.tmp[i].
-func (buf *buffer) twoDigits(i, d int) {
-	buf.tmp[i+1] = digits[d%10]
-	d /= 10
-	buf.tmp[i] = digits[d%10]
-}
-
-// nDigits formats an n-digit integer at buf.tmp[i],
-// padding with pad on the left.
-// It assumes d >= 0.
-func (buf *buffer) nDigits(n, i, d int, pad byte) {
-	j := n - 1
-	for ; j >= 0 && d > 0; j-- {
-		buf.tmp[i+j] = digits[d%10]
-		d /= 10
-	}
-	for ; j >= 0; j-- {
-		buf.tmp[i+j] = pad
-	}
-}
-
-// someDigits formats a zero-prefixed variable-width integer at buf.tmp[i].
-func (buf *buffer) someDigits(i, d int) int {
-	// Print into the top, then copy down. We know there's space for at least
-	// a 10-digit number.
-	j := len(buf.tmp)
-	for {
-		j--
-		buf.tmp[j] = digits[d%10]
-		d /= 10
-		if d == 0 {
-			break
-		}
-	}
-	return copy(buf.tmp[i:], buf.tmp[j:])
-}
-
-func (l *loggingT) println(s severity, args ...interface{}) {
-	buf, file, line := l.header(s, 0)
-	fmt.Fprintln(buf, args...)
-	l.output(s, buf, file, line, false)
-}
-
-func (l *loggingT) print(s severity, args ...interface{}) {
-	l.printDepth(s, 1, args...)
-}
-
-func (l *loggingT) printDepth(s severity, depth int, args ...interface{}) {
-	buf, file, line := l.header(s, depth)
-	fmt.Fprint(buf, args...)
-	if buf.Bytes()[buf.Len()-1] != '\n' {
-		buf.WriteByte('\n')
-	}
-	l.output(s, buf, file, line, false)
-}
-
-func (l *loggingT) printf(s severity, format string, args ...interface{}) {
-	buf, file, line := l.header(s, 0)
-	fmt.Fprintf(buf, format, args...)
-	if buf.Bytes()[buf.Len()-1] != '\n' {
-		buf.WriteByte('\n')
-	}
-	l.output(s, buf, file, line, false)
-}
-
-// printWithFileLine behaves like print but uses the provided file and line number.  If
-// alsoLogToStderr is true, the log message always appears on standard error; it
-// will also appear in the log file unless --logtostderr is set.
-func (l *loggingT) printWithFileLine(s severity, file string, line int, alsoToStderr bool, args ...interface{}) {
-	buf := l.formatHeader(s, file, line)
-	fmt.Fprint(buf, args...)
-	if buf.Bytes()[buf.Len()-1] != '\n' {
-		buf.WriteByte('\n')
-	}
-	l.output(s, buf, file, line, alsoToStderr)
-}
-
-// output writes the data to the log files and releases the buffer.
-func (l *loggingT) output(s severity, buf *buffer, file string, line int, alsoToStderr bool) {
-	l.mu.Lock()
-	if l.traceLocation.isSet() {
-		if l.traceLocation.match(file, line) {
-			buf.Write(stacks(false))
-		}
-	}
-	data := buf.Bytes()
-	if !flag.Parsed() {
-		os.Stderr.Write([]byte("ERROR: logging before flag.Parse: "))
-		os.Stderr.Write(data)
-	} else if l.toStderr {
-		os.Stderr.Write(data)
-	} else {
-		if alsoToStderr || l.alsoToStderr || s >= l.stderrThreshold.get() {
-			os.Stderr.Write(data)
-		}
-		if l.file[s] == nil {
-			if err := l.createFiles(s); err != nil {
-				os.Stderr.Write(data) // Make sure the message appears somewhere.
-				l.exit(err)
-			}
-		}
-		switch s {
-		case fatalLog:
-			l.file[fatalLog].Write(data)
-			fallthrough
-		case errorLog:
-			l.file[errorLog].Write(data)
-			fallthrough
-		case warningLog:
-			l.file[warningLog].Write(data)
-			fallthrough
-		case infoLog:
-			l.file[infoLog].Write(data)
-		}
-	}
-	if s == fatalLog {
-		// If we got here via Exit rather than Fatal, print no stacks.
-		if atomic.LoadUint32(&fatalNoStacks) > 0 {
-			l.mu.Unlock()
-			timeoutFlush(10 * time.Second)
-			os.Exit(1)
-		}
-		// Dump all goroutine stacks before exiting.
-		// First, make sure we see the trace for the current goroutine on standard error.
-		// If -logtostderr has been specified, the loop below will do that anyway
-		// as the first stack in the full dump.
-		if !l.toStderr {
-			os.Stderr.Write(stacks(false))
-		}
-		// Write the stack trace for all goroutines to the files.
-		trace := stacks(true)
-		logExitFunc = func(error) {} // If we get a write error, we'll still exit below.
-		for log := fatalLog; log >= infoLog; log-- {
-			if f := l.file[log]; f != nil { // Can be nil if -logtostderr is set.
-				f.Write(trace)
-			}
-		}
-		l.mu.Unlock()
-		timeoutFlush(10 * time.Second)
-		os.Exit(255) // C++ uses -1, which is silly because it's anded with 255 anyway.
-	}
-	l.putBuffer(buf)
-	l.mu.Unlock()
-	if stats := severityStats[s]; stats != nil {
-		atomic.AddInt64(&stats.lines, 1)
-		atomic.AddInt64(&stats.bytes, int64(len(data)))
-	}
-}
-
-// timeoutFlush calls Flush and returns when it completes or after timeout
-// elapses, whichever happens first.  This is needed because the hooks invoked
-// by Flush may deadlock when glog.Fatal is called from a hook that holds
-// a lock.
-func timeoutFlush(timeout time.Duration) {
-	done := make(chan bool, 1)
-	go func() {
-		Flush() // calls logging.lockAndFlushAll()
-		done <- true
-	}()
-	select {
-	case <-done:
-	case <-time.After(timeout):
-		fmt.Fprintln(os.Stderr, "glog: Flush took longer than", timeout)
-	}
-}
-
-// stacks is a wrapper for runtime.Stack that attempts to recover the data for all goroutines.
-func stacks(all bool) []byte {
-	// We don't know how big the traces are, so grow a few times if they don't fit. Start large, though.
-	n := 10000
-	if all {
-		n = 100000
-	}
-	var trace []byte
-	for i := 0; i < 5; i++ {
-		trace = make([]byte, n)
-		nbytes := runtime.Stack(trace, all)
-		if nbytes < len(trace) {
-			return trace[:nbytes]
-		}
-		n *= 2
-	}
-	return trace
-}
-
-// logExitFunc provides a simple mechanism to override the default behavior
-// of exiting on error. Used in testing and to guarantee we reach a required exit
-// for fatal logs. Instead, exit could be a function rather than a method but that
-// would make its use clumsier.
-var logExitFunc func(error)
-
-// exit is called if there is trouble creating or writing log files.
-// It flushes the logs and exits the program; there's no point in hanging around.
-// l.mu is held.
-func (l *loggingT) exit(err error) {
-	fmt.Fprintf(os.Stderr, "log: exiting because of error: %s\n", err)
-	// If logExitFunc is set, we do that instead of exiting.
-	if logExitFunc != nil {
-		logExitFunc(err)
-		return
-	}
-	l.flushAll()
-	os.Exit(2)
-}
-
-// syncBuffer joins a bufio.Writer to its underlying file, providing access to the
-// file's Sync method and providing a wrapper for the Write method that provides log
-// file rotation. There are conflicting methods, so the file cannot be embedded.
-// l.mu is held for all its methods.
-type syncBuffer struct {
-	logger *loggingT
-	*bufio.Writer
-	file   *os.File
-	sev    severity
-	nbytes uint64 // The number of bytes written to this file
-}
-
-func (sb *syncBuffer) Sync() error {
-	return sb.file.Sync()
-}
-
-func (sb *syncBuffer) Write(p []byte) (n int, err error) {
-	if sb.nbytes+uint64(len(p)) >= MaxSize {
-		if err := sb.rotateFile(time.Now()); err != nil {
-			sb.logger.exit(err)
-		}
-	}
-	n, err = sb.Writer.Write(p)
-	sb.nbytes += uint64(n)
-	if err != nil {
-		sb.logger.exit(err)
-	}
-	return
-}
-
-// rotateFile closes the syncBuffer's file and starts a new one.
-func (sb *syncBuffer) rotateFile(now time.Time) error {
-	if sb.file != nil {
-		sb.Flush()
-		sb.file.Close()
-	}
-	var err error
-	sb.file, _, err = create(severityName[sb.sev], now)
-	sb.nbytes = 0
-	if err != nil {
-		return err
-	}
-
-	sb.Writer = bufio.NewWriterSize(sb.file, bufferSize)
-
-	// Write header.
-	var buf bytes.Buffer
-	fmt.Fprintf(&buf, "Log file created at: %s\n", now.Format("2006/01/02 15:04:05"))
-	fmt.Fprintf(&buf, "Running on machine: %s\n", host)
-	fmt.Fprintf(&buf, "Binary: Built with %s %s for %s/%s\n", runtime.Compiler, runtime.Version(), runtime.GOOS, runtime.GOARCH)
-	fmt.Fprintf(&buf, "Log line format: [IWEF]mmdd hh:mm:ss.uuuuuu threadid file:line] msg\n")
-	n, err := sb.file.Write(buf.Bytes())
-	sb.nbytes += uint64(n)
-	return err
-}
-
-// bufferSize sizes the buffer associated with each log file. It's large
-// so that log records can accumulate without the logging thread blocking
-// on disk I/O. The flushDaemon will block instead.
-const bufferSize = 256 * 1024
-
-// createFiles creates all the log files for severity from sev down to infoLog.
-// l.mu is held.
-func (l *loggingT) createFiles(sev severity) error {
-	now := time.Now()
-	// Files are created in decreasing severity order, so as soon as we find one
-	// has already been created, we can stop.
-	for s := sev; s >= infoLog && l.file[s] == nil; s-- {
-		sb := &syncBuffer{
-			logger: l,
-			sev:    s,
-		}
-		if err := sb.rotateFile(now); err != nil {
-			return err
-		}
-		l.file[s] = sb
-	}
-	return nil
-}
-
-const flushInterval = 30 * time.Second
-
-// flushDaemon periodically flushes the log file buffers.
-func (l *loggingT) flushDaemon() {
-	for _ = range time.NewTicker(flushInterval).C {
-		l.lockAndFlushAll()
-	}
-}
-
-// lockAndFlushAll is like flushAll but locks l.mu first.
-func (l *loggingT) lockAndFlushAll() {
-	l.mu.Lock()
-	l.flushAll()
-	l.mu.Unlock()
-}
-
-// flushAll flushes all the logs and attempts to "sync" their data to disk.
-// l.mu is held.
-func (l *loggingT) flushAll() {
-	// Flush from fatal down, in case there's trouble flushing.
-	for s := fatalLog; s >= infoLog; s-- {
-		file := l.file[s]
-		if file != nil {
-			file.Flush() // ignore error
-			file.Sync()  // ignore error
-		}
-	}
-}
-
-// CopyStandardLogTo arranges for messages written to the Go "log" package's
-// default logs to also appear in the Google logs for the named and lower
-// severities.  Subsequent changes to the standard log's default output location
-// or format may break this behavior.
-//
-// Valid names are "INFO", "WARNING", "ERROR", and "FATAL".  If the name is not
-// recognized, CopyStandardLogTo panics.
-func CopyStandardLogTo(name string) {
-	sev, ok := severityByName(name)
-	if !ok {
-		panic(fmt.Sprintf("log.CopyStandardLogTo(%q): unrecognized severity name", name))
-	}
-	// Set a log format that captures the user's file and line:
-	//   d.go:23: message
-	stdLog.SetFlags(stdLog.Lshortfile)
-	stdLog.SetOutput(logBridge(sev))
-}
-
-// logBridge provides the Write method that enables CopyStandardLogTo to connect
-// Go's standard logs to the logs provided by this package.
-type logBridge severity
-
-// Write parses the standard logging line and passes its components to the
-// logger for severity(lb).
-func (lb logBridge) Write(b []byte) (n int, err error) {
-	var (
-		file = "???"
-		line = 1
-		text string
-	)
-	// Split "d.go:23: message" into "d.go", "23", and "message".
-	if parts := bytes.SplitN(b, []byte{':'}, 3); len(parts) != 3 || len(parts[0]) < 1 || len(parts[2]) < 1 {
-		text = fmt.Sprintf("bad log format: %s", b)
-	} else {
-		file = string(parts[0])
-		text = string(parts[2][1:]) // skip leading space
-		line, err = strconv.Atoi(string(parts[1]))
-		if err != nil {
-			text = fmt.Sprintf("bad line number: %s", b)
-			line = 1
-		}
-	}
-	// printWithFileLine with alsoToStderr=true, so standard log messages
-	// always appear on standard error.
-	logging.printWithFileLine(severity(lb), file, line, true, text)
-	return len(b), nil
-}
-
-// setV computes and remembers the V level for a given PC
-// when vmodule is enabled.
-// File pattern matching takes the basename of the file, stripped
-// of its .go suffix, and uses filepath.Match, which is a little more
-// general than the *? matching used in C++.
-// l.mu is held.
-func (l *loggingT) setV(pc uintptr) Level {
-	fn := runtime.FuncForPC(pc)
-	file, _ := fn.FileLine(pc)
-	// The file is something like /a/b/c/d.go. We want just the d.
-	if strings.HasSuffix(file, ".go") {
-		file = file[:len(file)-3]
-	}
-	if slash := strings.LastIndex(file, "/"); slash >= 0 {
-		file = file[slash+1:]
-	}
-	for _, filter := range l.vmodule.filter {
-		if filter.match(file) {
-			l.vmap[pc] = filter.level
-			return filter.level
-		}
-	}
-	l.vmap[pc] = 0
-	return 0
-}
-
-// Verbose is a boolean type that implements Infof (like Printf) etc.
-// See the documentation of V for more information.
-type Verbose bool
-
-// V reports whether verbosity at the call site is at least the requested level.
-// The returned value is a boolean of type Verbose, which implements Info, Infoln
-// and Infof. These methods will write to the Info log if called.
-// Thus, one may write either
-//	if glog.V(2) { glog.Info("log this") }
-// or
-//	glog.V(2).Info("log this")
-// The second form is shorter but the first is cheaper if logging is off because it does
-// not evaluate its arguments.
-//
-// Whether an individual call to V generates a log record depends on the setting of
-// the -v and --vmodule flags; both are off by default. If the level in the call to
-// V is at least the value of -v, or of -vmodule for the source file containing the
-// call, the V call will log.
-func V(level Level) Verbose {
-	// This function tries hard to be cheap unless there's work to do.
-	// The fast path is two atomic loads and compares.
-
-	// Here is a cheap but safe test to see if V logging is enabled globally.
-	if logging.verbosity.get() >= level {
-		return Verbose(true)
-	}
-
-	// It's off globally but it vmodule may still be set.
-	// Here is another cheap but safe test to see if vmodule is enabled.
-	if atomic.LoadInt32(&logging.filterLength) > 0 {
-		// Now we need a proper lock to use the logging structure. The pcs field
-		// is shared so we must lock before accessing it. This is fairly expensive,
-		// but if V logging is enabled we're slow anyway.
-		logging.mu.Lock()
-		defer logging.mu.Unlock()
-		if runtime.Callers(2, logging.pcs[:]) == 0 {
-			return Verbose(false)
-		}
-		v, ok := logging.vmap[logging.pcs[0]]
-		if !ok {
-			v = logging.setV(logging.pcs[0])
-		}
-		return Verbose(v >= level)
-	}
-	return Verbose(false)
-}
-
-// Info is equivalent to the global Info function, guarded by the value of v.
-// See the documentation of V for usage.
-func (v Verbose) Info(args ...interface{}) {
-	if v {
-		logging.print(infoLog, args...)
-	}
-}
-
-// Infoln is equivalent to the global Infoln function, guarded by the value of v.
-// See the documentation of V for usage.
-func (v Verbose) Infoln(args ...interface{}) {
-	if v {
-		logging.println(infoLog, args...)
-	}
-}
-
-// Infof is equivalent to the global Infof function, guarded by the value of v.
-// See the documentation of V for usage.
-func (v Verbose) Infof(format string, args ...interface{}) {
-	if v {
-		logging.printf(infoLog, format, args...)
-	}
-}
-
-// Info logs to the INFO log.
-// Arguments are handled in the manner of fmt.Print; a newline is appended if missing.
-func Info(args ...interface{}) {
-	logging.print(infoLog, args...)
-}
-
-// InfoDepth acts as Info but uses depth to determine which call frame to log.
-// InfoDepth(0, "msg") is the same as Info("msg").
-func InfoDepth(depth int, args ...interface{}) {
-	logging.printDepth(infoLog, depth, args...)
-}
-
-// Infoln logs to the INFO log.
-// Arguments are handled in the manner of fmt.Println; a newline is appended if missing.
-func Infoln(args ...interface{}) {
-	logging.println(infoLog, args...)
-}
-
-// Infof logs to the INFO log.
-// Arguments are handled in the manner of fmt.Printf; a newline is appended if missing.
-func Infof(format string, args ...interface{}) {
-	logging.printf(infoLog, format, args...)
-}
-
-// Warning logs to the WARNING and INFO logs.
-// Arguments are handled in the manner of fmt.Print; a newline is appended if missing.
-func Warning(args ...interface{}) {
-	logging.print(warningLog, args...)
-}
-
-// WarningDepth acts as Warning but uses depth to determine which call frame to log.
-// WarningDepth(0, "msg") is the same as Warning("msg").
-func WarningDepth(depth int, args ...interface{}) {
-	logging.printDepth(warningLog, depth, args...)
-}
-
-// Warningln logs to the WARNING and INFO logs.
-// Arguments are handled in the manner of fmt.Println; a newline is appended if missing.
-func Warningln(args ...interface{}) {
-	logging.println(warningLog, args...)
-}
-
-// Warningf logs to the WARNING and INFO logs.
-// Arguments are handled in the manner of fmt.Printf; a newline is appended if missing.
-func Warningf(format string, args ...interface{}) {
-	logging.printf(warningLog, format, args...)
-}
-
-// Error logs to the ERROR, WARNING, and INFO logs.
-// Arguments are handled in the manner of fmt.Print; a newline is appended if missing.
-func Error(args ...interface{}) {
-	logging.print(errorLog, args...)
-}
-
-// ErrorDepth acts as Error but uses depth to determine which call frame to log.
-// ErrorDepth(0, "msg") is the same as Error("msg").
-func ErrorDepth(depth int, args ...interface{}) {
-	logging.printDepth(errorLog, depth, args...)
-}
-
-// Errorln logs to the ERROR, WARNING, and INFO logs.
-// Arguments are handled in the manner of fmt.Println; a newline is appended if missing.
-func Errorln(args ...interface{}) {
-	logging.println(errorLog, args...)
-}
-
-// Errorf logs to the ERROR, WARNING, and INFO logs.
-// Arguments are handled in the manner of fmt.Printf; a newline is appended if missing.
-func Errorf(format string, args ...interface{}) {
-	logging.printf(errorLog, format, args...)
-}
-
-// Fatal logs to the FATAL, ERROR, WARNING, and INFO logs,
-// including a stack trace of all running goroutines, then calls os.Exit(255).
-// Arguments are handled in the manner of fmt.Print; a newline is appended if missing.
-func Fatal(args ...interface{}) {
-	logging.print(fatalLog, args...)
-}
-
-// FatalDepth acts as Fatal but uses depth to determine which call frame to log.
-// FatalDepth(0, "msg") is the same as Fatal("msg").
-func FatalDepth(depth int, args ...interface{}) {
-	logging.printDepth(fatalLog, depth, args...)
-}
-
-// Fatalln logs to the FATAL, ERROR, WARNING, and INFO logs,
-// including a stack trace of all running goroutines, then calls os.Exit(255).
-// Arguments are handled in the manner of fmt.Println; a newline is appended if missing.
-func Fatalln(args ...interface{}) {
-	logging.println(fatalLog, args...)
-}
-
-// Fatalf logs to the FATAL, ERROR, WARNING, and INFO logs,
-// including a stack trace of all running goroutines, then calls os.Exit(255).
-// Arguments are handled in the manner of fmt.Printf; a newline is appended if missing.
-func Fatalf(format string, args ...interface{}) {
-	logging.printf(fatalLog, format, args...)
-}
-
-// fatalNoStacks is non-zero if we are to exit without dumping goroutine stacks.
-// It allows Exit and relatives to use the Fatal logs.
-var fatalNoStacks uint32
-
-// Exit logs to the FATAL, ERROR, WARNING, and INFO logs, then calls os.Exit(1).
-// Arguments are handled in the manner of fmt.Print; a newline is appended if missing.
-func Exit(args ...interface{}) {
-	atomic.StoreUint32(&fatalNoStacks, 1)
-	logging.print(fatalLog, args...)
-}
-
-// ExitDepth acts as Exit but uses depth to determine which call frame to log.
-// ExitDepth(0, "msg") is the same as Exit("msg").
-func ExitDepth(depth int, args ...interface{}) {
-	atomic.StoreUint32(&fatalNoStacks, 1)
-	logging.printDepth(fatalLog, depth, args...)
-}
-
-// Exitln logs to the FATAL, ERROR, WARNING, and INFO logs, then calls os.Exit(1).
-func Exitln(args ...interface{}) {
-	atomic.StoreUint32(&fatalNoStacks, 1)
-	logging.println(fatalLog, args...)
-}
-
-// Exitf logs to the FATAL, ERROR, WARNING, and INFO logs, then calls os.Exit(1).
-// Arguments are handled in the manner of fmt.Printf; a newline is appended if missing.
-func Exitf(format string, args ...interface{}) {
-	atomic.StoreUint32(&fatalNoStacks, 1)
-	logging.printf(fatalLog, format, args...)
-}
diff --git a/vendor/github.com/golang/glog/glog_file.go b/vendor/github.com/golang/glog/glog_file.go
deleted file mode 100644
index 65075d2..0000000
--- a/vendor/github.com/golang/glog/glog_file.go
+++ /dev/null
@@ -1,124 +0,0 @@
-// Go support for leveled logs, analogous to https://code.google.com/p/google-glog/
-//
-// Copyright 2013 Google Inc. All Rights Reserved.
-//
-// Licensed 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.
-
-// File I/O for logs.
-
-package glog
-
-import (
-	"errors"
-	"flag"
-	"fmt"
-	"os"
-	"os/user"
-	"path/filepath"
-	"strings"
-	"sync"
-	"time"
-)
-
-// MaxSize is the maximum size of a log file in bytes.
-var MaxSize uint64 = 1024 * 1024 * 1800
-
-// logDirs lists the candidate directories for new log files.
-var logDirs []string
-
-// If non-empty, overrides the choice of directory in which to write logs.
-// See createLogDirs for the full list of possible destinations.
-var logDir = flag.String("log_dir", "", "If non-empty, write log files in this directory")
-
-func createLogDirs() {
-	if *logDir != "" {
-		logDirs = append(logDirs, *logDir)
-	}
-	logDirs = append(logDirs, os.TempDir())
-}
-
-var (
-	pid      = os.Getpid()
-	program  = filepath.Base(os.Args[0])
-	host     = "unknownhost"
-	userName = "unknownuser"
-)
-
-func init() {
-	h, err := os.Hostname()
-	if err == nil {
-		host = shortHostname(h)
-	}
-
-	current, err := user.Current()
-	if err == nil {
-		userName = current.Username
-	}
-
-	// Sanitize userName since it may contain filepath separators on Windows.
-	userName = strings.Replace(userName, `\`, "_", -1)
-}
-
-// shortHostname returns its argument, truncating at the first period.
-// For instance, given "www.google.com" it returns "www".
-func shortHostname(hostname string) string {
-	if i := strings.Index(hostname, "."); i >= 0 {
-		return hostname[:i]
-	}
-	return hostname
-}
-
-// logName returns a new log file name containing tag, with start time t, and
-// the name for the symlink for tag.
-func logName(tag string, t time.Time) (name, link string) {
-	name = fmt.Sprintf("%s.%s.%s.log.%s.%04d%02d%02d-%02d%02d%02d.%d",
-		program,
-		host,
-		userName,
-		tag,
-		t.Year(),
-		t.Month(),
-		t.Day(),
-		t.Hour(),
-		t.Minute(),
-		t.Second(),
-		pid)
-	return name, program + "." + tag
-}
-
-var onceLogDirs sync.Once
-
-// create creates a new log file and returns the file and its filename, which
-// contains tag ("INFO", "FATAL", etc.) and t.  If the file is created
-// successfully, create also attempts to update the symlink for that tag, ignoring
-// errors.
-func create(tag string, t time.Time) (f *os.File, filename string, err error) {
-	onceLogDirs.Do(createLogDirs)
-	if len(logDirs) == 0 {
-		return nil, "", errors.New("log: no log dirs")
-	}
-	name, link := logName(tag, t)
-	var lastErr error
-	for _, dir := range logDirs {
-		fname := filepath.Join(dir, name)
-		f, err := os.Create(fname)
-		if err == nil {
-			symlink := filepath.Join(dir, link)
-			os.Remove(symlink)        // ignore err
-			os.Symlink(name, symlink) // ignore err
-			return f, fname, nil
-		}
-		lastErr = err
-	}
-	return nil, "", fmt.Errorf("log: cannot create log: %v", lastErr)
-}
diff --git a/vendor/github.com/golang/glog/glog_test.go b/vendor/github.com/golang/glog/glog_test.go
deleted file mode 100644
index 0fb376e..0000000
--- a/vendor/github.com/golang/glog/glog_test.go
+++ /dev/null
@@ -1,415 +0,0 @@
-// Go support for leveled logs, analogous to https://code.google.com/p/google-glog/
-//
-// Copyright 2013 Google Inc. All Rights Reserved.
-//
-// Licensed 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 glog
-
-import (
-	"bytes"
-	"fmt"
-	stdLog "log"
-	"path/filepath"
-	"runtime"
-	"strconv"
-	"strings"
-	"testing"
-	"time"
-)
-
-// Test that shortHostname works as advertised.
-func TestShortHostname(t *testing.T) {
-	for hostname, expect := range map[string]string{
-		"":                "",
-		"host":            "host",
-		"host.google.com": "host",
-	} {
-		if got := shortHostname(hostname); expect != got {
-			t.Errorf("shortHostname(%q): expected %q, got %q", hostname, expect, got)
-		}
-	}
-}
-
-// flushBuffer wraps a bytes.Buffer to satisfy flushSyncWriter.
-type flushBuffer struct {
-	bytes.Buffer
-}
-
-func (f *flushBuffer) Flush() error {
-	return nil
-}
-
-func (f *flushBuffer) Sync() error {
-	return nil
-}
-
-// swap sets the log writers and returns the old array.
-func (l *loggingT) swap(writers [numSeverity]flushSyncWriter) (old [numSeverity]flushSyncWriter) {
-	l.mu.Lock()
-	defer l.mu.Unlock()
-	old = l.file
-	for i, w := range writers {
-		logging.file[i] = w
-	}
-	return
-}
-
-// newBuffers sets the log writers to all new byte buffers and returns the old array.
-func (l *loggingT) newBuffers() [numSeverity]flushSyncWriter {
-	return l.swap([numSeverity]flushSyncWriter{new(flushBuffer), new(flushBuffer), new(flushBuffer), new(flushBuffer)})
-}
-
-// contents returns the specified log value as a string.
-func contents(s severity) string {
-	return logging.file[s].(*flushBuffer).String()
-}
-
-// contains reports whether the string is contained in the log.
-func contains(s severity, str string, t *testing.T) bool {
-	return strings.Contains(contents(s), str)
-}
-
-// setFlags configures the logging flags how the test expects them.
-func setFlags() {
-	logging.toStderr = false
-}
-
-// Test that Info works as advertised.
-func TestInfo(t *testing.T) {
-	setFlags()
-	defer logging.swap(logging.newBuffers())
-	Info("test")
-	if !contains(infoLog, "I", t) {
-		t.Errorf("Info has wrong character: %q", contents(infoLog))
-	}
-	if !contains(infoLog, "test", t) {
-		t.Error("Info failed")
-	}
-}
-
-func TestInfoDepth(t *testing.T) {
-	setFlags()
-	defer logging.swap(logging.newBuffers())
-
-	f := func() { InfoDepth(1, "depth-test1") }
-
-	// The next three lines must stay together
-	_, _, wantLine, _ := runtime.Caller(0)
-	InfoDepth(0, "depth-test0")
-	f()
-
-	msgs := strings.Split(strings.TrimSuffix(contents(infoLog), "\n"), "\n")
-	if len(msgs) != 2 {
-		t.Fatalf("Got %d lines, expected 2", len(msgs))
-	}
-
-	for i, m := range msgs {
-		if !strings.HasPrefix(m, "I") {
-			t.Errorf("InfoDepth[%d] has wrong character: %q", i, m)
-		}
-		w := fmt.Sprintf("depth-test%d", i)
-		if !strings.Contains(m, w) {
-			t.Errorf("InfoDepth[%d] missing %q: %q", i, w, m)
-		}
-
-		// pull out the line number (between : and ])
-		msg := m[strings.LastIndex(m, ":")+1:]
-		x := strings.Index(msg, "]")
-		if x < 0 {
-			t.Errorf("InfoDepth[%d]: missing ']': %q", i, m)
-			continue
-		}
-		line, err := strconv.Atoi(msg[:x])
-		if err != nil {
-			t.Errorf("InfoDepth[%d]: bad line number: %q", i, m)
-			continue
-		}
-		wantLine++
-		if wantLine != line {
-			t.Errorf("InfoDepth[%d]: got line %d, want %d", i, line, wantLine)
-		}
-	}
-}
-
-func init() {
-	CopyStandardLogTo("INFO")
-}
-
-// Test that CopyStandardLogTo panics on bad input.
-func TestCopyStandardLogToPanic(t *testing.T) {
-	defer func() {
-		if s, ok := recover().(string); !ok || !strings.Contains(s, "LOG") {
-			t.Errorf(`CopyStandardLogTo("LOG") should have panicked: %v`, s)
-		}
-	}()
-	CopyStandardLogTo("LOG")
-}
-
-// Test that using the standard log package logs to INFO.
-func TestStandardLog(t *testing.T) {
-	setFlags()
-	defer logging.swap(logging.newBuffers())
-	stdLog.Print("test")
-	if !contains(infoLog, "I", t) {
-		t.Errorf("Info has wrong character: %q", contents(infoLog))
-	}
-	if !contains(infoLog, "test", t) {
-		t.Error("Info failed")
-	}
-}
-
-// Test that the header has the correct format.
-func TestHeader(t *testing.T) {
-	setFlags()
-	defer logging.swap(logging.newBuffers())
-	defer func(previous func() time.Time) { timeNow = previous }(timeNow)
-	timeNow = func() time.Time {
-		return time.Date(2006, 1, 2, 15, 4, 5, .067890e9, time.Local)
-	}
-	pid = 1234
-	Info("test")
-	var line int
-	format := "I0102 15:04:05.067890    1234 glog_test.go:%d] test\n"
-	n, err := fmt.Sscanf(contents(infoLog), format, &line)
-	if n != 1 || err != nil {
-		t.Errorf("log format error: %d elements, error %s:\n%s", n, err, contents(infoLog))
-	}
-	// Scanf treats multiple spaces as equivalent to a single space,
-	// so check for correct space-padding also.
-	want := fmt.Sprintf(format, line)
-	if contents(infoLog) != want {
-		t.Errorf("log format error: got:\n\t%q\nwant:\t%q", contents(infoLog), want)
-	}
-}
-
-// Test that an Error log goes to Warning and Info.
-// Even in the Info log, the source character will be E, so the data should
-// all be identical.
-func TestError(t *testing.T) {
-	setFlags()
-	defer logging.swap(logging.newBuffers())
-	Error("test")
-	if !contains(errorLog, "E", t) {
-		t.Errorf("Error has wrong character: %q", contents(errorLog))
-	}
-	if !contains(errorLog, "test", t) {
-		t.Error("Error failed")
-	}
-	str := contents(errorLog)
-	if !contains(warningLog, str, t) {
-		t.Error("Warning failed")
-	}
-	if !contains(infoLog, str, t) {
-		t.Error("Info failed")
-	}
-}
-
-// Test that a Warning log goes to Info.
-// Even in the Info log, the source character will be W, so the data should
-// all be identical.
-func TestWarning(t *testing.T) {
-	setFlags()
-	defer logging.swap(logging.newBuffers())
-	Warning("test")
-	if !contains(warningLog, "W", t) {
-		t.Errorf("Warning has wrong character: %q", contents(warningLog))
-	}
-	if !contains(warningLog, "test", t) {
-		t.Error("Warning failed")
-	}
-	str := contents(warningLog)
-	if !contains(infoLog, str, t) {
-		t.Error("Info failed")
-	}
-}
-
-// Test that a V log goes to Info.
-func TestV(t *testing.T) {
-	setFlags()
-	defer logging.swap(logging.newBuffers())
-	logging.verbosity.Set("2")
-	defer logging.verbosity.Set("0")
-	V(2).Info("test")
-	if !contains(infoLog, "I", t) {
-		t.Errorf("Info has wrong character: %q", contents(infoLog))
-	}
-	if !contains(infoLog, "test", t) {
-		t.Error("Info failed")
-	}
-}
-
-// Test that a vmodule enables a log in this file.
-func TestVmoduleOn(t *testing.T) {
-	setFlags()
-	defer logging.swap(logging.newBuffers())
-	logging.vmodule.Set("glog_test=2")
-	defer logging.vmodule.Set("")
-	if !V(1) {
-		t.Error("V not enabled for 1")
-	}
-	if !V(2) {
-		t.Error("V not enabled for 2")
-	}
-	if V(3) {
-		t.Error("V enabled for 3")
-	}
-	V(2).Info("test")
-	if !contains(infoLog, "I", t) {
-		t.Errorf("Info has wrong character: %q", contents(infoLog))
-	}
-	if !contains(infoLog, "test", t) {
-		t.Error("Info failed")
-	}
-}
-
-// Test that a vmodule of another file does not enable a log in this file.
-func TestVmoduleOff(t *testing.T) {
-	setFlags()
-	defer logging.swap(logging.newBuffers())
-	logging.vmodule.Set("notthisfile=2")
-	defer logging.vmodule.Set("")
-	for i := 1; i <= 3; i++ {
-		if V(Level(i)) {
-			t.Errorf("V enabled for %d", i)
-		}
-	}
-	V(2).Info("test")
-	if contents(infoLog) != "" {
-		t.Error("V logged incorrectly")
-	}
-}
-
-// vGlobs are patterns that match/don't match this file at V=2.
-var vGlobs = map[string]bool{
-	// Easy to test the numeric match here.
-	"glog_test=1": false, // If -vmodule sets V to 1, V(2) will fail.
-	"glog_test=2": true,
-	"glog_test=3": true, // If -vmodule sets V to 1, V(3) will succeed.
-	// These all use 2 and check the patterns. All are true.
-	"*=2":           true,
-	"?l*=2":         true,
-	"????_*=2":      true,
-	"??[mno]?_*t=2": true,
-	// These all use 2 and check the patterns. All are false.
-	"*x=2":         false,
-	"m*=2":         false,
-	"??_*=2":       false,
-	"?[abc]?_*t=2": false,
-}
-
-// Test that vmodule globbing works as advertised.
-func testVmoduleGlob(pat string, match bool, t *testing.T) {
-	setFlags()
-	defer logging.swap(logging.newBuffers())
-	defer logging.vmodule.Set("")
-	logging.vmodule.Set(pat)
-	if V(2) != Verbose(match) {
-		t.Errorf("incorrect match for %q: got %t expected %t", pat, V(2), match)
-	}
-}
-
-// Test that a vmodule globbing works as advertised.
-func TestVmoduleGlob(t *testing.T) {
-	for glob, match := range vGlobs {
-		testVmoduleGlob(glob, match, t)
-	}
-}
-
-func TestRollover(t *testing.T) {
-	setFlags()
-	var err error
-	defer func(previous func(error)) { logExitFunc = previous }(logExitFunc)
-	logExitFunc = func(e error) {
-		err = e
-	}
-	defer func(previous uint64) { MaxSize = previous }(MaxSize)
-	MaxSize = 512
-
-	Info("x") // Be sure we have a file.
-	info, ok := logging.file[infoLog].(*syncBuffer)
-	if !ok {
-		t.Fatal("info wasn't created")
-	}
-	if err != nil {
-		t.Fatalf("info has initial error: %v", err)
-	}
-	fname0 := info.file.Name()
-	Info(strings.Repeat("x", int(MaxSize))) // force a rollover
-	if err != nil {
-		t.Fatalf("info has error after big write: %v", err)
-	}
-
-	// Make sure the next log file gets a file name with a different
-	// time stamp.
-	//
-	// TODO: determine whether we need to support subsecond log
-	// rotation.  C++ does not appear to handle this case (nor does it
-	// handle Daylight Savings Time properly).
-	time.Sleep(1 * time.Second)
-
-	Info("x") // create a new file
-	if err != nil {
-		t.Fatalf("error after rotation: %v", err)
-	}
-	fname1 := info.file.Name()
-	if fname0 == fname1 {
-		t.Errorf("info.f.Name did not change: %v", fname0)
-	}
-	if info.nbytes >= MaxSize {
-		t.Errorf("file size was not reset: %d", info.nbytes)
-	}
-}
-
-func TestLogBacktraceAt(t *testing.T) {
-	setFlags()
-	defer logging.swap(logging.newBuffers())
-	// The peculiar style of this code simplifies line counting and maintenance of the
-	// tracing block below.
-	var infoLine string
-	setTraceLocation := func(file string, line int, ok bool, delta int) {
-		if !ok {
-			t.Fatal("could not get file:line")
-		}
-		_, file = filepath.Split(file)
-		infoLine = fmt.Sprintf("%s:%d", file, line+delta)
-		err := logging.traceLocation.Set(infoLine)
-		if err != nil {
-			t.Fatal("error setting log_backtrace_at: ", err)
-		}
-	}
-	{
-		// Start of tracing block. These lines know about each other's relative position.
-		_, file, line, ok := runtime.Caller(0)
-		setTraceLocation(file, line, ok, +2) // Two lines between Caller and Info calls.
-		Info("we want a stack trace here")
-	}
-	numAppearances := strings.Count(contents(infoLog), infoLine)
-	if numAppearances < 2 {
-		// Need 2 appearances, one in the log header and one in the trace:
-		//   log_test.go:281: I0511 16:36:06.952398 02238 log_test.go:280] we want a stack trace here
-		//   ...
-		//   github.com/glog/glog_test.go:280 (0x41ba91)
-		//   ...
-		// We could be more precise but that would require knowing the details
-		// of the traceback format, which may not be dependable.
-		t.Fatal("got no trace back; log is ", contents(infoLog))
-	}
-}
-
-func BenchmarkHeader(b *testing.B) {
-	for i := 0; i < b.N; i++ {
-		buf, _, _ := logging.header(infoLog, 0)
-		logging.putBuffer(buf)
-	}
-}
diff --git a/vendor/github.com/kardianos/osext/LICENSE b/vendor/github.com/kardianos/osext/LICENSE
new file mode 100644
index 0000000..7448756
--- /dev/null
+++ b/vendor/github.com/kardianos/osext/LICENSE
@@ -0,0 +1,27 @@
+Copyright (c) 2012 The Go Authors. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+   * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+   * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+   * Neither the name of Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/vendor/github.com/kardianos/osext/README.md b/vendor/github.com/kardianos/osext/README.md
new file mode 100644
index 0000000..15cbc3d
--- /dev/null
+++ b/vendor/github.com/kardianos/osext/README.md
@@ -0,0 +1,21 @@
+### Extensions to the "os" package.
+
+[![GoDoc](https://godoc.org/github.com/kardianos/osext?status.svg)](https://godoc.org/github.com/kardianos/osext)
+
+## Find the current Executable and ExecutableFolder.
+
+As of go1.8 the Executable function may be found in `os`. The Executable function
+in the std lib `os` package is used if available.
+
+There is sometimes utility in finding the current executable file
+that is running. This can be used for upgrading the current executable
+or finding resources located relative to the executable file. Both
+working directory and the os.Args[0] value are arbitrary and cannot
+be relied on; os.Args[0] can be "faked".
+
+Multi-platform and supports:
+ * Linux
+ * OS X
+ * Windows
+ * Plan 9
+ * BSDs.
diff --git a/vendor/github.com/kardianos/osext/osext.go b/vendor/github.com/kardianos/osext/osext.go
new file mode 100644
index 0000000..17f380f
--- /dev/null
+++ b/vendor/github.com/kardianos/osext/osext.go
@@ -0,0 +1,33 @@
+// Copyright 2012 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Extensions to the standard "os" package.
+package osext // import "github.com/kardianos/osext"
+
+import "path/filepath"
+
+var cx, ce = executableClean()
+
+func executableClean() (string, error) {
+	p, err := executable()
+	return filepath.Clean(p), err
+}
+
+// Executable returns an absolute path that can be used to
+// re-invoke the current program.
+// It may not be valid after the current program exits.
+func Executable() (string, error) {
+	return cx, ce
+}
+
+// Returns same path as Executable, returns just the folder
+// path. Excludes the executable name and any trailing slash.
+func ExecutableFolder() (string, error) {
+	p, err := Executable()
+	if err != nil {
+		return "", err
+	}
+
+	return filepath.Dir(p), nil
+}
diff --git a/vendor/github.com/kardianos/osext/osext_go18.go b/vendor/github.com/kardianos/osext/osext_go18.go
new file mode 100644
index 0000000..009d8a9
--- /dev/null
+++ b/vendor/github.com/kardianos/osext/osext_go18.go
@@ -0,0 +1,9 @@
+//+build go1.8,!openbsd
+
+package osext
+
+import "os"
+
+func executable() (string, error) {
+	return os.Executable()
+}
diff --git a/vendor/github.com/kardianos/osext/osext_plan9.go b/vendor/github.com/kardianos/osext/osext_plan9.go
new file mode 100644
index 0000000..95e2371
--- /dev/null
+++ b/vendor/github.com/kardianos/osext/osext_plan9.go
@@ -0,0 +1,22 @@
+// Copyright 2012 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+//+build !go1.8
+
+package osext
+
+import (
+	"os"
+	"strconv"
+	"syscall"
+)
+
+func executable() (string, error) {
+	f, err := os.Open("/proc/" + strconv.Itoa(os.Getpid()) + "/text")
+	if err != nil {
+		return "", err
+	}
+	defer f.Close()
+	return syscall.Fd2path(int(f.Fd()))
+}
diff --git a/vendor/github.com/kardianos/osext/osext_procfs.go b/vendor/github.com/kardianos/osext/osext_procfs.go
new file mode 100644
index 0000000..e1f16f8
--- /dev/null
+++ b/vendor/github.com/kardianos/osext/osext_procfs.go
@@ -0,0 +1,36 @@
+// Copyright 2012 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build !go1.8,android !go1.8,linux !go1.8,netbsd !go1.8,solaris !go1.8,dragonfly
+
+package osext
+
+import (
+	"errors"
+	"fmt"
+	"os"
+	"runtime"
+	"strings"
+)
+
+func executable() (string, error) {
+	switch runtime.GOOS {
+	case "linux", "android":
+		const deletedTag = " (deleted)"
+		execpath, err := os.Readlink("/proc/self/exe")
+		if err != nil {
+			return execpath, err
+		}
+		execpath = strings.TrimSuffix(execpath, deletedTag)
+		execpath = strings.TrimPrefix(execpath, deletedTag)
+		return execpath, nil
+	case "netbsd":
+		return os.Readlink("/proc/curproc/exe")
+	case "dragonfly":
+		return os.Readlink("/proc/curproc/file")
+	case "solaris":
+		return os.Readlink(fmt.Sprintf("/proc/%d/path/a.out", os.Getpid()))
+	}
+	return "", errors.New("ExecPath not implemented for " + runtime.GOOS)
+}
diff --git a/vendor/github.com/kardianos/osext/osext_sysctl.go b/vendor/github.com/kardianos/osext/osext_sysctl.go
new file mode 100644
index 0000000..33cee25
--- /dev/null
+++ b/vendor/github.com/kardianos/osext/osext_sysctl.go
@@ -0,0 +1,126 @@
+// Copyright 2012 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build !go1.8,darwin !go1.8,freebsd openbsd
+
+package osext
+
+import (
+	"os"
+	"os/exec"
+	"path/filepath"
+	"runtime"
+	"syscall"
+	"unsafe"
+)
+
+var initCwd, initCwdErr = os.Getwd()
+
+func executable() (string, error) {
+	var mib [4]int32
+	switch runtime.GOOS {
+	case "freebsd":
+		mib = [4]int32{1 /* CTL_KERN */, 14 /* KERN_PROC */, 12 /* KERN_PROC_PATHNAME */, -1}
+	case "darwin":
+		mib = [4]int32{1 /* CTL_KERN */, 38 /* KERN_PROCARGS */, int32(os.Getpid()), -1}
+	case "openbsd":
+		mib = [4]int32{1 /* CTL_KERN */, 55 /* KERN_PROC_ARGS */, int32(os.Getpid()), 1 /* KERN_PROC_ARGV */}
+	}
+
+	n := uintptr(0)
+	// Get length.
+	_, _, errNum := syscall.Syscall6(syscall.SYS___SYSCTL, uintptr(unsafe.Pointer(&mib[0])), 4, 0, uintptr(unsafe.Pointer(&n)), 0, 0)
+	if errNum != 0 {
+		return "", errNum
+	}
+	if n == 0 { // This shouldn't happen.
+		return "", nil
+	}
+	buf := make([]byte, n)
+	_, _, errNum = syscall.Syscall6(syscall.SYS___SYSCTL, uintptr(unsafe.Pointer(&mib[0])), 4, uintptr(unsafe.Pointer(&buf[0])), uintptr(unsafe.Pointer(&n)), 0, 0)
+	if errNum != 0 {
+		return "", errNum
+	}
+	if n == 0 { // This shouldn't happen.
+		return "", nil
+	}
+
+	var execPath string
+	switch runtime.GOOS {
+	case "openbsd":
+		// buf now contains **argv, with pointers to each of the C-style
+		// NULL terminated arguments.
+		var args []string
+		argv := uintptr(unsafe.Pointer(&buf[0]))
+	Loop:
+		for {
+			argp := *(**[1 << 20]byte)(unsafe.Pointer(argv))
+			if argp == nil {
+				break
+			}
+			for i := 0; uintptr(i) < n; i++ {
+				// we don't want the full arguments list
+				if string(argp[i]) == " " {
+					break Loop
+				}
+				if argp[i] != 0 {
+					continue
+				}
+				args = append(args, string(argp[:i]))
+				n -= uintptr(i)
+				break
+			}
+			if n < unsafe.Sizeof(argv) {
+				break
+			}
+			argv += unsafe.Sizeof(argv)
+			n -= unsafe.Sizeof(argv)
+		}
+		execPath = args[0]
+		// There is no canonical way to get an executable path on
+		// OpenBSD, so check PATH in case we are called directly
+		if execPath[0] != '/' && execPath[0] != '.' {
+			execIsInPath, err := exec.LookPath(execPath)
+			if err == nil {
+				execPath = execIsInPath
+			}
+		}
+	default:
+		for i, v := range buf {
+			if v == 0 {
+				buf = buf[:i]
+				break
+			}
+		}
+		execPath = string(buf)
+	}
+
+	var err error
+	// execPath will not be empty due to above checks.
+	// Try to get the absolute path if the execPath is not rooted.
+	if execPath[0] != '/' {
+		execPath, err = getAbs(execPath)
+		if err != nil {
+			return execPath, err
+		}
+	}
+	// For darwin KERN_PROCARGS may return the path to a symlink rather than the
+	// actual executable.
+	if runtime.GOOS == "darwin" {
+		if execPath, err = filepath.EvalSymlinks(execPath); err != nil {
+			return execPath, err
+		}
+	}
+	return execPath, nil
+}
+
+func getAbs(execPath string) (string, error) {
+	if initCwdErr != nil {
+		return execPath, initCwdErr
+	}
+	// The execPath may begin with a "../" or a "./" so clean it first.
+	// Join the two paths, trailing and starting slashes undetermined, so use
+	// the generic Join function.
+	return filepath.Join(initCwd, filepath.Clean(execPath)), nil
+}
diff --git a/vendor/github.com/kardianos/osext/osext_test.go b/vendor/github.com/kardianos/osext/osext_test.go
new file mode 100644
index 0000000..eb18236
--- /dev/null
+++ b/vendor/github.com/kardianos/osext/osext_test.go
@@ -0,0 +1,203 @@
+// Copyright 2012 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build darwin linux freebsd netbsd windows openbsd
+
+package osext
+
+import (
+	"bytes"
+	"fmt"
+	"io"
+	"os"
+	"os/exec"
+	"path/filepath"
+	"runtime"
+	"testing"
+)
+
+const (
+	executableEnvVar = "OSTEST_OUTPUT_EXECUTABLE"
+
+	executableEnvValueMatch  = "match"
+	executableEnvValueDelete = "delete"
+)
+
+func TestPrintExecutable(t *testing.T) {
+	ef, err := Executable()
+	if err != nil {
+		t.Fatalf("Executable failed: %v", err)
+	}
+	t.Log("Executable:", ef)
+}
+func TestPrintExecutableFolder(t *testing.T) {
+	ef, err := ExecutableFolder()
+	if err != nil {
+		t.Fatalf("ExecutableFolder failed: %v", err)
+	}
+	t.Log("Executable Folder:", ef)
+}
+func TestExecutableFolder(t *testing.T) {
+	ef, err := ExecutableFolder()
+	if err != nil {
+		t.Fatalf("ExecutableFolder failed: %v", err)
+	}
+	if ef[len(ef)-1] == filepath.Separator {
+		t.Fatal("ExecutableFolder ends with a trailing slash.")
+	}
+}
+func TestExecutableMatch(t *testing.T) {
+	ep, err := Executable()
+	if err != nil {
+		t.Fatalf("Executable failed: %v", err)
+	}
+
+	// fullpath to be of the form "dir/prog".
+	dir := filepath.Dir(filepath.Dir(ep))
+	fullpath, err := filepath.Rel(dir, ep)
+	if err != nil {
+		t.Fatalf("filepath.Rel: %v", err)
+	}
+	// Make child start with a relative program path.
+	// Alter argv[0] for child to verify getting real path without argv[0].
+	cmd := &exec.Cmd{
+		Dir:  dir,
+		Path: fullpath,
+		Env:  []string{fmt.Sprintf("%s=%s", executableEnvVar, executableEnvValueMatch)},
+	}
+	out, err := cmd.CombinedOutput()
+	if err != nil {
+		t.Fatalf("exec(self) failed: %v", err)
+	}
+	outs := string(out)
+	if !filepath.IsAbs(outs) {
+		t.Fatalf("Child returned %q, want an absolute path", out)
+	}
+	if !sameFile(outs, ep) {
+		t.Fatalf("Child returned %q, not the same file as %q", out, ep)
+	}
+}
+
+func TestExecutableDelete(t *testing.T) {
+	if runtime.GOOS != "linux" {
+		t.Skip()
+	}
+	fpath, err := Executable()
+	if err != nil {
+		t.Fatalf("Executable failed: %v", err)
+	}
+
+	r, w := io.Pipe()
+	stderrBuff := &bytes.Buffer{}
+	stdoutBuff := &bytes.Buffer{}
+	cmd := &exec.Cmd{
+		Path:   fpath,
+		Env:    []string{fmt.Sprintf("%s=%s", executableEnvVar, executableEnvValueDelete)},
+		Stdin:  r,
+		Stderr: stderrBuff,
+		Stdout: stdoutBuff,
+	}
+	err = cmd.Start()
+	if err != nil {
+		t.Fatalf("exec(self) start failed: %v", err)
+	}
+
+	tempPath := fpath + "_copy"
+	_ = os.Remove(tempPath)
+
+	err = copyFile(tempPath, fpath)
+	if err != nil {
+		t.Fatalf("copy file failed: %v", err)
+	}
+	err = os.Remove(fpath)
+	if err != nil {
+		t.Fatalf("remove running test file failed: %v", err)
+	}
+	err = os.Rename(tempPath, fpath)
+	if err != nil {
+		t.Fatalf("rename copy to previous name failed: %v", err)
+	}
+
+	w.Write([]byte{0})
+	w.Close()
+
+	err = cmd.Wait()
+	if err != nil {
+		t.Fatalf("exec wait failed: %v", err)
+	}
+
+	childPath := stderrBuff.String()
+	if !filepath.IsAbs(childPath) {
+		t.Fatalf("Child returned %q, want an absolute path", childPath)
+	}
+	if !sameFile(childPath, fpath) {
+		t.Fatalf("Child returned %q, not the same file as %q", childPath, fpath)
+	}
+}
+
+func sameFile(fn1, fn2 string) bool {
+	fi1, err := os.Stat(fn1)
+	if err != nil {
+		return false
+	}
+	fi2, err := os.Stat(fn2)
+	if err != nil {
+		return false
+	}
+	return os.SameFile(fi1, fi2)
+}
+func copyFile(dest, src string) error {
+	df, err := os.Create(dest)
+	if err != nil {
+		return err
+	}
+	defer df.Close()
+
+	sf, err := os.Open(src)
+	if err != nil {
+		return err
+	}
+	defer sf.Close()
+
+	_, err = io.Copy(df, sf)
+	return err
+}
+
+func TestMain(m *testing.M) {
+	env := os.Getenv(executableEnvVar)
+	switch env {
+	case "":
+		os.Exit(m.Run())
+	case executableEnvValueMatch:
+		// First chdir to another path.
+		dir := "/"
+		if runtime.GOOS == "windows" {
+			dir = filepath.VolumeName(".")
+		}
+		os.Chdir(dir)
+		if ep, err := Executable(); err != nil {
+			fmt.Fprint(os.Stderr, "ERROR: ", err)
+		} else {
+			fmt.Fprint(os.Stderr, ep)
+		}
+	case executableEnvValueDelete:
+		bb := make([]byte, 1)
+		var err error
+		n, err := os.Stdin.Read(bb)
+		if err != nil {
+			fmt.Fprint(os.Stderr, "ERROR: ", err)
+			os.Exit(2)
+		}
+		if n != 1 {
+			fmt.Fprint(os.Stderr, "ERROR: n != 1, n == ", n)
+			os.Exit(2)
+		}
+		if ep, err := Executable(); err != nil {
+			fmt.Fprint(os.Stderr, "ERROR: ", err)
+		} else {
+			fmt.Fprint(os.Stderr, ep)
+		}
+	}
+	os.Exit(0)
+}
diff --git a/vendor/github.com/kardianos/osext/osext_windows.go b/vendor/github.com/kardianos/osext/osext_windows.go
new file mode 100644
index 0000000..074b3b3
--- /dev/null
+++ b/vendor/github.com/kardianos/osext/osext_windows.go
@@ -0,0 +1,36 @@
+// Copyright 2012 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+//+build !go1.8
+
+package osext
+
+import (
+	"syscall"
+	"unicode/utf16"
+	"unsafe"
+)
+
+var (
+	kernel                = syscall.MustLoadDLL("kernel32.dll")
+	getModuleFileNameProc = kernel.MustFindProc("GetModuleFileNameW")
+)
+
+// GetModuleFileName() with hModule = NULL
+func executable() (exePath string, err error) {
+	return getModuleFileName()
+}
+
+func getModuleFileName() (string, error) {
+	var n uint32
+	b := make([]uint16, syscall.MAX_PATH)
+	size := uint32(len(b))
+
+	r0, _, e1 := getModuleFileNameProc.Call(0, uintptr(unsafe.Pointer(&b[0])), uintptr(size))
+	n = uint32(r0)
+	if n == 0 {
+		return "", e1
+	}
+	return string(utf16.Decode(b[0:n])), nil
+}
diff --git a/vendor/github.com/xanzy/go-cloudstack/.gitignore b/vendor/github.com/xanzy/go-cloudstack/.gitignore
new file mode 100644
index 0000000..8365624
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/.gitignore
@@ -0,0 +1,23 @@
+# Compiled Object files, Static and Dynamic libs (Shared Objects)
+*.o
+*.a
+*.so
+
+# Folders
+_obj
+_test
+
+# Architecture specific extensions/prefixes
+*.[568vq]
+[568vq].out
+
+*.cgo1.go
+*.cgo2.c
+_cgo_defun.c
+_cgo_gotypes.go
+_cgo_export.*
+
+_testmain.go
+
+*.exe
+*.test
diff --git a/vendor/github.com/xanzy/go-cloudstack/LICENSE b/vendor/github.com/xanzy/go-cloudstack/LICENSE
new file mode 100644
index 0000000..5c304d1
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/LICENSE
@@ -0,0 +1,201 @@
+Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "{}"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright {yyyy} {name of copyright owner}
+
+   Licensed 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.
diff --git a/vendor/github.com/xanzy/go-cloudstack/README.md b/vendor/github.com/xanzy/go-cloudstack/README.md
new file mode 100644
index 0000000..68814e9
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/README.md
@@ -0,0 +1,70 @@
+go-cloudstack
+=============
+A CloudStack API client enabling Go programs to interact with CloudStack in a simple and uniform way
+
+## Status
+
+This package covers the complete CloudStack API and is well tested. Of course there will still be untested corner cases when you have over 400 API commands that you can use, but over all it's save to use this package.
+
+To be able to find the API command you want, they are grouped by 'services' which match the grouping you can see/find on the [CloudStack API docs](http://cloudstack.apache.org/docs/api/apidocs-4.8/TOC_Root_Admin.html) website.
+
+## Usage
+
+The cloudstack package is always generated against the latest stable CloudStack release (currently v4.8.x). Luckily the API doesn't change that much, and were it does we try to make sure the generated package is able handle both the old and the new case. Over time it will be impossible to support all version with just one package, but until now we seem to manage this pretty well.
+
+Please see the package documentation on [GoDocs](http://godoc.org/github.com/xanzy/go-cloudstack/cloudstack).
+
+## Example
+
+```go
+// Create a new API client
+cs := cloudstack.NewAsyncClient("https://cloudstack.company.com", "your-api-key", "your-api-secret", false)
+
+// Create a new parameter struct
+p := cs.VirtualMachine.NewDeployVirtualMachineParams("service-offering-id", "template-id", "zone-id")
+
+// Set the name
+name := "server-1"
+p.SetName(name)
+
+// Set the display name
+p.SetDisplayname("Test server 1")
+
+// Set any other options required by your setup in the same way
+
+// Create the new instance
+r, err := cs.VirtualMachine.DeployVirtualMachine(p)
+if err != nil {
+	log.Fatalf("Error creating the new instance %s: %s", name, err)
+}
+
+fmt.Printf("UUID or the newly created machine: %s", r.ID)
+```
+
+## Features
+
+Next to the API commands CloudStack itself offers, there are a few additional features/function that are helpful. For starters there are two clients, an normal one (created with `NewClient(...)`) and an async client (created with `NewAsyncClient(...)`). The async client has a buildin waiting/polling feature that waits for a configured amount of time (defaults to 300 seconds) on running async jobs. This is very helpfull if you do not want to continue with your program execution until the async job is done.
+
+There is also a function you can call manually (`GetAsyncJobResult(...)`) that does the same, but then as a seperate call after you started the async job.
+
+Another nice feature is the fact that for every API command you can create the needed parameter struct using a `New...Params` function, like for example `NewListTemplatesParams`. The advantage of using this functions to create a new parameter struct, is that these functions know what the required parameters are of ever API command, and they require you to supply these when creating the new struct. Every additional paramater can be set after creating the struct by using `SetName()` like functions.
+
+Last but not least there are a whole lot of helper function that will try to automatically find an UUID for you for a certain item (disk, template, virtualmachine, network...). This makes it much easier and faster to work with the API commands and in most cases you can just use then if you know the name instead of the UUID.
+
+## ToDO
+
+I fully understand I need to document this all a little more/better and there should also be some tests added.
+
+## Getting Help
+
+_Please try to see if [GoDocs](http://godoc.org/github.com/xanzy/go-cloudstack) can provide some answers first!_
+
+* If you have an issue: report it on the [issue tracker](https://github.com/xanzy/go-cloudstack/issues)
+
+## Author
+
+Sander van Harmelen (<sander@xanzy.io>)
+
+## License
+
+Licensed 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>
diff --git a/vendor/github.com/xanzy/go-cloudstack/cloudstack/APIDiscoveryService.go b/vendor/github.com/xanzy/go-cloudstack/cloudstack/APIDiscoveryService.go
new file mode 100644
index 0000000..30ae04e
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/cloudstack/APIDiscoveryService.go
@@ -0,0 +1,97 @@
+//
+// Copyright 2018, Sander van Harmelen
+//
+// Licensed 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 cloudstack
+
+import (
+	"encoding/json"
+	"net/url"
+)
+
+type ListApisParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListApisParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	return u
+}
+
+func (p *ListApisParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+// You should always use this function to get a new ListApisParams instance,
+// as then you are sure you have configured all required params
+func (s *APIDiscoveryService) NewListApisParams() *ListApisParams {
+	p := &ListApisParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// lists all available apis on the server, provided by the Api Discovery plugin
+func (s *APIDiscoveryService) ListApis(p *ListApisParams) (*ListApisResponse, error) {
+	resp, err := s.cs.newRequest("listApis", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListApisResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListApisResponse struct {
+	Count int    `json:"count"`
+	Apis  []*Api `json:"api"`
+}
+
+type Api struct {
+	Description string `json:"description"`
+	Isasync     bool   `json:"isasync"`
+	Name        string `json:"name"`
+	Params      []struct {
+		Description string `json:"description"`
+		Length      int    `json:"length"`
+		Name        string `json:"name"`
+		Related     string `json:"related"`
+		Required    bool   `json:"required"`
+		Since       string `json:"since"`
+		Type        string `json:"type"`
+	} `json:"params"`
+	Related  string `json:"related"`
+	Response []struct {
+		Description string        `json:"description"`
+		Name        string        `json:"name"`
+		Response    []interface{} `json:"response"`
+		Type        string        `json:"type"`
+	} `json:"response"`
+	Since string `json:"since"`
+	Type  string `json:"type"`
+}
diff --git a/vendor/github.com/xanzy/go-cloudstack/cloudstack/AccountService.go b/vendor/github.com/xanzy/go-cloudstack/cloudstack/AccountService.go
new file mode 100644
index 0000000..a24e1e2
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/cloudstack/AccountService.go
@@ -0,0 +1,1971 @@
+//
+// Copyright 2018, Sander van Harmelen
+//
+// Licensed 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 cloudstack
+
+import (
+	"encoding/json"
+	"fmt"
+	"net/url"
+	"strconv"
+	"strings"
+)
+
+type AddAccountToProjectParams struct {
+	p map[string]interface{}
+}
+
+func (p *AddAccountToProjectParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["email"]; found {
+		u.Set("email", v.(string))
+	}
+	if v, found := p.p["projectid"]; found {
+		u.Set("projectid", v.(string))
+	}
+	return u
+}
+
+func (p *AddAccountToProjectParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *AddAccountToProjectParams) SetEmail(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["email"] = v
+	return
+}
+
+func (p *AddAccountToProjectParams) SetProjectid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectid"] = v
+	return
+}
+
+// You should always use this function to get a new AddAccountToProjectParams instance,
+// as then you are sure you have configured all required params
+func (s *AccountService) NewAddAccountToProjectParams(projectid string) *AddAccountToProjectParams {
+	p := &AddAccountToProjectParams{}
+	p.p = make(map[string]interface{})
+	p.p["projectid"] = projectid
+	return p
+}
+
+// Adds account to a project
+func (s *AccountService) AddAccountToProject(p *AddAccountToProjectParams) (*AddAccountToProjectResponse, error) {
+	resp, err := s.cs.newRequest("addAccountToProject", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r AddAccountToProjectResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type AddAccountToProjectResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
+
+type CreateAccountParams struct {
+	p map[string]interface{}
+}
+
+func (p *CreateAccountParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["accountdetails"]; found {
+		i := 0
+		for k, vv := range v.(map[string]string) {
+			u.Set(fmt.Sprintf("accountdetails[%d].key", i), k)
+			u.Set(fmt.Sprintf("accountdetails[%d].value", i), vv)
+			i++
+		}
+	}
+	if v, found := p.p["accountid"]; found {
+		u.Set("accountid", v.(string))
+	}
+	if v, found := p.p["accounttype"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("accounttype", vv)
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["email"]; found {
+		u.Set("email", v.(string))
+	}
+	if v, found := p.p["firstname"]; found {
+		u.Set("firstname", v.(string))
+	}
+	if v, found := p.p["lastname"]; found {
+		u.Set("lastname", v.(string))
+	}
+	if v, found := p.p["networkdomain"]; found {
+		u.Set("networkdomain", v.(string))
+	}
+	if v, found := p.p["password"]; found {
+		u.Set("password", v.(string))
+	}
+	if v, found := p.p["roleid"]; found {
+		u.Set("roleid", v.(string))
+	}
+	if v, found := p.p["timezone"]; found {
+		u.Set("timezone", v.(string))
+	}
+	if v, found := p.p["userid"]; found {
+		u.Set("userid", v.(string))
+	}
+	if v, found := p.p["username"]; found {
+		u.Set("username", v.(string))
+	}
+	return u
+}
+
+func (p *CreateAccountParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *CreateAccountParams) SetAccountdetails(v map[string]string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["accountdetails"] = v
+	return
+}
+
+func (p *CreateAccountParams) SetAccountid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["accountid"] = v
+	return
+}
+
+func (p *CreateAccountParams) SetAccounttype(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["accounttype"] = v
+	return
+}
+
+func (p *CreateAccountParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *CreateAccountParams) SetEmail(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["email"] = v
+	return
+}
+
+func (p *CreateAccountParams) SetFirstname(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["firstname"] = v
+	return
+}
+
+func (p *CreateAccountParams) SetLastname(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["lastname"] = v
+	return
+}
+
+func (p *CreateAccountParams) SetNetworkdomain(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["networkdomain"] = v
+	return
+}
+
+func (p *CreateAccountParams) SetPassword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["password"] = v
+	return
+}
+
+func (p *CreateAccountParams) SetRoleid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["roleid"] = v
+	return
+}
+
+func (p *CreateAccountParams) SetTimezone(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["timezone"] = v
+	return
+}
+
+func (p *CreateAccountParams) SetUserid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["userid"] = v
+	return
+}
+
+func (p *CreateAccountParams) SetUsername(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["username"] = v
+	return
+}
+
+// You should always use this function to get a new CreateAccountParams instance,
+// as then you are sure you have configured all required params
+func (s *AccountService) NewCreateAccountParams(email string, firstname string, lastname string, password string, username string) *CreateAccountParams {
+	p := &CreateAccountParams{}
+	p.p = make(map[string]interface{})
+	p.p["email"] = email
+	p.p["firstname"] = firstname
+	p.p["lastname"] = lastname
+	p.p["password"] = password
+	p.p["username"] = username
+	return p
+}
+
+// Creates an account
+func (s *AccountService) CreateAccount(p *CreateAccountParams) (*CreateAccountResponse, error) {
+	resp, err := s.cs.newRequest("createAccount", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	if resp, err = getRawValue(resp); err != nil {
+		return nil, err
+	}
+
+	var r CreateAccountResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type CreateAccountResponse struct {
+	Accountdetails            map[string]string `json:"accountdetails"`
+	Accounttype               int               `json:"accounttype"`
+	Cpuavailable              string            `json:"cpuavailable"`
+	Cpulimit                  string            `json:"cpulimit"`
+	Cputotal                  int64             `json:"cputotal"`
+	Defaultzoneid             string            `json:"defaultzoneid"`
+	Domain                    string            `json:"domain"`
+	Domainid                  string            `json:"domainid"`
+	Groups                    []string          `json:"groups"`
+	Id                        string            `json:"id"`
+	Ipavailable               string            `json:"ipavailable"`
+	Iplimit                   string            `json:"iplimit"`
+	Iptotal                   int64             `json:"iptotal"`
+	Iscleanuprequired         bool              `json:"iscleanuprequired"`
+	Isdefault                 bool              `json:"isdefault"`
+	Memoryavailable           string            `json:"memoryavailable"`
+	Memorylimit               string            `json:"memorylimit"`
+	Memorytotal               int64             `json:"memorytotal"`
+	Name                      string            `json:"name"`
+	Networkavailable          string            `json:"networkavailable"`
+	Networkdomain             string            `json:"networkdomain"`
+	Networklimit              string            `json:"networklimit"`
+	Networktotal              int64             `json:"networktotal"`
+	Primarystorageavailable   string            `json:"primarystorageavailable"`
+	Primarystoragelimit       string            `json:"primarystoragelimit"`
+	Primarystoragetotal       int64             `json:"primarystoragetotal"`
+	Projectavailable          string            `json:"projectavailable"`
+	Projectlimit              string            `json:"projectlimit"`
+	Projecttotal              int64             `json:"projecttotal"`
+	Receivedbytes             int64             `json:"receivedbytes"`
+	Roleid                    string            `json:"roleid"`
+	Rolename                  string            `json:"rolename"`
+	Roletype                  string            `json:"roletype"`
+	Secondarystorageavailable string            `json:"secondarystorageavailable"`
+	Secondarystoragelimit     string            `json:"secondarystoragelimit"`
+	Secondarystoragetotal     int64             `json:"secondarystoragetotal"`
+	Sentbytes                 int64             `json:"sentbytes"`
+	Snapshotavailable         string            `json:"snapshotavailable"`
+	Snapshotlimit             string            `json:"snapshotlimit"`
+	Snapshottotal             int64             `json:"snapshottotal"`
+	State                     string            `json:"state"`
+	Templateavailable         string            `json:"templateavailable"`
+	Templatelimit             string            `json:"templatelimit"`
+	Templatetotal             int64             `json:"templatetotal"`
+	User                      []struct {
+		Account             string `json:"account"`
+		Accountid           string `json:"accountid"`
+		Accounttype         int    `json:"accounttype"`
+		Apikey              string `json:"apikey"`
+		Created             string `json:"created"`
+		Domain              string `json:"domain"`
+		Domainid            string `json:"domainid"`
+		Email               string `json:"email"`
+		Firstname           string `json:"firstname"`
+		Id                  string `json:"id"`
+		Iscallerchilddomain bool   `json:"iscallerchilddomain"`
+		Isdefault           bool   `json:"isdefault"`
+		Lastname            string `json:"lastname"`
+		Roleid              string `json:"roleid"`
+		Rolename            string `json:"rolename"`
+		Roletype            string `json:"roletype"`
+		Secretkey           string `json:"secretkey"`
+		State               string `json:"state"`
+		Timezone            string `json:"timezone"`
+		Username            string `json:"username"`
+	} `json:"user"`
+	Vmavailable     string `json:"vmavailable"`
+	Vmlimit         string `json:"vmlimit"`
+	Vmrunning       int    `json:"vmrunning"`
+	Vmstopped       int    `json:"vmstopped"`
+	Vmtotal         int64  `json:"vmtotal"`
+	Volumeavailable string `json:"volumeavailable"`
+	Volumelimit     string `json:"volumelimit"`
+	Volumetotal     int64  `json:"volumetotal"`
+	Vpcavailable    string `json:"vpcavailable"`
+	Vpclimit        string `json:"vpclimit"`
+	Vpctotal        int64  `json:"vpctotal"`
+}
+
+type DeleteAccountParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeleteAccountParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *DeleteAccountParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new DeleteAccountParams instance,
+// as then you are sure you have configured all required params
+func (s *AccountService) NewDeleteAccountParams(id string) *DeleteAccountParams {
+	p := &DeleteAccountParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Deletes a account, and all users associated with this account
+func (s *AccountService) DeleteAccount(p *DeleteAccountParams) (*DeleteAccountResponse, error) {
+	resp, err := s.cs.newRequest("deleteAccount", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeleteAccountResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type DeleteAccountResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
+
+type DeleteAccountFromProjectParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeleteAccountFromProjectParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["projectid"]; found {
+		u.Set("projectid", v.(string))
+	}
+	return u
+}
+
+func (p *DeleteAccountFromProjectParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *DeleteAccountFromProjectParams) SetProjectid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectid"] = v
+	return
+}
+
+// You should always use this function to get a new DeleteAccountFromProjectParams instance,
+// as then you are sure you have configured all required params
+func (s *AccountService) NewDeleteAccountFromProjectParams(account string, projectid string) *DeleteAccountFromProjectParams {
+	p := &DeleteAccountFromProjectParams{}
+	p.p = make(map[string]interface{})
+	p.p["account"] = account
+	p.p["projectid"] = projectid
+	return p
+}
+
+// Deletes account from the project
+func (s *AccountService) DeleteAccountFromProject(p *DeleteAccountFromProjectParams) (*DeleteAccountFromProjectResponse, error) {
+	resp, err := s.cs.newRequest("deleteAccountFromProject", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeleteAccountFromProjectResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type DeleteAccountFromProjectResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
+
+type DisableAccountParams struct {
+	p map[string]interface{}
+}
+
+func (p *DisableAccountParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["lock"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("lock", vv)
+	}
+	return u
+}
+
+func (p *DisableAccountParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *DisableAccountParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *DisableAccountParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *DisableAccountParams) SetLock(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["lock"] = v
+	return
+}
+
+// You should always use this function to get a new DisableAccountParams instance,
+// as then you are sure you have configured all required params
+func (s *AccountService) NewDisableAccountParams(lock bool) *DisableAccountParams {
+	p := &DisableAccountParams{}
+	p.p = make(map[string]interface{})
+	p.p["lock"] = lock
+	return p
+}
+
+// Disables an account
+func (s *AccountService) DisableAccount(p *DisableAccountParams) (*DisableAccountResponse, error) {
+	resp, err := s.cs.newRequest("disableAccount", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DisableAccountResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type DisableAccountResponse struct {
+	JobID                     string            `json:"jobid"`
+	Accountdetails            map[string]string `json:"accountdetails"`
+	Accounttype               int               `json:"accounttype"`
+	Cpuavailable              string            `json:"cpuavailable"`
+	Cpulimit                  string            `json:"cpulimit"`
+	Cputotal                  int64             `json:"cputotal"`
+	Defaultzoneid             string            `json:"defaultzoneid"`
+	Domain                    string            `json:"domain"`
+	Domainid                  string            `json:"domainid"`
+	Groups                    []string          `json:"groups"`
+	Id                        string            `json:"id"`
+	Ipavailable               string            `json:"ipavailable"`
+	Iplimit                   string            `json:"iplimit"`
+	Iptotal                   int64             `json:"iptotal"`
+	Iscleanuprequired         bool              `json:"iscleanuprequired"`
+	Isdefault                 bool              `json:"isdefault"`
+	Memoryavailable           string            `json:"memoryavailable"`
+	Memorylimit               string            `json:"memorylimit"`
+	Memorytotal               int64             `json:"memorytotal"`
+	Name                      string            `json:"name"`
+	Networkavailable          string            `json:"networkavailable"`
+	Networkdomain             string            `json:"networkdomain"`
+	Networklimit              string            `json:"networklimit"`
+	Networktotal              int64             `json:"networktotal"`
+	Primarystorageavailable   string            `json:"primarystorageavailable"`
+	Primarystoragelimit       string            `json:"primarystoragelimit"`
+	Primarystoragetotal       int64             `json:"primarystoragetotal"`
+	Projectavailable          string            `json:"projectavailable"`
+	Projectlimit              string            `json:"projectlimit"`
+	Projecttotal              int64             `json:"projecttotal"`
+	Receivedbytes             int64             `json:"receivedbytes"`
+	Roleid                    string            `json:"roleid"`
+	Rolename                  string            `json:"rolename"`
+	Roletype                  string            `json:"roletype"`
+	Secondarystorageavailable string            `json:"secondarystorageavailable"`
+	Secondarystoragelimit     string            `json:"secondarystoragelimit"`
+	Secondarystoragetotal     int64             `json:"secondarystoragetotal"`
+	Sentbytes                 int64             `json:"sentbytes"`
+	Snapshotavailable         string            `json:"snapshotavailable"`
+	Snapshotlimit             string            `json:"snapshotlimit"`
+	Snapshottotal             int64             `json:"snapshottotal"`
+	State                     string            `json:"state"`
+	Templateavailable         string            `json:"templateavailable"`
+	Templatelimit             string            `json:"templatelimit"`
+	Templatetotal             int64             `json:"templatetotal"`
+	User                      []struct {
+		Account             string `json:"account"`
+		Accountid           string `json:"accountid"`
+		Accounttype         int    `json:"accounttype"`
+		Apikey              string `json:"apikey"`
+		Created             string `json:"created"`
+		Domain              string `json:"domain"`
+		Domainid            string `json:"domainid"`
+		Email               string `json:"email"`
+		Firstname           string `json:"firstname"`
+		Id                  string `json:"id"`
+		Iscallerchilddomain bool   `json:"iscallerchilddomain"`
+		Isdefault           bool   `json:"isdefault"`
+		Lastname            string `json:"lastname"`
+		Roleid              string `json:"roleid"`
+		Rolename            string `json:"rolename"`
+		Roletype            string `json:"roletype"`
+		Secretkey           string `json:"secretkey"`
+		State               string `json:"state"`
+		Timezone            string `json:"timezone"`
+		Username            string `json:"username"`
+	} `json:"user"`
+	Vmavailable     string `json:"vmavailable"`
+	Vmlimit         string `json:"vmlimit"`
+	Vmrunning       int    `json:"vmrunning"`
+	Vmstopped       int    `json:"vmstopped"`
+	Vmtotal         int64  `json:"vmtotal"`
+	Volumeavailable string `json:"volumeavailable"`
+	Volumelimit     string `json:"volumelimit"`
+	Volumetotal     int64  `json:"volumetotal"`
+	Vpcavailable    string `json:"vpcavailable"`
+	Vpclimit        string `json:"vpclimit"`
+	Vpctotal        int64  `json:"vpctotal"`
+}
+
+type EnableAccountParams struct {
+	p map[string]interface{}
+}
+
+func (p *EnableAccountParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *EnableAccountParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *EnableAccountParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *EnableAccountParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new EnableAccountParams instance,
+// as then you are sure you have configured all required params
+func (s *AccountService) NewEnableAccountParams() *EnableAccountParams {
+	p := &EnableAccountParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// Enables an account
+func (s *AccountService) EnableAccount(p *EnableAccountParams) (*EnableAccountResponse, error) {
+	resp, err := s.cs.newRequest("enableAccount", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r EnableAccountResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type EnableAccountResponse struct {
+	Accountdetails            map[string]string `json:"accountdetails"`
+	Accounttype               int               `json:"accounttype"`
+	Cpuavailable              string            `json:"cpuavailable"`
+	Cpulimit                  string            `json:"cpulimit"`
+	Cputotal                  int64             `json:"cputotal"`
+	Defaultzoneid             string            `json:"defaultzoneid"`
+	Domain                    string            `json:"domain"`
+	Domainid                  string            `json:"domainid"`
+	Groups                    []string          `json:"groups"`
+	Id                        string            `json:"id"`
+	Ipavailable               string            `json:"ipavailable"`
+	Iplimit                   string            `json:"iplimit"`
+	Iptotal                   int64             `json:"iptotal"`
+	Iscleanuprequired         bool              `json:"iscleanuprequired"`
+	Isdefault                 bool              `json:"isdefault"`
+	Memoryavailable           string            `json:"memoryavailable"`
+	Memorylimit               string            `json:"memorylimit"`
+	Memorytotal               int64             `json:"memorytotal"`
+	Name                      string            `json:"name"`
+	Networkavailable          string            `json:"networkavailable"`
+	Networkdomain             string            `json:"networkdomain"`
+	Networklimit              string            `json:"networklimit"`
+	Networktotal              int64             `json:"networktotal"`
+	Primarystorageavailable   string            `json:"primarystorageavailable"`
+	Primarystoragelimit       string            `json:"primarystoragelimit"`
+	Primarystoragetotal       int64             `json:"primarystoragetotal"`
+	Projectavailable          string            `json:"projectavailable"`
+	Projectlimit              string            `json:"projectlimit"`
+	Projecttotal              int64             `json:"projecttotal"`
+	Receivedbytes             int64             `json:"receivedbytes"`
+	Roleid                    string            `json:"roleid"`
+	Rolename                  string            `json:"rolename"`
+	Roletype                  string            `json:"roletype"`
+	Secondarystorageavailable string            `json:"secondarystorageavailable"`
+	Secondarystoragelimit     string            `json:"secondarystoragelimit"`
+	Secondarystoragetotal     int64             `json:"secondarystoragetotal"`
+	Sentbytes                 int64             `json:"sentbytes"`
+	Snapshotavailable         string            `json:"snapshotavailable"`
+	Snapshotlimit             string            `json:"snapshotlimit"`
+	Snapshottotal             int64             `json:"snapshottotal"`
+	State                     string            `json:"state"`
+	Templateavailable         string            `json:"templateavailable"`
+	Templatelimit             string            `json:"templatelimit"`
+	Templatetotal             int64             `json:"templatetotal"`
+	User                      []struct {
+		Account             string `json:"account"`
+		Accountid           string `json:"accountid"`
+		Accounttype         int    `json:"accounttype"`
+		Apikey              string `json:"apikey"`
+		Created             string `json:"created"`
+		Domain              string `json:"domain"`
+		Domainid            string `json:"domainid"`
+		Email               string `json:"email"`
+		Firstname           string `json:"firstname"`
+		Id                  string `json:"id"`
+		Iscallerchilddomain bool   `json:"iscallerchilddomain"`
+		Isdefault           bool   `json:"isdefault"`
+		Lastname            string `json:"lastname"`
+		Roleid              string `json:"roleid"`
+		Rolename            string `json:"rolename"`
+		Roletype            string `json:"roletype"`
+		Secretkey           string `json:"secretkey"`
+		State               string `json:"state"`
+		Timezone            string `json:"timezone"`
+		Username            string `json:"username"`
+	} `json:"user"`
+	Vmavailable     string `json:"vmavailable"`
+	Vmlimit         string `json:"vmlimit"`
+	Vmrunning       int    `json:"vmrunning"`
+	Vmstopped       int    `json:"vmstopped"`
+	Vmtotal         int64  `json:"vmtotal"`
+	Volumeavailable string `json:"volumeavailable"`
+	Volumelimit     string `json:"volumelimit"`
+	Volumetotal     int64  `json:"volumetotal"`
+	Vpcavailable    string `json:"vpcavailable"`
+	Vpclimit        string `json:"vpclimit"`
+	Vpctotal        int64  `json:"vpctotal"`
+}
+
+type GetSolidFireAccountIdParams struct {
+	p map[string]interface{}
+}
+
+func (p *GetSolidFireAccountIdParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["accountid"]; found {
+		u.Set("accountid", v.(string))
+	}
+	if v, found := p.p["storageid"]; found {
+		u.Set("storageid", v.(string))
+	}
+	return u
+}
+
+func (p *GetSolidFireAccountIdParams) SetAccountid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["accountid"] = v
+	return
+}
+
+func (p *GetSolidFireAccountIdParams) SetStorageid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["storageid"] = v
+	return
+}
+
+// You should always use this function to get a new GetSolidFireAccountIdParams instance,
+// as then you are sure you have configured all required params
+func (s *AccountService) NewGetSolidFireAccountIdParams(accountid string, storageid string) *GetSolidFireAccountIdParams {
+	p := &GetSolidFireAccountIdParams{}
+	p.p = make(map[string]interface{})
+	p.p["accountid"] = accountid
+	p.p["storageid"] = storageid
+	return p
+}
+
+// Get SolidFire Account ID
+func (s *AccountService) GetSolidFireAccountId(p *GetSolidFireAccountIdParams) (*GetSolidFireAccountIdResponse, error) {
+	resp, err := s.cs.newRequest("getSolidFireAccountId", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r GetSolidFireAccountIdResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type GetSolidFireAccountIdResponse struct {
+	SolidFireAccountId int64 `json:"solidFireAccountId"`
+}
+
+type ListAccountsParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListAccountsParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["accounttype"]; found {
+		vv := strconv.FormatInt(v.(int64), 10)
+		u.Set("accounttype", vv)
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["iscleanuprequired"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("iscleanuprequired", vv)
+	}
+	if v, found := p.p["isrecursive"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("isrecursive", vv)
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["listall"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("listall", vv)
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["state"]; found {
+		u.Set("state", v.(string))
+	}
+	return u
+}
+
+func (p *ListAccountsParams) SetAccounttype(v int64) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["accounttype"] = v
+	return
+}
+
+func (p *ListAccountsParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *ListAccountsParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ListAccountsParams) SetIscleanuprequired(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["iscleanuprequired"] = v
+	return
+}
+
+func (p *ListAccountsParams) SetIsrecursive(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isrecursive"] = v
+	return
+}
+
+func (p *ListAccountsParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListAccountsParams) SetListall(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["listall"] = v
+	return
+}
+
+func (p *ListAccountsParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *ListAccountsParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListAccountsParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListAccountsParams) SetState(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["state"] = v
+	return
+}
+
+// You should always use this function to get a new ListAccountsParams instance,
+// as then you are sure you have configured all required params
+func (s *AccountService) NewListAccountsParams() *ListAccountsParams {
+	p := &ListAccountsParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *AccountService) GetAccountID(name string, opts ...OptionFunc) (string, int, error) {
+	p := &ListAccountsParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["name"] = name
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return "", -1, err
+		}
+	}
+
+	l, err := s.ListAccounts(p)
+	if err != nil {
+		return "", -1, err
+	}
+
+	if l.Count == 0 {
+		return "", l.Count, fmt.Errorf("No match found for %s: %+v", name, l)
+	}
+
+	if l.Count == 1 {
+		return l.Accounts[0].Id, l.Count, nil
+	}
+
+	if l.Count > 1 {
+		for _, v := range l.Accounts {
+			if v.Name == name {
+				return v.Id, l.Count, nil
+			}
+		}
+	}
+	return "", l.Count, fmt.Errorf("Could not find an exact match for %s: %+v", name, l)
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *AccountService) GetAccountByName(name string, opts ...OptionFunc) (*Account, int, error) {
+	id, count, err := s.GetAccountID(name, opts...)
+	if err != nil {
+		return nil, count, err
+	}
+
+	r, count, err := s.GetAccountByID(id, opts...)
+	if err != nil {
+		return nil, count, err
+	}
+	return r, count, nil
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *AccountService) GetAccountByID(id string, opts ...OptionFunc) (*Account, int, error) {
+	p := &ListAccountsParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["id"] = id
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return nil, -1, err
+		}
+	}
+
+	l, err := s.ListAccounts(p)
+	if err != nil {
+		if strings.Contains(err.Error(), fmt.Sprintf(
+			"Invalid parameter id value=%s due to incorrect long value format, "+
+				"or entity does not exist", id)) {
+			return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
+		}
+		return nil, -1, err
+	}
+
+	if l.Count == 0 {
+		return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
+	}
+
+	if l.Count == 1 {
+		return l.Accounts[0], l.Count, nil
+	}
+	return nil, l.Count, fmt.Errorf("There is more then one result for Account UUID: %s!", id)
+}
+
+// Lists accounts and provides detailed account information for listed accounts
+func (s *AccountService) ListAccounts(p *ListAccountsParams) (*ListAccountsResponse, error) {
+	resp, err := s.cs.newRequest("listAccounts", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListAccountsResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListAccountsResponse struct {
+	Count    int        `json:"count"`
+	Accounts []*Account `json:"account"`
+}
+
+type Account struct {
+	Accountdetails            map[string]string `json:"accountdetails"`
+	Accounttype               int               `json:"accounttype"`
+	Cpuavailable              string            `json:"cpuavailable"`
+	Cpulimit                  string            `json:"cpulimit"`
+	Cputotal                  int64             `json:"cputotal"`
+	Defaultzoneid             string            `json:"defaultzoneid"`
+	Domain                    string            `json:"domain"`
+	Domainid                  string            `json:"domainid"`
+	Groups                    []string          `json:"groups"`
+	Id                        string            `json:"id"`
+	Ipavailable               string            `json:"ipavailable"`
+	Iplimit                   string            `json:"iplimit"`
+	Iptotal                   int64             `json:"iptotal"`
+	Iscleanuprequired         bool              `json:"iscleanuprequired"`
+	Isdefault                 bool              `json:"isdefault"`
+	Memoryavailable           string            `json:"memoryavailable"`
+	Memorylimit               string            `json:"memorylimit"`
+	Memorytotal               int64             `json:"memorytotal"`
+	Name                      string            `json:"name"`
+	Networkavailable          string            `json:"networkavailable"`
+	Networkdomain             string            `json:"networkdomain"`
+	Networklimit              string            `json:"networklimit"`
+	Networktotal              int64             `json:"networktotal"`
+	Primarystorageavailable   string            `json:"primarystorageavailable"`
+	Primarystoragelimit       string            `json:"primarystoragelimit"`
+	Primarystoragetotal       int64             `json:"primarystoragetotal"`
+	Projectavailable          string            `json:"projectavailable"`
+	Projectlimit              string            `json:"projectlimit"`
+	Projecttotal              int64             `json:"projecttotal"`
+	Receivedbytes             int64             `json:"receivedbytes"`
+	Roleid                    string            `json:"roleid"`
+	Rolename                  string            `json:"rolename"`
+	Roletype                  string            `json:"roletype"`
+	Secondarystorageavailable string            `json:"secondarystorageavailable"`
+	Secondarystoragelimit     string            `json:"secondarystoragelimit"`
+	Secondarystoragetotal     int64             `json:"secondarystoragetotal"`
+	Sentbytes                 int64             `json:"sentbytes"`
+	Snapshotavailable         string            `json:"snapshotavailable"`
+	Snapshotlimit             string            `json:"snapshotlimit"`
+	Snapshottotal             int64             `json:"snapshottotal"`
+	State                     string            `json:"state"`
+	Templateavailable         string            `json:"templateavailable"`
+	Templatelimit             string            `json:"templatelimit"`
+	Templatetotal             int64             `json:"templatetotal"`
+	User                      []struct {
+		Account             string `json:"account"`
+		Accountid           string `json:"accountid"`
+		Accounttype         int    `json:"accounttype"`
+		Apikey              string `json:"apikey"`
+		Created             string `json:"created"`
+		Domain              string `json:"domain"`
+		Domainid            string `json:"domainid"`
+		Email               string `json:"email"`
+		Firstname           string `json:"firstname"`
+		Id                  string `json:"id"`
+		Iscallerchilddomain bool   `json:"iscallerchilddomain"`
+		Isdefault           bool   `json:"isdefault"`
+		Lastname            string `json:"lastname"`
+		Roleid              string `json:"roleid"`
+		Rolename            string `json:"rolename"`
+		Roletype            string `json:"roletype"`
+		Secretkey           string `json:"secretkey"`
+		State               string `json:"state"`
+		Timezone            string `json:"timezone"`
+		Username            string `json:"username"`
+	} `json:"user"`
+	Vmavailable     string `json:"vmavailable"`
+	Vmlimit         string `json:"vmlimit"`
+	Vmrunning       int    `json:"vmrunning"`
+	Vmstopped       int    `json:"vmstopped"`
+	Vmtotal         int64  `json:"vmtotal"`
+	Volumeavailable string `json:"volumeavailable"`
+	Volumelimit     string `json:"volumelimit"`
+	Volumetotal     int64  `json:"volumetotal"`
+	Vpcavailable    string `json:"vpcavailable"`
+	Vpclimit        string `json:"vpclimit"`
+	Vpctotal        int64  `json:"vpctotal"`
+}
+
+type ListProjectAccountsParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListProjectAccountsParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["projectid"]; found {
+		u.Set("projectid", v.(string))
+	}
+	if v, found := p.p["role"]; found {
+		u.Set("role", v.(string))
+	}
+	return u
+}
+
+func (p *ListProjectAccountsParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *ListProjectAccountsParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListProjectAccountsParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListProjectAccountsParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListProjectAccountsParams) SetProjectid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectid"] = v
+	return
+}
+
+func (p *ListProjectAccountsParams) SetRole(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["role"] = v
+	return
+}
+
+// You should always use this function to get a new ListProjectAccountsParams instance,
+// as then you are sure you have configured all required params
+func (s *AccountService) NewListProjectAccountsParams(projectid string) *ListProjectAccountsParams {
+	p := &ListProjectAccountsParams{}
+	p.p = make(map[string]interface{})
+	p.p["projectid"] = projectid
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *AccountService) GetProjectAccountID(keyword string, projectid string, opts ...OptionFunc) (string, int, error) {
+	p := &ListProjectAccountsParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["keyword"] = keyword
+	p.p["projectid"] = projectid
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return "", -1, err
+		}
+	}
+
+	l, err := s.ListProjectAccounts(p)
+	if err != nil {
+		return "", -1, err
+	}
+
+	if l.Count == 0 {
+		return "", l.Count, fmt.Errorf("No match found for %s: %+v", keyword, l)
+	}
+
+	if l.Count == 1 {
+		return l.ProjectAccounts[0].Id, l.Count, nil
+	}
+
+	if l.Count > 1 {
+		for _, v := range l.ProjectAccounts {
+			if v.Name == keyword {
+				return v.Id, l.Count, nil
+			}
+		}
+	}
+	return "", l.Count, fmt.Errorf("Could not find an exact match for %s: %+v", keyword, l)
+}
+
+// Lists project's accounts
+func (s *AccountService) ListProjectAccounts(p *ListProjectAccountsParams) (*ListProjectAccountsResponse, error) {
+	resp, err := s.cs.newRequest("listProjectAccounts", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListProjectAccountsResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListProjectAccountsResponse struct {
+	Count           int               `json:"count"`
+	ProjectAccounts []*ProjectAccount `json:"projectaccount"`
+}
+
+type ProjectAccount struct {
+	Account                   string `json:"account"`
+	Cpuavailable              string `json:"cpuavailable"`
+	Cpulimit                  string `json:"cpulimit"`
+	Cputotal                  int64  `json:"cputotal"`
+	Displaytext               string `json:"displaytext"`
+	Domain                    string `json:"domain"`
+	Domainid                  string `json:"domainid"`
+	Id                        string `json:"id"`
+	Ipavailable               string `json:"ipavailable"`
+	Iplimit                   string `json:"iplimit"`
+	Iptotal                   int64  `json:"iptotal"`
+	Memoryavailable           string `json:"memoryavailable"`
+	Memorylimit               string `json:"memorylimit"`
+	Memorytotal               int64  `json:"memorytotal"`
+	Name                      string `json:"name"`
+	Networkavailable          string `json:"networkavailable"`
+	Networklimit              string `json:"networklimit"`
+	Networktotal              int64  `json:"networktotal"`
+	Primarystorageavailable   string `json:"primarystorageavailable"`
+	Primarystoragelimit       string `json:"primarystoragelimit"`
+	Primarystoragetotal       int64  `json:"primarystoragetotal"`
+	Secondarystorageavailable string `json:"secondarystorageavailable"`
+	Secondarystoragelimit     string `json:"secondarystoragelimit"`
+	Secondarystoragetotal     int64  `json:"secondarystoragetotal"`
+	Snapshotavailable         string `json:"snapshotavailable"`
+	Snapshotlimit             string `json:"snapshotlimit"`
+	Snapshottotal             int64  `json:"snapshottotal"`
+	State                     string `json:"state"`
+	Tags                      []struct {
+		Account      string `json:"account"`
+		Customer     string `json:"customer"`
+		Domain       string `json:"domain"`
+		Domainid     string `json:"domainid"`
+		Key          string `json:"key"`
+		Project      string `json:"project"`
+		Projectid    string `json:"projectid"`
+		Resourceid   string `json:"resourceid"`
+		Resourcetype string `json:"resourcetype"`
+		Value        string `json:"value"`
+	} `json:"tags"`
+	Templateavailable string `json:"templateavailable"`
+	Templatelimit     string `json:"templatelimit"`
+	Templatetotal     int64  `json:"templatetotal"`
+	Vmavailable       string `json:"vmavailable"`
+	Vmlimit           string `json:"vmlimit"`
+	Vmrunning         int    `json:"vmrunning"`
+	Vmstopped         int    `json:"vmstopped"`
+	Vmtotal           int64  `json:"vmtotal"`
+	Volumeavailable   string `json:"volumeavailable"`
+	Volumelimit       string `json:"volumelimit"`
+	Volumetotal       int64  `json:"volumetotal"`
+	Vpcavailable      string `json:"vpcavailable"`
+	Vpclimit          string `json:"vpclimit"`
+	Vpctotal          int64  `json:"vpctotal"`
+}
+
+type LockAccountParams struct {
+	p map[string]interface{}
+}
+
+func (p *LockAccountParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	return u
+}
+
+func (p *LockAccountParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *LockAccountParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+// You should always use this function to get a new LockAccountParams instance,
+// as then you are sure you have configured all required params
+func (s *AccountService) NewLockAccountParams(account string, domainid string) *LockAccountParams {
+	p := &LockAccountParams{}
+	p.p = make(map[string]interface{})
+	p.p["account"] = account
+	p.p["domainid"] = domainid
+	return p
+}
+
+// This deprecated function used to locks an account. Look for the API DisableAccount instead
+func (s *AccountService) LockAccount(p *LockAccountParams) (*LockAccountResponse, error) {
+	resp, err := s.cs.newRequest("lockAccount", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r LockAccountResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type LockAccountResponse struct {
+	Accountdetails            map[string]string `json:"accountdetails"`
+	Accounttype               int               `json:"accounttype"`
+	Cpuavailable              string            `json:"cpuavailable"`
+	Cpulimit                  string            `json:"cpulimit"`
+	Cputotal                  int64             `json:"cputotal"`
+	Defaultzoneid             string            `json:"defaultzoneid"`
+	Domain                    string            `json:"domain"`
+	Domainid                  string            `json:"domainid"`
+	Groups                    []string          `json:"groups"`
+	Id                        string            `json:"id"`
+	Ipavailable               string            `json:"ipavailable"`
+	Iplimit                   string            `json:"iplimit"`
+	Iptotal                   int64             `json:"iptotal"`
+	Iscleanuprequired         bool              `json:"iscleanuprequired"`
+	Isdefault                 bool              `json:"isdefault"`
+	Memoryavailable           string            `json:"memoryavailable"`
+	Memorylimit               string            `json:"memorylimit"`
+	Memorytotal               int64             `json:"memorytotal"`
+	Name                      string            `json:"name"`
+	Networkavailable          string            `json:"networkavailable"`
+	Networkdomain             string            `json:"networkdomain"`
+	Networklimit              string            `json:"networklimit"`
+	Networktotal              int64             `json:"networktotal"`
+	Primarystorageavailable   string            `json:"primarystorageavailable"`
+	Primarystoragelimit       string            `json:"primarystoragelimit"`
+	Primarystoragetotal       int64             `json:"primarystoragetotal"`
+	Projectavailable          string            `json:"projectavailable"`
+	Projectlimit              string            `json:"projectlimit"`
+	Projecttotal              int64             `json:"projecttotal"`
+	Receivedbytes             int64             `json:"receivedbytes"`
+	Roleid                    string            `json:"roleid"`
+	Rolename                  string            `json:"rolename"`
+	Roletype                  string            `json:"roletype"`
+	Secondarystorageavailable string            `json:"secondarystorageavailable"`
+	Secondarystoragelimit     string            `json:"secondarystoragelimit"`
+	Secondarystoragetotal     int64             `json:"secondarystoragetotal"`
+	Sentbytes                 int64             `json:"sentbytes"`
+	Snapshotavailable         string            `json:"snapshotavailable"`
+	Snapshotlimit             string            `json:"snapshotlimit"`
+	Snapshottotal             int64             `json:"snapshottotal"`
+	State                     string            `json:"state"`
+	Templateavailable         string            `json:"templateavailable"`
+	Templatelimit             string            `json:"templatelimit"`
+	Templatetotal             int64             `json:"templatetotal"`
+	User                      []struct {
+		Account             string `json:"account"`
+		Accountid           string `json:"accountid"`
+		Accounttype         int    `json:"accounttype"`
+		Apikey              string `json:"apikey"`
+		Created             string `json:"created"`
+		Domain              string `json:"domain"`
+		Domainid            string `json:"domainid"`
+		Email               string `json:"email"`
+		Firstname           string `json:"firstname"`
+		Id                  string `json:"id"`
+		Iscallerchilddomain bool   `json:"iscallerchilddomain"`
+		Isdefault           bool   `json:"isdefault"`
+		Lastname            string `json:"lastname"`
+		Roleid              string `json:"roleid"`
+		Rolename            string `json:"rolename"`
+		Roletype            string `json:"roletype"`
+		Secretkey           string `json:"secretkey"`
+		State               string `json:"state"`
+		Timezone            string `json:"timezone"`
+		Username            string `json:"username"`
+	} `json:"user"`
+	Vmavailable     string `json:"vmavailable"`
+	Vmlimit         string `json:"vmlimit"`
+	Vmrunning       int    `json:"vmrunning"`
+	Vmstopped       int    `json:"vmstopped"`
+	Vmtotal         int64  `json:"vmtotal"`
+	Volumeavailable string `json:"volumeavailable"`
+	Volumelimit     string `json:"volumelimit"`
+	Volumetotal     int64  `json:"volumetotal"`
+	Vpcavailable    string `json:"vpcavailable"`
+	Vpclimit        string `json:"vpclimit"`
+	Vpctotal        int64  `json:"vpctotal"`
+}
+
+type MarkDefaultZoneForAccountParams struct {
+	p map[string]interface{}
+}
+
+func (p *MarkDefaultZoneForAccountParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *MarkDefaultZoneForAccountParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *MarkDefaultZoneForAccountParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *MarkDefaultZoneForAccountParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new MarkDefaultZoneForAccountParams instance,
+// as then you are sure you have configured all required params
+func (s *AccountService) NewMarkDefaultZoneForAccountParams(account string, domainid string, zoneid string) *MarkDefaultZoneForAccountParams {
+	p := &MarkDefaultZoneForAccountParams{}
+	p.p = make(map[string]interface{})
+	p.p["account"] = account
+	p.p["domainid"] = domainid
+	p.p["zoneid"] = zoneid
+	return p
+}
+
+// Marks a default zone for this account
+func (s *AccountService) MarkDefaultZoneForAccount(p *MarkDefaultZoneForAccountParams) (*MarkDefaultZoneForAccountResponse, error) {
+	resp, err := s.cs.newRequest("markDefaultZoneForAccount", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r MarkDefaultZoneForAccountResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type MarkDefaultZoneForAccountResponse struct {
+	JobID                     string            `json:"jobid"`
+	Accountdetails            map[string]string `json:"accountdetails"`
+	Accounttype               int               `json:"accounttype"`
+	Cpuavailable              string            `json:"cpuavailable"`
+	Cpulimit                  string            `json:"cpulimit"`
+	Cputotal                  int64             `json:"cputotal"`
+	Defaultzoneid             string            `json:"defaultzoneid"`
+	Domain                    string            `json:"domain"`
+	Domainid                  string            `json:"domainid"`
+	Groups                    []string          `json:"groups"`
+	Id                        string            `json:"id"`
+	Ipavailable               string            `json:"ipavailable"`
+	Iplimit                   string            `json:"iplimit"`
+	Iptotal                   int64             `json:"iptotal"`
+	Iscleanuprequired         bool              `json:"iscleanuprequired"`
+	Isdefault                 bool              `json:"isdefault"`
+	Memoryavailable           string            `json:"memoryavailable"`
+	Memorylimit               string            `json:"memorylimit"`
+	Memorytotal               int64             `json:"memorytotal"`
+	Name                      string            `json:"name"`
+	Networkavailable          string            `json:"networkavailable"`
+	Networkdomain             string            `json:"networkdomain"`
+	Networklimit              string            `json:"networklimit"`
+	Networktotal              int64             `json:"networktotal"`
+	Primarystorageavailable   string            `json:"primarystorageavailable"`
+	Primarystoragelimit       string            `json:"primarystoragelimit"`
+	Primarystoragetotal       int64             `json:"primarystoragetotal"`
+	Projectavailable          string            `json:"projectavailable"`
+	Projectlimit              string            `json:"projectlimit"`
+	Projecttotal              int64             `json:"projecttotal"`
+	Receivedbytes             int64             `json:"receivedbytes"`
+	Roleid                    string            `json:"roleid"`
+	Rolename                  string            `json:"rolename"`
+	Roletype                  string            `json:"roletype"`
+	Secondarystorageavailable string            `json:"secondarystorageavailable"`
+	Secondarystoragelimit     string            `json:"secondarystoragelimit"`
+	Secondarystoragetotal     int64             `json:"secondarystoragetotal"`
+	Sentbytes                 int64             `json:"sentbytes"`
+	Snapshotavailable         string            `json:"snapshotavailable"`
+	Snapshotlimit             string            `json:"snapshotlimit"`
+	Snapshottotal             int64             `json:"snapshottotal"`
+	State                     string            `json:"state"`
+	Templateavailable         string            `json:"templateavailable"`
+	Templatelimit             string            `json:"templatelimit"`
+	Templatetotal             int64             `json:"templatetotal"`
+	User                      []struct {
+		Account             string `json:"account"`
+		Accountid           string `json:"accountid"`
+		Accounttype         int    `json:"accounttype"`
+		Apikey              string `json:"apikey"`
+		Created             string `json:"created"`
+		Domain              string `json:"domain"`
+		Domainid            string `json:"domainid"`
+		Email               string `json:"email"`
+		Firstname           string `json:"firstname"`
+		Id                  string `json:"id"`
+		Iscallerchilddomain bool   `json:"iscallerchilddomain"`
+		Isdefault           bool   `json:"isdefault"`
+		Lastname            string `json:"lastname"`
+		Roleid              string `json:"roleid"`
+		Rolename            string `json:"rolename"`
+		Roletype            string `json:"roletype"`
+		Secretkey           string `json:"secretkey"`
+		State               string `json:"state"`
+		Timezone            string `json:"timezone"`
+		Username            string `json:"username"`
+	} `json:"user"`
+	Vmavailable     string `json:"vmavailable"`
+	Vmlimit         string `json:"vmlimit"`
+	Vmrunning       int    `json:"vmrunning"`
+	Vmstopped       int    `json:"vmstopped"`
+	Vmtotal         int64  `json:"vmtotal"`
+	Volumeavailable string `json:"volumeavailable"`
+	Volumelimit     string `json:"volumelimit"`
+	Volumetotal     int64  `json:"volumetotal"`
+	Vpcavailable    string `json:"vpcavailable"`
+	Vpclimit        string `json:"vpclimit"`
+	Vpctotal        int64  `json:"vpctotal"`
+}
+
+type UpdateAccountParams struct {
+	p map[string]interface{}
+}
+
+func (p *UpdateAccountParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["accountdetails"]; found {
+		i := 0
+		for k, vv := range v.(map[string]string) {
+			u.Set(fmt.Sprintf("accountdetails[%d].key", i), k)
+			u.Set(fmt.Sprintf("accountdetails[%d].value", i), vv)
+			i++
+		}
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["networkdomain"]; found {
+		u.Set("networkdomain", v.(string))
+	}
+	if v, found := p.p["newname"]; found {
+		u.Set("newname", v.(string))
+	}
+	return u
+}
+
+func (p *UpdateAccountParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *UpdateAccountParams) SetAccountdetails(v map[string]string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["accountdetails"] = v
+	return
+}
+
+func (p *UpdateAccountParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *UpdateAccountParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *UpdateAccountParams) SetNetworkdomain(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["networkdomain"] = v
+	return
+}
+
+func (p *UpdateAccountParams) SetNewname(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["newname"] = v
+	return
+}
+
+// You should always use this function to get a new UpdateAccountParams instance,
+// as then you are sure you have configured all required params
+func (s *AccountService) NewUpdateAccountParams(newname string) *UpdateAccountParams {
+	p := &UpdateAccountParams{}
+	p.p = make(map[string]interface{})
+	p.p["newname"] = newname
+	return p
+}
+
+// Updates account information for the authenticated user
+func (s *AccountService) UpdateAccount(p *UpdateAccountParams) (*UpdateAccountResponse, error) {
+	resp, err := s.cs.newRequest("updateAccount", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r UpdateAccountResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type UpdateAccountResponse struct {
+	Accountdetails            map[string]string `json:"accountdetails"`
+	Accounttype               int               `json:"accounttype"`
+	Cpuavailable              string            `json:"cpuavailable"`
+	Cpulimit                  string            `json:"cpulimit"`
+	Cputotal                  int64             `json:"cputotal"`
+	Defaultzoneid             string            `json:"defaultzoneid"`
+	Domain                    string            `json:"domain"`
+	Domainid                  string            `json:"domainid"`
+	Groups                    []string          `json:"groups"`
+	Id                        string            `json:"id"`
+	Ipavailable               string            `json:"ipavailable"`
+	Iplimit                   string            `json:"iplimit"`
+	Iptotal                   int64             `json:"iptotal"`
+	Iscleanuprequired         bool              `json:"iscleanuprequired"`
+	Isdefault                 bool              `json:"isdefault"`
+	Memoryavailable           string            `json:"memoryavailable"`
+	Memorylimit               string            `json:"memorylimit"`
+	Memorytotal               int64             `json:"memorytotal"`
+	Name                      string            `json:"name"`
+	Networkavailable          string            `json:"networkavailable"`
+	Networkdomain             string            `json:"networkdomain"`
+	Networklimit              string            `json:"networklimit"`
+	Networktotal              int64             `json:"networktotal"`
+	Primarystorageavailable   string            `json:"primarystorageavailable"`
+	Primarystoragelimit       string            `json:"primarystoragelimit"`
+	Primarystoragetotal       int64             `json:"primarystoragetotal"`
+	Projectavailable          string            `json:"projectavailable"`
+	Projectlimit              string            `json:"projectlimit"`
+	Projecttotal              int64             `json:"projecttotal"`
+	Receivedbytes             int64             `json:"receivedbytes"`
+	Roleid                    string            `json:"roleid"`
+	Rolename                  string            `json:"rolename"`
+	Roletype                  string            `json:"roletype"`
+	Secondarystorageavailable string            `json:"secondarystorageavailable"`
+	Secondarystoragelimit     string            `json:"secondarystoragelimit"`
+	Secondarystoragetotal     int64             `json:"secondarystoragetotal"`
+	Sentbytes                 int64             `json:"sentbytes"`
+	Snapshotavailable         string            `json:"snapshotavailable"`
+	Snapshotlimit             string            `json:"snapshotlimit"`
+	Snapshottotal             int64             `json:"snapshottotal"`
+	State                     string            `json:"state"`
+	Templateavailable         string            `json:"templateavailable"`
+	Templatelimit             string            `json:"templatelimit"`
+	Templatetotal             int64             `json:"templatetotal"`
+	User                      []struct {
+		Account             string `json:"account"`
+		Accountid           string `json:"accountid"`
+		Accounttype         int    `json:"accounttype"`
+		Apikey              string `json:"apikey"`
+		Created             string `json:"created"`
+		Domain              string `json:"domain"`
+		Domainid            string `json:"domainid"`
+		Email               string `json:"email"`
+		Firstname           string `json:"firstname"`
+		Id                  string `json:"id"`
+		Iscallerchilddomain bool   `json:"iscallerchilddomain"`
+		Isdefault           bool   `json:"isdefault"`
+		Lastname            string `json:"lastname"`
+		Roleid              string `json:"roleid"`
+		Rolename            string `json:"rolename"`
+		Roletype            string `json:"roletype"`
+		Secretkey           string `json:"secretkey"`
+		State               string `json:"state"`
+		Timezone            string `json:"timezone"`
+		Username            string `json:"username"`
+	} `json:"user"`
+	Vmavailable     string `json:"vmavailable"`
+	Vmlimit         string `json:"vmlimit"`
+	Vmrunning       int    `json:"vmrunning"`
+	Vmstopped       int    `json:"vmstopped"`
+	Vmtotal         int64  `json:"vmtotal"`
+	Volumeavailable string `json:"volumeavailable"`
+	Volumelimit     string `json:"volumelimit"`
+	Volumetotal     int64  `json:"volumetotal"`
+	Vpcavailable    string `json:"vpcavailable"`
+	Vpclimit        string `json:"vpclimit"`
+	Vpctotal        int64  `json:"vpctotal"`
+}
diff --git a/vendor/github.com/xanzy/go-cloudstack/cloudstack/AddressService.go b/vendor/github.com/xanzy/go-cloudstack/cloudstack/AddressService.go
new file mode 100644
index 0000000..3adee85
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/cloudstack/AddressService.go
@@ -0,0 +1,815 @@
+//
+// Copyright 2018, Sander van Harmelen
+//
+// Licensed 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 cloudstack
+
+import (
+	"encoding/json"
+	"fmt"
+	"net/url"
+	"strconv"
+	"strings"
+)
+
+type AssociateIpAddressParams struct {
+	p map[string]interface{}
+}
+
+func (p *AssociateIpAddressParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["fordisplay"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("fordisplay", vv)
+	}
+	if v, found := p.p["isportable"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("isportable", vv)
+	}
+	if v, found := p.p["networkid"]; found {
+		u.Set("networkid", v.(string))
+	}
+	if v, found := p.p["projectid"]; found {
+		u.Set("projectid", v.(string))
+	}
+	if v, found := p.p["regionid"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("regionid", vv)
+	}
+	if v, found := p.p["vpcid"]; found {
+		u.Set("vpcid", v.(string))
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *AssociateIpAddressParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *AssociateIpAddressParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *AssociateIpAddressParams) SetFordisplay(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["fordisplay"] = v
+	return
+}
+
+func (p *AssociateIpAddressParams) SetIsportable(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isportable"] = v
+	return
+}
+
+func (p *AssociateIpAddressParams) SetNetworkid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["networkid"] = v
+	return
+}
+
+func (p *AssociateIpAddressParams) SetProjectid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectid"] = v
+	return
+}
+
+func (p *AssociateIpAddressParams) SetRegionid(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["regionid"] = v
+	return
+}
+
+func (p *AssociateIpAddressParams) SetVpcid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["vpcid"] = v
+	return
+}
+
+func (p *AssociateIpAddressParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new AssociateIpAddressParams instance,
+// as then you are sure you have configured all required params
+func (s *AddressService) NewAssociateIpAddressParams() *AssociateIpAddressParams {
+	p := &AssociateIpAddressParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// Acquires and associates a public IP to an account.
+func (s *AddressService) AssociateIpAddress(p *AssociateIpAddressParams) (*AssociateIpAddressResponse, error) {
+	resp, err := s.cs.newRequest("associateIpAddress", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r AssociateIpAddressResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type AssociateIpAddressResponse struct {
+	JobID                 string `json:"jobid"`
+	Account               string `json:"account"`
+	Allocated             string `json:"allocated"`
+	Associatednetworkid   string `json:"associatednetworkid"`
+	Associatednetworkname string `json:"associatednetworkname"`
+	Domain                string `json:"domain"`
+	Domainid              string `json:"domainid"`
+	Fordisplay            bool   `json:"fordisplay"`
+	Forvirtualnetwork     bool   `json:"forvirtualnetwork"`
+	Id                    string `json:"id"`
+	Ipaddress             string `json:"ipaddress"`
+	Isportable            bool   `json:"isportable"`
+	Issourcenat           bool   `json:"issourcenat"`
+	Isstaticnat           bool   `json:"isstaticnat"`
+	Issystem              bool   `json:"issystem"`
+	Networkid             string `json:"networkid"`
+	Physicalnetworkid     string `json:"physicalnetworkid"`
+	Project               string `json:"project"`
+	Projectid             string `json:"projectid"`
+	Purpose               string `json:"purpose"`
+	State                 string `json:"state"`
+	Tags                  []struct {
+		Account      string `json:"account"`
+		Customer     string `json:"customer"`
+		Domain       string `json:"domain"`
+		Domainid     string `json:"domainid"`
+		Key          string `json:"key"`
+		Project      string `json:"project"`
+		Projectid    string `json:"projectid"`
+		Resourceid   string `json:"resourceid"`
+		Resourcetype string `json:"resourcetype"`
+		Value        string `json:"value"`
+	} `json:"tags"`
+	Virtualmachinedisplayname string `json:"virtualmachinedisplayname"`
+	Virtualmachineid          string `json:"virtualmachineid"`
+	Virtualmachinename        string `json:"virtualmachinename"`
+	Vlanid                    string `json:"vlanid"`
+	Vlanname                  string `json:"vlanname"`
+	Vmipaddress               string `json:"vmipaddress"`
+	Vpcid                     string `json:"vpcid"`
+	Zoneid                    string `json:"zoneid"`
+	Zonename                  string `json:"zonename"`
+}
+
+type DisassociateIpAddressParams struct {
+	p map[string]interface{}
+}
+
+func (p *DisassociateIpAddressParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *DisassociateIpAddressParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new DisassociateIpAddressParams instance,
+// as then you are sure you have configured all required params
+func (s *AddressService) NewDisassociateIpAddressParams(id string) *DisassociateIpAddressParams {
+	p := &DisassociateIpAddressParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Disassociates an IP address from the account.
+func (s *AddressService) DisassociateIpAddress(p *DisassociateIpAddressParams) (*DisassociateIpAddressResponse, error) {
+	resp, err := s.cs.newRequest("disassociateIpAddress", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DisassociateIpAddressResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type DisassociateIpAddressResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
+
+type ListPublicIpAddressesParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListPublicIpAddressesParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["allocatedonly"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("allocatedonly", vv)
+	}
+	if v, found := p.p["associatednetworkid"]; found {
+		u.Set("associatednetworkid", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["fordisplay"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("fordisplay", vv)
+	}
+	if v, found := p.p["forloadbalancing"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("forloadbalancing", vv)
+	}
+	if v, found := p.p["forvirtualnetwork"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("forvirtualnetwork", vv)
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["ipaddress"]; found {
+		u.Set("ipaddress", v.(string))
+	}
+	if v, found := p.p["isrecursive"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("isrecursive", vv)
+	}
+	if v, found := p.p["issourcenat"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("issourcenat", vv)
+	}
+	if v, found := p.p["isstaticnat"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("isstaticnat", vv)
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["listall"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("listall", vv)
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["physicalnetworkid"]; found {
+		u.Set("physicalnetworkid", v.(string))
+	}
+	if v, found := p.p["projectid"]; found {
+		u.Set("projectid", v.(string))
+	}
+	if v, found := p.p["state"]; found {
+		u.Set("state", v.(string))
+	}
+	if v, found := p.p["tags"]; found {
+		i := 0
+		for k, vv := range v.(map[string]string) {
+			u.Set(fmt.Sprintf("tags[%d].key", i), k)
+			u.Set(fmt.Sprintf("tags[%d].value", i), vv)
+			i++
+		}
+	}
+	if v, found := p.p["vlanid"]; found {
+		u.Set("vlanid", v.(string))
+	}
+	if v, found := p.p["vpcid"]; found {
+		u.Set("vpcid", v.(string))
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *ListPublicIpAddressesParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *ListPublicIpAddressesParams) SetAllocatedonly(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["allocatedonly"] = v
+	return
+}
+
+func (p *ListPublicIpAddressesParams) SetAssociatednetworkid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["associatednetworkid"] = v
+	return
+}
+
+func (p *ListPublicIpAddressesParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *ListPublicIpAddressesParams) SetFordisplay(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["fordisplay"] = v
+	return
+}
+
+func (p *ListPublicIpAddressesParams) SetForloadbalancing(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["forloadbalancing"] = v
+	return
+}
+
+func (p *ListPublicIpAddressesParams) SetForvirtualnetwork(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["forvirtualnetwork"] = v
+	return
+}
+
+func (p *ListPublicIpAddressesParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ListPublicIpAddressesParams) SetIpaddress(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["ipaddress"] = v
+	return
+}
+
+func (p *ListPublicIpAddressesParams) SetIsrecursive(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isrecursive"] = v
+	return
+}
+
+func (p *ListPublicIpAddressesParams) SetIssourcenat(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["issourcenat"] = v
+	return
+}
+
+func (p *ListPublicIpAddressesParams) SetIsstaticnat(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isstaticnat"] = v
+	return
+}
+
+func (p *ListPublicIpAddressesParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListPublicIpAddressesParams) SetListall(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["listall"] = v
+	return
+}
+
+func (p *ListPublicIpAddressesParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListPublicIpAddressesParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListPublicIpAddressesParams) SetPhysicalnetworkid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["physicalnetworkid"] = v
+	return
+}
+
+func (p *ListPublicIpAddressesParams) SetProjectid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectid"] = v
+	return
+}
+
+func (p *ListPublicIpAddressesParams) SetState(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["state"] = v
+	return
+}
+
+func (p *ListPublicIpAddressesParams) SetTags(v map[string]string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["tags"] = v
+	return
+}
+
+func (p *ListPublicIpAddressesParams) SetVlanid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["vlanid"] = v
+	return
+}
+
+func (p *ListPublicIpAddressesParams) SetVpcid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["vpcid"] = v
+	return
+}
+
+func (p *ListPublicIpAddressesParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new ListPublicIpAddressesParams instance,
+// as then you are sure you have configured all required params
+func (s *AddressService) NewListPublicIpAddressesParams() *ListPublicIpAddressesParams {
+	p := &ListPublicIpAddressesParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *AddressService) GetPublicIpAddressByID(id string, opts ...OptionFunc) (*PublicIpAddress, int, error) {
+	p := &ListPublicIpAddressesParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["id"] = id
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return nil, -1, err
+		}
+	}
+
+	l, err := s.ListPublicIpAddresses(p)
+	if err != nil {
+		if strings.Contains(err.Error(), fmt.Sprintf(
+			"Invalid parameter id value=%s due to incorrect long value format, "+
+				"or entity does not exist", id)) {
+			return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
+		}
+		return nil, -1, err
+	}
+
+	if l.Count == 0 {
+		return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
+	}
+
+	if l.Count == 1 {
+		return l.PublicIpAddresses[0], l.Count, nil
+	}
+	return nil, l.Count, fmt.Errorf("There is more then one result for PublicIpAddress UUID: %s!", id)
+}
+
+// Lists all public ip addresses
+func (s *AddressService) ListPublicIpAddresses(p *ListPublicIpAddressesParams) (*ListPublicIpAddressesResponse, error) {
+	resp, err := s.cs.newRequest("listPublicIpAddresses", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListPublicIpAddressesResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListPublicIpAddressesResponse struct {
+	Count             int                `json:"count"`
+	PublicIpAddresses []*PublicIpAddress `json:"publicipaddress"`
+}
+
+type PublicIpAddress struct {
+	Account               string `json:"account"`
+	Allocated             string `json:"allocated"`
+	Associatednetworkid   string `json:"associatednetworkid"`
+	Associatednetworkname string `json:"associatednetworkname"`
+	Domain                string `json:"domain"`
+	Domainid              string `json:"domainid"`
+	Fordisplay            bool   `json:"fordisplay"`
+	Forvirtualnetwork     bool   `json:"forvirtualnetwork"`
+	Id                    string `json:"id"`
+	Ipaddress             string `json:"ipaddress"`
+	Isportable            bool   `json:"isportable"`
+	Issourcenat           bool   `json:"issourcenat"`
+	Isstaticnat           bool   `json:"isstaticnat"`
+	Issystem              bool   `json:"issystem"`
+	Networkid             string `json:"networkid"`
+	Physicalnetworkid     string `json:"physicalnetworkid"`
+	Project               string `json:"project"`
+	Projectid             string `json:"projectid"`
+	Purpose               string `json:"purpose"`
+	State                 string `json:"state"`
+	Tags                  []struct {
+		Account      string `json:"account"`
+		Customer     string `json:"customer"`
+		Domain       string `json:"domain"`
+		Domainid     string `json:"domainid"`
+		Key          string `json:"key"`
+		Project      string `json:"project"`
+		Projectid    string `json:"projectid"`
+		Resourceid   string `json:"resourceid"`
+		Resourcetype string `json:"resourcetype"`
+		Value        string `json:"value"`
+	} `json:"tags"`
+	Virtualmachinedisplayname string `json:"virtualmachinedisplayname"`
+	Virtualmachineid          string `json:"virtualmachineid"`
+	Virtualmachinename        string `json:"virtualmachinename"`
+	Vlanid                    string `json:"vlanid"`
+	Vlanname                  string `json:"vlanname"`
+	Vmipaddress               string `json:"vmipaddress"`
+	Vpcid                     string `json:"vpcid"`
+	Zoneid                    string `json:"zoneid"`
+	Zonename                  string `json:"zonename"`
+}
+
+type UpdateIpAddressParams struct {
+	p map[string]interface{}
+}
+
+func (p *UpdateIpAddressParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["customid"]; found {
+		u.Set("customid", v.(string))
+	}
+	if v, found := p.p["fordisplay"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("fordisplay", vv)
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *UpdateIpAddressParams) SetCustomid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["customid"] = v
+	return
+}
+
+func (p *UpdateIpAddressParams) SetFordisplay(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["fordisplay"] = v
+	return
+}
+
+func (p *UpdateIpAddressParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new UpdateIpAddressParams instance,
+// as then you are sure you have configured all required params
+func (s *AddressService) NewUpdateIpAddressParams(id string) *UpdateIpAddressParams {
+	p := &UpdateIpAddressParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Updates an IP address
+func (s *AddressService) UpdateIpAddress(p *UpdateIpAddressParams) (*UpdateIpAddressResponse, error) {
+	resp, err := s.cs.newRequest("updateIpAddress", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r UpdateIpAddressResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type UpdateIpAddressResponse struct {
+	JobID                 string `json:"jobid"`
+	Account               string `json:"account"`
+	Allocated             string `json:"allocated"`
+	Associatednetworkid   string `json:"associatednetworkid"`
+	Associatednetworkname string `json:"associatednetworkname"`
+	Domain                string `json:"domain"`
+	Domainid              string `json:"domainid"`
+	Fordisplay            bool   `json:"fordisplay"`
+	Forvirtualnetwork     bool   `json:"forvirtualnetwork"`
+	Id                    string `json:"id"`
+	Ipaddress             string `json:"ipaddress"`
+	Isportable            bool   `json:"isportable"`
+	Issourcenat           bool   `json:"issourcenat"`
+	Isstaticnat           bool   `json:"isstaticnat"`
+	Issystem              bool   `json:"issystem"`
+	Networkid             string `json:"networkid"`
+	Physicalnetworkid     string `json:"physicalnetworkid"`
+	Project               string `json:"project"`
+	Projectid             string `json:"projectid"`
+	Purpose               string `json:"purpose"`
+	State                 string `json:"state"`
+	Tags                  []struct {
+		Account      string `json:"account"`
+		Customer     string `json:"customer"`
+		Domain       string `json:"domain"`
+		Domainid     string `json:"domainid"`
+		Key          string `json:"key"`
+		Project      string `json:"project"`
+		Projectid    string `json:"projectid"`
+		Resourceid   string `json:"resourceid"`
+		Resourcetype string `json:"resourcetype"`
+		Value        string `json:"value"`
+	} `json:"tags"`
+	Virtualmachinedisplayname string `json:"virtualmachinedisplayname"`
+	Virtualmachineid          string `json:"virtualmachineid"`
+	Virtualmachinename        string `json:"virtualmachinename"`
+	Vlanid                    string `json:"vlanid"`
+	Vlanname                  string `json:"vlanname"`
+	Vmipaddress               string `json:"vmipaddress"`
+	Vpcid                     string `json:"vpcid"`
+	Zoneid                    string `json:"zoneid"`
+	Zonename                  string `json:"zonename"`
+}
diff --git a/vendor/github.com/xanzy/go-cloudstack/cloudstack/AffinityGroupService.go b/vendor/github.com/xanzy/go-cloudstack/cloudstack/AffinityGroupService.go
new file mode 100644
index 0000000..e0b2f22
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/cloudstack/AffinityGroupService.go
@@ -0,0 +1,893 @@
+//
+// Copyright 2018, Sander van Harmelen
+//
+// Licensed 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 cloudstack
+
+import (
+	"encoding/json"
+	"fmt"
+	"net/url"
+	"strconv"
+	"strings"
+)
+
+type CreateAffinityGroupParams struct {
+	p map[string]interface{}
+}
+
+func (p *CreateAffinityGroupParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["description"]; found {
+		u.Set("description", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["projectid"]; found {
+		u.Set("projectid", v.(string))
+	}
+	if v, found := p.p["type"]; found {
+		u.Set("type", v.(string))
+	}
+	return u
+}
+
+func (p *CreateAffinityGroupParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *CreateAffinityGroupParams) SetDescription(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["description"] = v
+	return
+}
+
+func (p *CreateAffinityGroupParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *CreateAffinityGroupParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *CreateAffinityGroupParams) SetProjectid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectid"] = v
+	return
+}
+
+func (p *CreateAffinityGroupParams) SetType(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["type"] = v
+	return
+}
+
+// You should always use this function to get a new CreateAffinityGroupParams instance,
+// as then you are sure you have configured all required params
+func (s *AffinityGroupService) NewCreateAffinityGroupParams(name string, affinityGroupType string) *CreateAffinityGroupParams {
+	p := &CreateAffinityGroupParams{}
+	p.p = make(map[string]interface{})
+	p.p["name"] = name
+	p.p["type"] = affinityGroupType
+	return p
+}
+
+// Creates an affinity/anti-affinity group
+func (s *AffinityGroupService) CreateAffinityGroup(p *CreateAffinityGroupParams) (*CreateAffinityGroupResponse, error) {
+	resp, err := s.cs.newRequest("createAffinityGroup", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r CreateAffinityGroupResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type CreateAffinityGroupResponse struct {
+	JobID             string   `json:"jobid"`
+	Account           string   `json:"account"`
+	Description       string   `json:"description"`
+	Domain            string   `json:"domain"`
+	Domainid          string   `json:"domainid"`
+	Id                string   `json:"id"`
+	Name              string   `json:"name"`
+	Project           string   `json:"project"`
+	Projectid         string   `json:"projectid"`
+	Type              string   `json:"type"`
+	VirtualmachineIds []string `json:"virtualmachineIds"`
+}
+
+type DeleteAffinityGroupParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeleteAffinityGroupParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["projectid"]; found {
+		u.Set("projectid", v.(string))
+	}
+	return u
+}
+
+func (p *DeleteAffinityGroupParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *DeleteAffinityGroupParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *DeleteAffinityGroupParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *DeleteAffinityGroupParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *DeleteAffinityGroupParams) SetProjectid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectid"] = v
+	return
+}
+
+// You should always use this function to get a new DeleteAffinityGroupParams instance,
+// as then you are sure you have configured all required params
+func (s *AffinityGroupService) NewDeleteAffinityGroupParams() *DeleteAffinityGroupParams {
+	p := &DeleteAffinityGroupParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// Deletes affinity group
+func (s *AffinityGroupService) DeleteAffinityGroup(p *DeleteAffinityGroupParams) (*DeleteAffinityGroupResponse, error) {
+	resp, err := s.cs.newRequest("deleteAffinityGroup", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeleteAffinityGroupResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type DeleteAffinityGroupResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
+
+type ListAffinityGroupTypesParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListAffinityGroupTypesParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	return u
+}
+
+func (p *ListAffinityGroupTypesParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListAffinityGroupTypesParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListAffinityGroupTypesParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+// You should always use this function to get a new ListAffinityGroupTypesParams instance,
+// as then you are sure you have configured all required params
+func (s *AffinityGroupService) NewListAffinityGroupTypesParams() *ListAffinityGroupTypesParams {
+	p := &ListAffinityGroupTypesParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// Lists affinity group types available
+func (s *AffinityGroupService) ListAffinityGroupTypes(p *ListAffinityGroupTypesParams) (*ListAffinityGroupTypesResponse, error) {
+	resp, err := s.cs.newRequest("listAffinityGroupTypes", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListAffinityGroupTypesResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListAffinityGroupTypesResponse struct {
+	Count              int                  `json:"count"`
+	AffinityGroupTypes []*AffinityGroupType `json:"affinitygrouptype"`
+}
+
+type AffinityGroupType struct {
+	Type string `json:"type"`
+}
+
+type ListAffinityGroupsParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListAffinityGroupsParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["isrecursive"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("isrecursive", vv)
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["listall"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("listall", vv)
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["projectid"]; found {
+		u.Set("projectid", v.(string))
+	}
+	if v, found := p.p["type"]; found {
+		u.Set("type", v.(string))
+	}
+	if v, found := p.p["virtualmachineid"]; found {
+		u.Set("virtualmachineid", v.(string))
+	}
+	return u
+}
+
+func (p *ListAffinityGroupsParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *ListAffinityGroupsParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *ListAffinityGroupsParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ListAffinityGroupsParams) SetIsrecursive(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isrecursive"] = v
+	return
+}
+
+func (p *ListAffinityGroupsParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListAffinityGroupsParams) SetListall(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["listall"] = v
+	return
+}
+
+func (p *ListAffinityGroupsParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *ListAffinityGroupsParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListAffinityGroupsParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListAffinityGroupsParams) SetProjectid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectid"] = v
+	return
+}
+
+func (p *ListAffinityGroupsParams) SetType(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["type"] = v
+	return
+}
+
+func (p *ListAffinityGroupsParams) SetVirtualmachineid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["virtualmachineid"] = v
+	return
+}
+
+// You should always use this function to get a new ListAffinityGroupsParams instance,
+// as then you are sure you have configured all required params
+func (s *AffinityGroupService) NewListAffinityGroupsParams() *ListAffinityGroupsParams {
+	p := &ListAffinityGroupsParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *AffinityGroupService) GetAffinityGroupID(name string, opts ...OptionFunc) (string, int, error) {
+	p := &ListAffinityGroupsParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["name"] = name
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return "", -1, err
+		}
+	}
+
+	l, err := s.ListAffinityGroups(p)
+	if err != nil {
+		return "", -1, err
+	}
+
+	// This is needed because of a bug with the listAffinityGroup call. It reports the
+	// number of VirtualMachines in the groups as being the number of groups found.
+	l.Count = len(l.AffinityGroups)
+
+	if l.Count == 0 {
+		return "", l.Count, fmt.Errorf("No match found for %s: %+v", name, l)
+	}
+
+	if l.Count == 1 {
+		return l.AffinityGroups[0].Id, l.Count, nil
+	}
+
+	if l.Count > 1 {
+		for _, v := range l.AffinityGroups {
+			if v.Name == name {
+				return v.Id, l.Count, nil
+			}
+		}
+	}
+	return "", l.Count, fmt.Errorf("Could not find an exact match for %s: %+v", name, l)
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *AffinityGroupService) GetAffinityGroupByName(name string, opts ...OptionFunc) (*AffinityGroup, int, error) {
+	id, count, err := s.GetAffinityGroupID(name, opts...)
+	if err != nil {
+		return nil, count, err
+	}
+
+	r, count, err := s.GetAffinityGroupByID(id, opts...)
+	if err != nil {
+		return nil, count, err
+	}
+	return r, count, nil
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *AffinityGroupService) GetAffinityGroupByID(id string, opts ...OptionFunc) (*AffinityGroup, int, error) {
+	p := &ListAffinityGroupsParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["id"] = id
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return nil, -1, err
+		}
+	}
+
+	l, err := s.ListAffinityGroups(p)
+	if err != nil {
+		if strings.Contains(err.Error(), fmt.Sprintf(
+			"Invalid parameter id value=%s due to incorrect long value format, "+
+				"or entity does not exist", id)) {
+			return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
+		}
+		return nil, -1, err
+	}
+
+	// This is needed because of a bug with the listAffinityGroup call. It reports the
+	// number of VirtualMachines in the groups as being the number of groups found.
+	l.Count = len(l.AffinityGroups)
+
+	if l.Count == 0 {
+		return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
+	}
+
+	if l.Count == 1 {
+		return l.AffinityGroups[0], l.Count, nil
+	}
+	return nil, l.Count, fmt.Errorf("There is more then one result for AffinityGroup UUID: %s!", id)
+}
+
+// Lists affinity groups
+func (s *AffinityGroupService) ListAffinityGroups(p *ListAffinityGroupsParams) (*ListAffinityGroupsResponse, error) {
+	resp, err := s.cs.newRequest("listAffinityGroups", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListAffinityGroupsResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListAffinityGroupsResponse struct {
+	Count          int              `json:"count"`
+	AffinityGroups []*AffinityGroup `json:"affinitygroup"`
+}
+
+type AffinityGroup struct {
+	Account           string   `json:"account"`
+	Description       string   `json:"description"`
+	Domain            string   `json:"domain"`
+	Domainid          string   `json:"domainid"`
+	Id                string   `json:"id"`
+	Name              string   `json:"name"`
+	Project           string   `json:"project"`
+	Projectid         string   `json:"projectid"`
+	Type              string   `json:"type"`
+	VirtualmachineIds []string `json:"virtualmachineIds"`
+}
+
+type UpdateVMAffinityGroupParams struct {
+	p map[string]interface{}
+}
+
+func (p *UpdateVMAffinityGroupParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["affinitygroupids"]; found {
+		vv := strings.Join(v.([]string), ",")
+		u.Set("affinitygroupids", vv)
+	}
+	if v, found := p.p["affinitygroupnames"]; found {
+		vv := strings.Join(v.([]string), ",")
+		u.Set("affinitygroupnames", vv)
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *UpdateVMAffinityGroupParams) SetAffinitygroupids(v []string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["affinitygroupids"] = v
+	return
+}
+
+func (p *UpdateVMAffinityGroupParams) SetAffinitygroupnames(v []string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["affinitygroupnames"] = v
+	return
+}
+
+func (p *UpdateVMAffinityGroupParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new UpdateVMAffinityGroupParams instance,
+// as then you are sure you have configured all required params
+func (s *AffinityGroupService) NewUpdateVMAffinityGroupParams(id string) *UpdateVMAffinityGroupParams {
+	p := &UpdateVMAffinityGroupParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Updates the affinity/anti-affinity group associations of a virtual machine. The VM has to be stopped and restarted for the new properties to take effect.
+func (s *AffinityGroupService) UpdateVMAffinityGroup(p *UpdateVMAffinityGroupParams) (*UpdateVMAffinityGroupResponse, error) {
+	resp, err := s.cs.newRequest("updateVMAffinityGroup", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r UpdateVMAffinityGroupResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type UpdateVMAffinityGroupResponse struct {
+	JobID         string `json:"jobid"`
+	Account       string `json:"account"`
+	Affinitygroup []struct {
+		Account           string   `json:"account"`
+		Description       string   `json:"description"`
+		Domain            string   `json:"domain"`
+		Domainid          string   `json:"domainid"`
+		Id                string   `json:"id"`
+		Name              string   `json:"name"`
+		Project           string   `json:"project"`
+		Projectid         string   `json:"projectid"`
+		Type              string   `json:"type"`
+		VirtualmachineIds []string `json:"virtualmachineIds"`
+	} `json:"affinitygroup"`
+	Cpunumber             int               `json:"cpunumber"`
+	Cpuspeed              int               `json:"cpuspeed"`
+	Cpuused               string            `json:"cpuused"`
+	Created               string            `json:"created"`
+	Details               map[string]string `json:"details"`
+	Diskioread            int64             `json:"diskioread"`
+	Diskiowrite           int64             `json:"diskiowrite"`
+	Diskkbsread           int64             `json:"diskkbsread"`
+	Diskkbswrite          int64             `json:"diskkbswrite"`
+	Diskofferingid        string            `json:"diskofferingid"`
+	Diskofferingname      string            `json:"diskofferingname"`
+	Displayname           string            `json:"displayname"`
+	Displayvm             bool              `json:"displayvm"`
+	Domain                string            `json:"domain"`
+	Domainid              string            `json:"domainid"`
+	Forvirtualnetwork     bool              `json:"forvirtualnetwork"`
+	Group                 string            `json:"group"`
+	Groupid               string            `json:"groupid"`
+	Guestosid             string            `json:"guestosid"`
+	Haenable              bool              `json:"haenable"`
+	Hostid                string            `json:"hostid"`
+	Hostname              string            `json:"hostname"`
+	Hypervisor            string            `json:"hypervisor"`
+	Id                    string            `json:"id"`
+	Instancename          string            `json:"instancename"`
+	Isdynamicallyscalable bool              `json:"isdynamicallyscalable"`
+	Isodisplaytext        string            `json:"isodisplaytext"`
+	Isoid                 string            `json:"isoid"`
+	Isoname               string            `json:"isoname"`
+	Keypair               string            `json:"keypair"`
+	Memory                int               `json:"memory"`
+	Memoryintfreekbs      int64             `json:"memoryintfreekbs"`
+	Memorykbs             int64             `json:"memorykbs"`
+	Memorytargetkbs       int64             `json:"memorytargetkbs"`
+	Name                  string            `json:"name"`
+	Networkkbsread        int64             `json:"networkkbsread"`
+	Networkkbswrite       int64             `json:"networkkbswrite"`
+	Nic                   []struct {
+		Broadcasturi         string `json:"broadcasturi"`
+		Deviceid             string `json:"deviceid"`
+		Gateway              string `json:"gateway"`
+		Id                   string `json:"id"`
+		Ip6address           string `json:"ip6address"`
+		Ip6cidr              string `json:"ip6cidr"`
+		Ip6gateway           string `json:"ip6gateway"`
+		Ipaddress            string `json:"ipaddress"`
+		Isdefault            bool   `json:"isdefault"`
+		Isolationuri         string `json:"isolationuri"`
+		Macaddress           string `json:"macaddress"`
+		Netmask              string `json:"netmask"`
+		Networkid            string `json:"networkid"`
+		Networkname          string `json:"networkname"`
+		Nsxlogicalswitch     string `json:"nsxlogicalswitch"`
+		Nsxlogicalswitchport string `json:"nsxlogicalswitchport"`
+		Secondaryip          []struct {
+			Id        string `json:"id"`
+			Ipaddress string `json:"ipaddress"`
+		} `json:"secondaryip"`
+		Traffictype      string `json:"traffictype"`
+		Type             string `json:"type"`
+		Virtualmachineid string `json:"virtualmachineid"`
+	} `json:"nic"`
+	Ostypeid        int64  `json:"ostypeid"`
+	Password        string `json:"password"`
+	Passwordenabled bool   `json:"passwordenabled"`
+	Project         string `json:"project"`
+	Projectid       string `json:"projectid"`
+	Publicip        string `json:"publicip"`
+	Publicipid      string `json:"publicipid"`
+	Rootdeviceid    int64  `json:"rootdeviceid"`
+	Rootdevicetype  string `json:"rootdevicetype"`
+	Securitygroup   []struct {
+		Account     string `json:"account"`
+		Description string `json:"description"`
+		Domain      string `json:"domain"`
+		Domainid    string `json:"domainid"`
+		Egressrule  []struct {
+			Account           string `json:"account"`
+			Cidr              string `json:"cidr"`
+			Endport           int    `json:"endport"`
+			Icmpcode          int    `json:"icmpcode"`
+			Icmptype          int    `json:"icmptype"`
+			Protocol          string `json:"protocol"`
+			Ruleid            string `json:"ruleid"`
+			Securitygroupname string `json:"securitygroupname"`
+			Startport         int    `json:"startport"`
+			Tags              []struct {
+				Account      string `json:"account"`
+				Customer     string `json:"customer"`
+				Domain       string `json:"domain"`
+				Domainid     string `json:"domainid"`
+				Key          string `json:"key"`
+				Project      string `json:"project"`
+				Projectid    string `json:"projectid"`
+				Resourceid   string `json:"resourceid"`
+				Resourcetype string `json:"resourcetype"`
+				Value        string `json:"value"`
+			} `json:"tags"`
+		} `json:"egressrule"`
+		Id          string `json:"id"`
+		Ingressrule []struct {
+			Account           string `json:"account"`
+			Cidr              string `json:"cidr"`
+			Endport           int    `json:"endport"`
+			Icmpcode          int    `json:"icmpcode"`
+			Icmptype          int    `json:"icmptype"`
+			Protocol          string `json:"protocol"`
+			Ruleid            string `json:"ruleid"`
+			Securitygroupname string `json:"securitygroupname"`
+			Startport         int    `json:"startport"`
+			Tags              []struct {
+				Account      string `json:"account"`
+				Customer     string `json:"customer"`
+				Domain       string `json:"domain"`
+				Domainid     string `json:"domainid"`
+				Key          string `json:"key"`
+				Project      string `json:"project"`
+				Projectid    string `json:"projectid"`
+				Resourceid   string `json:"resourceid"`
+				Resourcetype string `json:"resourcetype"`
+				Value        string `json:"value"`
+			} `json:"tags"`
+		} `json:"ingressrule"`
+		Name      string `json:"name"`
+		Project   string `json:"project"`
+		Projectid string `json:"projectid"`
+		Tags      []struct {
+			Account      string `json:"account"`
+			Customer     string `json:"customer"`
+			Domain       string `json:"domain"`
+			Domainid     string `json:"domainid"`
+			Key          string `json:"key"`
+			Project      string `json:"project"`
+			Projectid    string `json:"projectid"`
+			Resourceid   string `json:"resourceid"`
+			Resourcetype string `json:"resourcetype"`
+			Value        string `json:"value"`
+		} `json:"tags"`
+		Virtualmachinecount int           `json:"virtualmachinecount"`
+		Virtualmachineids   []interface{} `json:"virtualmachineids"`
+	} `json:"securitygroup"`
+	Serviceofferingid   string `json:"serviceofferingid"`
+	Serviceofferingname string `json:"serviceofferingname"`
+	Servicestate        string `json:"servicestate"`
+	State               string `json:"state"`
+	Templatedisplaytext string `json:"templatedisplaytext"`
+	Templateid          string `json:"templateid"`
+	Templatename        string `json:"templatename"`
+	Userid              string `json:"userid"`
+	Username            string `json:"username"`
+	Vgpu                string `json:"vgpu"`
+	Zoneid              string `json:"zoneid"`
+	Zonename            string `json:"zonename"`
+}
diff --git a/vendor/github.com/xanzy/go-cloudstack/cloudstack/AlertService.go b/vendor/github.com/xanzy/go-cloudstack/cloudstack/AlertService.go
new file mode 100644
index 0000000..b2b615d
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/cloudstack/AlertService.go
@@ -0,0 +1,509 @@
+//
+// Copyright 2018, Sander van Harmelen
+//
+// Licensed 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 cloudstack
+
+import (
+	"encoding/json"
+	"fmt"
+	"net/url"
+	"strconv"
+	"strings"
+)
+
+type ArchiveAlertsParams struct {
+	p map[string]interface{}
+}
+
+func (p *ArchiveAlertsParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["enddate"]; found {
+		u.Set("enddate", v.(string))
+	}
+	if v, found := p.p["ids"]; found {
+		vv := strings.Join(v.([]string), ",")
+		u.Set("ids", vv)
+	}
+	if v, found := p.p["startdate"]; found {
+		u.Set("startdate", v.(string))
+	}
+	if v, found := p.p["type"]; found {
+		u.Set("type", v.(string))
+	}
+	return u
+}
+
+func (p *ArchiveAlertsParams) SetEnddate(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["enddate"] = v
+	return
+}
+
+func (p *ArchiveAlertsParams) SetIds(v []string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["ids"] = v
+	return
+}
+
+func (p *ArchiveAlertsParams) SetStartdate(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["startdate"] = v
+	return
+}
+
+func (p *ArchiveAlertsParams) SetType(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["type"] = v
+	return
+}
+
+// You should always use this function to get a new ArchiveAlertsParams instance,
+// as then you are sure you have configured all required params
+func (s *AlertService) NewArchiveAlertsParams() *ArchiveAlertsParams {
+	p := &ArchiveAlertsParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// Archive one or more alerts.
+func (s *AlertService) ArchiveAlerts(p *ArchiveAlertsParams) (*ArchiveAlertsResponse, error) {
+	resp, err := s.cs.newRequest("archiveAlerts", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ArchiveAlertsResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ArchiveAlertsResponse struct {
+	Displaytext string `json:"displaytext"`
+	Success     string `json:"success"`
+}
+
+type DeleteAlertsParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeleteAlertsParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["enddate"]; found {
+		u.Set("enddate", v.(string))
+	}
+	if v, found := p.p["ids"]; found {
+		vv := strings.Join(v.([]string), ",")
+		u.Set("ids", vv)
+	}
+	if v, found := p.p["startdate"]; found {
+		u.Set("startdate", v.(string))
+	}
+	if v, found := p.p["type"]; found {
+		u.Set("type", v.(string))
+	}
+	return u
+}
+
+func (p *DeleteAlertsParams) SetEnddate(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["enddate"] = v
+	return
+}
+
+func (p *DeleteAlertsParams) SetIds(v []string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["ids"] = v
+	return
+}
+
+func (p *DeleteAlertsParams) SetStartdate(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["startdate"] = v
+	return
+}
+
+func (p *DeleteAlertsParams) SetType(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["type"] = v
+	return
+}
+
+// You should always use this function to get a new DeleteAlertsParams instance,
+// as then you are sure you have configured all required params
+func (s *AlertService) NewDeleteAlertsParams() *DeleteAlertsParams {
+	p := &DeleteAlertsParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// Delete one or more alerts.
+func (s *AlertService) DeleteAlerts(p *DeleteAlertsParams) (*DeleteAlertsResponse, error) {
+	resp, err := s.cs.newRequest("deleteAlerts", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeleteAlertsResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type DeleteAlertsResponse struct {
+	Displaytext string `json:"displaytext"`
+	Success     string `json:"success"`
+}
+
+type GenerateAlertParams struct {
+	p map[string]interface{}
+}
+
+func (p *GenerateAlertParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["description"]; found {
+		u.Set("description", v.(string))
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["podid"]; found {
+		u.Set("podid", v.(string))
+	}
+	if v, found := p.p["type"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("type", vv)
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *GenerateAlertParams) SetDescription(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["description"] = v
+	return
+}
+
+func (p *GenerateAlertParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *GenerateAlertParams) SetPodid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["podid"] = v
+	return
+}
+
+func (p *GenerateAlertParams) SetType(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["type"] = v
+	return
+}
+
+func (p *GenerateAlertParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new GenerateAlertParams instance,
+// as then you are sure you have configured all required params
+func (s *AlertService) NewGenerateAlertParams(description string, name string, alertType int) *GenerateAlertParams {
+	p := &GenerateAlertParams{}
+	p.p = make(map[string]interface{})
+	p.p["description"] = description
+	p.p["name"] = name
+	p.p["type"] = alertType
+	return p
+}
+
+// Generates an alert
+func (s *AlertService) GenerateAlert(p *GenerateAlertParams) (*GenerateAlertResponse, error) {
+	resp, err := s.cs.newRequest("generateAlert", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r GenerateAlertResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type GenerateAlertResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
+
+type ListAlertsParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListAlertsParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["type"]; found {
+		u.Set("type", v.(string))
+	}
+	return u
+}
+
+func (p *ListAlertsParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ListAlertsParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListAlertsParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *ListAlertsParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListAlertsParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListAlertsParams) SetType(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["type"] = v
+	return
+}
+
+// You should always use this function to get a new ListAlertsParams instance,
+// as then you are sure you have configured all required params
+func (s *AlertService) NewListAlertsParams() *ListAlertsParams {
+	p := &ListAlertsParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *AlertService) GetAlertID(name string, opts ...OptionFunc) (string, int, error) {
+	p := &ListAlertsParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["name"] = name
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return "", -1, err
+		}
+	}
+
+	l, err := s.ListAlerts(p)
+	if err != nil {
+		return "", -1, err
+	}
+
+	if l.Count == 0 {
+		return "", l.Count, fmt.Errorf("No match found for %s: %+v", name, l)
+	}
+
+	if l.Count == 1 {
+		return l.Alerts[0].Id, l.Count, nil
+	}
+
+	if l.Count > 1 {
+		for _, v := range l.Alerts {
+			if v.Name == name {
+				return v.Id, l.Count, nil
+			}
+		}
+	}
+	return "", l.Count, fmt.Errorf("Could not find an exact match for %s: %+v", name, l)
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *AlertService) GetAlertByName(name string, opts ...OptionFunc) (*Alert, int, error) {
+	id, count, err := s.GetAlertID(name, opts...)
+	if err != nil {
+		return nil, count, err
+	}
+
+	r, count, err := s.GetAlertByID(id, opts...)
+	if err != nil {
+		return nil, count, err
+	}
+	return r, count, nil
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *AlertService) GetAlertByID(id string, opts ...OptionFunc) (*Alert, int, error) {
+	p := &ListAlertsParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["id"] = id
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return nil, -1, err
+		}
+	}
+
+	l, err := s.ListAlerts(p)
+	if err != nil {
+		if strings.Contains(err.Error(), fmt.Sprintf(
+			"Invalid parameter id value=%s due to incorrect long value format, "+
+				"or entity does not exist", id)) {
+			return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
+		}
+		return nil, -1, err
+	}
+
+	if l.Count == 0 {
+		return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
+	}
+
+	if l.Count == 1 {
+		return l.Alerts[0], l.Count, nil
+	}
+	return nil, l.Count, fmt.Errorf("There is more then one result for Alert UUID: %s!", id)
+}
+
+// Lists all alerts.
+func (s *AlertService) ListAlerts(p *ListAlertsParams) (*ListAlertsResponse, error) {
+	resp, err := s.cs.newRequest("listAlerts", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListAlertsResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListAlertsResponse struct {
+	Count  int      `json:"count"`
+	Alerts []*Alert `json:"alert"`
+}
+
+type Alert struct {
+	Description string `json:"description"`
+	Id          string `json:"id"`
+	Name        string `json:"name"`
+	Sent        string `json:"sent"`
+	Type        int    `json:"type"`
+}
diff --git a/vendor/github.com/xanzy/go-cloudstack/cloudstack/AsyncjobService.go b/vendor/github.com/xanzy/go-cloudstack/cloudstack/AsyncjobService.go
new file mode 100644
index 0000000..ea7f740
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/cloudstack/AsyncjobService.go
@@ -0,0 +1,241 @@
+//
+// Copyright 2018, Sander van Harmelen
+//
+// Licensed 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 cloudstack
+
+import (
+	"encoding/json"
+	"net/url"
+	"strconv"
+	"time"
+)
+
+type ListAsyncJobsParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListAsyncJobsParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["isrecursive"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("isrecursive", vv)
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["listall"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("listall", vv)
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["startdate"]; found {
+		u.Set("startdate", v.(string))
+	}
+	return u
+}
+
+func (p *ListAsyncJobsParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *ListAsyncJobsParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *ListAsyncJobsParams) SetIsrecursive(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isrecursive"] = v
+	return
+}
+
+func (p *ListAsyncJobsParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListAsyncJobsParams) SetListall(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["listall"] = v
+	return
+}
+
+func (p *ListAsyncJobsParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListAsyncJobsParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListAsyncJobsParams) SetStartdate(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["startdate"] = v
+	return
+}
+
+// You should always use this function to get a new ListAsyncJobsParams instance,
+// as then you are sure you have configured all required params
+func (s *AsyncjobService) NewListAsyncJobsParams() *ListAsyncJobsParams {
+	p := &ListAsyncJobsParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// Lists all pending asynchronous jobs for the account.
+func (s *AsyncjobService) ListAsyncJobs(p *ListAsyncJobsParams) (*ListAsyncJobsResponse, error) {
+	resp, err := s.cs.newRequest("listAsyncJobs", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListAsyncJobsResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListAsyncJobsResponse struct {
+	Count     int         `json:"count"`
+	AsyncJobs []*AsyncJob `json:"asyncjobs"`
+}
+
+type AsyncJob struct {
+	Accountid       string          `json:"accountid"`
+	Cmd             string          `json:"cmd"`
+	Created         string          `json:"created"`
+	Jobinstanceid   string          `json:"jobinstanceid"`
+	Jobinstancetype string          `json:"jobinstancetype"`
+	Jobprocstatus   int             `json:"jobprocstatus"`
+	Jobresult       json.RawMessage `json:"jobresult"`
+	Jobresultcode   int             `json:"jobresultcode"`
+	Jobresulttype   string          `json:"jobresulttype"`
+	Jobstatus       int             `json:"jobstatus"`
+	Userid          string          `json:"userid"`
+}
+
+type QueryAsyncJobResultParams struct {
+	p map[string]interface{}
+}
+
+func (p *QueryAsyncJobResultParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["jobid"]; found {
+		u.Set("jobid", v.(string))
+	}
+	return u
+}
+
+func (p *QueryAsyncJobResultParams) SetJobid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["jobid"] = v
+	return
+}
+
+// You should always use this function to get a new QueryAsyncJobResultParams instance,
+// as then you are sure you have configured all required params
+func (s *AsyncjobService) NewQueryAsyncJobResultParams(jobid string) *QueryAsyncJobResultParams {
+	p := &QueryAsyncJobResultParams{}
+	p.p = make(map[string]interface{})
+	p.p["jobid"] = jobid
+	return p
+}
+
+// Retrieves the current status of asynchronous job.
+func (s *AsyncjobService) QueryAsyncJobResult(p *QueryAsyncJobResultParams) (*QueryAsyncJobResultResponse, error) {
+	var resp json.RawMessage
+	var err error
+
+	// We should be able to retry on failure as this call is idempotent
+	for i := 0; i < 3; i++ {
+		resp, err = s.cs.newRequest("queryAsyncJobResult", p.toURLValues())
+		if err == nil {
+			break
+		}
+		time.Sleep(500 * time.Millisecond)
+	}
+	if err != nil {
+		return nil, err
+	}
+
+	var r QueryAsyncJobResultResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type QueryAsyncJobResultResponse struct {
+	Accountid       string          `json:"accountid"`
+	Cmd             string          `json:"cmd"`
+	Created         string          `json:"created"`
+	Jobinstanceid   string          `json:"jobinstanceid"`
+	Jobinstancetype string          `json:"jobinstancetype"`
+	Jobprocstatus   int             `json:"jobprocstatus"`
+	Jobresult       json.RawMessage `json:"jobresult"`
+	Jobresultcode   int             `json:"jobresultcode"`
+	Jobresulttype   string          `json:"jobresulttype"`
+	Jobstatus       int             `json:"jobstatus"`
+	Userid          string          `json:"userid"`
+}
diff --git a/vendor/github.com/xanzy/go-cloudstack/cloudstack/AuthenticationService.go b/vendor/github.com/xanzy/go-cloudstack/cloudstack/AuthenticationService.go
new file mode 100644
index 0000000..eb505ed
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/cloudstack/AuthenticationService.go
@@ -0,0 +1,158 @@
+//
+// Copyright 2018, Sander van Harmelen
+//
+// Licensed 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 cloudstack
+
+import (
+	"encoding/json"
+	"net/url"
+	"strconv"
+)
+
+type LoginParams struct {
+	p map[string]interface{}
+}
+
+func (p *LoginParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["domain"]; found {
+		u.Set("domain", v.(string))
+	}
+	if v, found := p.p["domainId"]; found {
+		vv := strconv.FormatInt(v.(int64), 10)
+		u.Set("domainId", vv)
+	}
+	if v, found := p.p["password"]; found {
+		u.Set("password", v.(string))
+	}
+	if v, found := p.p["username"]; found {
+		u.Set("username", v.(string))
+	}
+	return u
+}
+
+func (p *LoginParams) SetDomain(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domain"] = v
+	return
+}
+
+func (p *LoginParams) SetDomainId(v int64) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainId"] = v
+	return
+}
+
+func (p *LoginParams) SetPassword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["password"] = v
+	return
+}
+
+func (p *LoginParams) SetUsername(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["username"] = v
+	return
+}
+
+// You should always use this function to get a new LoginParams instance,
+// as then you are sure you have configured all required params
+func (s *AuthenticationService) NewLoginParams(password string, username string) *LoginParams {
+	p := &LoginParams{}
+	p.p = make(map[string]interface{})
+	p.p["password"] = password
+	p.p["username"] = username
+	return p
+}
+
+// Logs a user into the CloudStack. A successful login attempt will generate a JSESSIONID cookie value that can be passed in subsequent Query command calls until the "logout" command has been issued or the session has expired.
+func (s *AuthenticationService) Login(p *LoginParams) (*LoginResponse, error) {
+	resp, err := s.cs.newRequest("login", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r LoginResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type LoginResponse struct {
+	Account    string `json:"account"`
+	Domainid   string `json:"domainid"`
+	Firstname  string `json:"firstname"`
+	Lastname   string `json:"lastname"`
+	Registered string `json:"registered"`
+	Sessionkey string `json:"sessionkey"`
+	Timeout    int    `json:"timeout"`
+	Timezone   string `json:"timezone"`
+	Type       string `json:"type"`
+	Userid     string `json:"userid"`
+	Username   string `json:"username"`
+}
+
+type LogoutParams struct {
+	p map[string]interface{}
+}
+
+func (p *LogoutParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	return u
+}
+
+// You should always use this function to get a new LogoutParams instance,
+// as then you are sure you have configured all required params
+func (s *AuthenticationService) NewLogoutParams() *LogoutParams {
+	p := &LogoutParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// Logs out the user
+func (s *AuthenticationService) Logout(p *LogoutParams) (*LogoutResponse, error) {
+	resp, err := s.cs.newRequest("logout", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r LogoutResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type LogoutResponse struct {
+	Description string `json:"description"`
+}
diff --git a/vendor/github.com/xanzy/go-cloudstack/cloudstack/AutoScaleService.go b/vendor/github.com/xanzy/go-cloudstack/cloudstack/AutoScaleService.go
new file mode 100644
index 0000000..fd18f87
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/cloudstack/AutoScaleService.go
@@ -0,0 +1,2779 @@
+//
+// Copyright 2018, Sander van Harmelen
+//
+// Licensed 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 cloudstack
+
+import (
+	"encoding/json"
+	"fmt"
+	"net/url"
+	"strconv"
+	"strings"
+)
+
+type CreateAutoScalePolicyParams struct {
+	p map[string]interface{}
+}
+
+func (p *CreateAutoScalePolicyParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["action"]; found {
+		u.Set("action", v.(string))
+	}
+	if v, found := p.p["conditionids"]; found {
+		vv := strings.Join(v.([]string), ",")
+		u.Set("conditionids", vv)
+	}
+	if v, found := p.p["duration"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("duration", vv)
+	}
+	if v, found := p.p["quiettime"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("quiettime", vv)
+	}
+	return u
+}
+
+func (p *CreateAutoScalePolicyParams) SetAction(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["action"] = v
+	return
+}
+
+func (p *CreateAutoScalePolicyParams) SetConditionids(v []string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["conditionids"] = v
+	return
+}
+
+func (p *CreateAutoScalePolicyParams) SetDuration(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["duration"] = v
+	return
+}
+
+func (p *CreateAutoScalePolicyParams) SetQuiettime(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["quiettime"] = v
+	return
+}
+
+// You should always use this function to get a new CreateAutoScalePolicyParams instance,
+// as then you are sure you have configured all required params
+func (s *AutoScaleService) NewCreateAutoScalePolicyParams(action string, conditionids []string, duration int) *CreateAutoScalePolicyParams {
+	p := &CreateAutoScalePolicyParams{}
+	p.p = make(map[string]interface{})
+	p.p["action"] = action
+	p.p["conditionids"] = conditionids
+	p.p["duration"] = duration
+	return p
+}
+
+// Creates an autoscale policy for a provision or deprovision action, the action is taken when the all the conditions evaluates to true for the specified duration. The policy is in effect once it is attached to a autscale vm group.
+func (s *AutoScaleService) CreateAutoScalePolicy(p *CreateAutoScalePolicyParams) (*CreateAutoScalePolicyResponse, error) {
+	resp, err := s.cs.newRequest("createAutoScalePolicy", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r CreateAutoScalePolicyResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type CreateAutoScalePolicyResponse struct {
+	JobID      string   `json:"jobid"`
+	Account    string   `json:"account"`
+	Action     string   `json:"action"`
+	Conditions []string `json:"conditions"`
+	Domain     string   `json:"domain"`
+	Domainid   string   `json:"domainid"`
+	Duration   int      `json:"duration"`
+	Id         string   `json:"id"`
+	Project    string   `json:"project"`
+	Projectid  string   `json:"projectid"`
+	Quiettime  int      `json:"quiettime"`
+}
+
+type CreateAutoScaleVmGroupParams struct {
+	p map[string]interface{}
+}
+
+func (p *CreateAutoScaleVmGroupParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["fordisplay"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("fordisplay", vv)
+	}
+	if v, found := p.p["interval"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("interval", vv)
+	}
+	if v, found := p.p["lbruleid"]; found {
+		u.Set("lbruleid", v.(string))
+	}
+	if v, found := p.p["maxmembers"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("maxmembers", vv)
+	}
+	if v, found := p.p["minmembers"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("minmembers", vv)
+	}
+	if v, found := p.p["scaledownpolicyids"]; found {
+		vv := strings.Join(v.([]string), ",")
+		u.Set("scaledownpolicyids", vv)
+	}
+	if v, found := p.p["scaleuppolicyids"]; found {
+		vv := strings.Join(v.([]string), ",")
+		u.Set("scaleuppolicyids", vv)
+	}
+	if v, found := p.p["vmprofileid"]; found {
+		u.Set("vmprofileid", v.(string))
+	}
+	return u
+}
+
+func (p *CreateAutoScaleVmGroupParams) SetFordisplay(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["fordisplay"] = v
+	return
+}
+
+func (p *CreateAutoScaleVmGroupParams) SetInterval(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["interval"] = v
+	return
+}
+
+func (p *CreateAutoScaleVmGroupParams) SetLbruleid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["lbruleid"] = v
+	return
+}
+
+func (p *CreateAutoScaleVmGroupParams) SetMaxmembers(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["maxmembers"] = v
+	return
+}
+
+func (p *CreateAutoScaleVmGroupParams) SetMinmembers(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["minmembers"] = v
+	return
+}
+
+func (p *CreateAutoScaleVmGroupParams) SetScaledownpolicyids(v []string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["scaledownpolicyids"] = v
+	return
+}
+
+func (p *CreateAutoScaleVmGroupParams) SetScaleuppolicyids(v []string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["scaleuppolicyids"] = v
+	return
+}
+
+func (p *CreateAutoScaleVmGroupParams) SetVmprofileid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["vmprofileid"] = v
+	return
+}
+
+// You should always use this function to get a new CreateAutoScaleVmGroupParams instance,
+// as then you are sure you have configured all required params
+func (s *AutoScaleService) NewCreateAutoScaleVmGroupParams(lbruleid string, maxmembers int, minmembers int, scaledownpolicyids []string, scaleuppolicyids []string, vmprofileid string) *CreateAutoScaleVmGroupParams {
+	p := &CreateAutoScaleVmGroupParams{}
+	p.p = make(map[string]interface{})
+	p.p["lbruleid"] = lbruleid
+	p.p["maxmembers"] = maxmembers
+	p.p["minmembers"] = minmembers
+	p.p["scaledownpolicyids"] = scaledownpolicyids
+	p.p["scaleuppolicyids"] = scaleuppolicyids
+	p.p["vmprofileid"] = vmprofileid
+	return p
+}
+
+// Creates and automatically starts a virtual machine based on a service offering, disk offering, and template.
+func (s *AutoScaleService) CreateAutoScaleVmGroup(p *CreateAutoScaleVmGroupParams) (*CreateAutoScaleVmGroupResponse, error) {
+	resp, err := s.cs.newRequest("createAutoScaleVmGroup", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r CreateAutoScaleVmGroupResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type CreateAutoScaleVmGroupResponse struct {
+	JobID             string   `json:"jobid"`
+	Account           string   `json:"account"`
+	Domain            string   `json:"domain"`
+	Domainid          string   `json:"domainid"`
+	Fordisplay        bool     `json:"fordisplay"`
+	Id                string   `json:"id"`
+	Interval          int      `json:"interval"`
+	Lbruleid          string   `json:"lbruleid"`
+	Maxmembers        int      `json:"maxmembers"`
+	Minmembers        int      `json:"minmembers"`
+	Project           string   `json:"project"`
+	Projectid         string   `json:"projectid"`
+	Scaledownpolicies []string `json:"scaledownpolicies"`
+	Scaleuppolicies   []string `json:"scaleuppolicies"`
+	State             string   `json:"state"`
+	Vmprofileid       string   `json:"vmprofileid"`
+}
+
+type CreateAutoScaleVmProfileParams struct {
+	p map[string]interface{}
+}
+
+func (p *CreateAutoScaleVmProfileParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["autoscaleuserid"]; found {
+		u.Set("autoscaleuserid", v.(string))
+	}
+	if v, found := p.p["counterparam"]; found {
+		i := 0
+		for k, vv := range v.(map[string]string) {
+			u.Set(fmt.Sprintf("counterparam[%d].key", i), k)
+			u.Set(fmt.Sprintf("counterparam[%d].value", i), vv)
+			i++
+		}
+	}
+	if v, found := p.p["destroyvmgraceperiod"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("destroyvmgraceperiod", vv)
+	}
+	if v, found := p.p["fordisplay"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("fordisplay", vv)
+	}
+	if v, found := p.p["otherdeployparams"]; found {
+		u.Set("otherdeployparams", v.(string))
+	}
+	if v, found := p.p["serviceofferingid"]; found {
+		u.Set("serviceofferingid", v.(string))
+	}
+	if v, found := p.p["templateid"]; found {
+		u.Set("templateid", v.(string))
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *CreateAutoScaleVmProfileParams) SetAutoscaleuserid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["autoscaleuserid"] = v
+	return
+}
+
+func (p *CreateAutoScaleVmProfileParams) SetCounterparam(v map[string]string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["counterparam"] = v
+	return
+}
+
+func (p *CreateAutoScaleVmProfileParams) SetDestroyvmgraceperiod(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["destroyvmgraceperiod"] = v
+	return
+}
+
+func (p *CreateAutoScaleVmProfileParams) SetFordisplay(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["fordisplay"] = v
+	return
+}
+
+func (p *CreateAutoScaleVmProfileParams) SetOtherdeployparams(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["otherdeployparams"] = v
+	return
+}
+
+func (p *CreateAutoScaleVmProfileParams) SetServiceofferingid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["serviceofferingid"] = v
+	return
+}
+
+func (p *CreateAutoScaleVmProfileParams) SetTemplateid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["templateid"] = v
+	return
+}
+
+func (p *CreateAutoScaleVmProfileParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new CreateAutoScaleVmProfileParams instance,
+// as then you are sure you have configured all required params
+func (s *AutoScaleService) NewCreateAutoScaleVmProfileParams(serviceofferingid string, templateid string, zoneid string) *CreateAutoScaleVmProfileParams {
+	p := &CreateAutoScaleVmProfileParams{}
+	p.p = make(map[string]interface{})
+	p.p["serviceofferingid"] = serviceofferingid
+	p.p["templateid"] = templateid
+	p.p["zoneid"] = zoneid
+	return p
+}
+
+// Creates a profile that contains information about the virtual machine which will be provisioned automatically by autoscale feature.
+func (s *AutoScaleService) CreateAutoScaleVmProfile(p *CreateAutoScaleVmProfileParams) (*CreateAutoScaleVmProfileResponse, error) {
+	resp, err := s.cs.newRequest("createAutoScaleVmProfile", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r CreateAutoScaleVmProfileResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type CreateAutoScaleVmProfileResponse struct {
+	JobID                string `json:"jobid"`
+	Account              string `json:"account"`
+	Autoscaleuserid      string `json:"autoscaleuserid"`
+	Destroyvmgraceperiod int    `json:"destroyvmgraceperiod"`
+	Domain               string `json:"domain"`
+	Domainid             string `json:"domainid"`
+	Fordisplay           bool   `json:"fordisplay"`
+	Id                   string `json:"id"`
+	Otherdeployparams    string `json:"otherdeployparams"`
+	Project              string `json:"project"`
+	Projectid            string `json:"projectid"`
+	Serviceofferingid    string `json:"serviceofferingid"`
+	Templateid           string `json:"templateid"`
+	Zoneid               string `json:"zoneid"`
+}
+
+type CreateConditionParams struct {
+	p map[string]interface{}
+}
+
+func (p *CreateConditionParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["counterid"]; found {
+		u.Set("counterid", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["relationaloperator"]; found {
+		u.Set("relationaloperator", v.(string))
+	}
+	if v, found := p.p["threshold"]; found {
+		vv := strconv.FormatInt(v.(int64), 10)
+		u.Set("threshold", vv)
+	}
+	return u
+}
+
+func (p *CreateConditionParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *CreateConditionParams) SetCounterid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["counterid"] = v
+	return
+}
+
+func (p *CreateConditionParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *CreateConditionParams) SetRelationaloperator(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["relationaloperator"] = v
+	return
+}
+
+func (p *CreateConditionParams) SetThreshold(v int64) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["threshold"] = v
+	return
+}
+
+// You should always use this function to get a new CreateConditionParams instance,
+// as then you are sure you have configured all required params
+func (s *AutoScaleService) NewCreateConditionParams(counterid string, relationaloperator string, threshold int64) *CreateConditionParams {
+	p := &CreateConditionParams{}
+	p.p = make(map[string]interface{})
+	p.p["counterid"] = counterid
+	p.p["relationaloperator"] = relationaloperator
+	p.p["threshold"] = threshold
+	return p
+}
+
+// Creates a condition
+func (s *AutoScaleService) CreateCondition(p *CreateConditionParams) (*CreateConditionResponse, error) {
+	resp, err := s.cs.newRequest("createCondition", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r CreateConditionResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type CreateConditionResponse struct {
+	JobID              string   `json:"jobid"`
+	Account            string   `json:"account"`
+	Counter            []string `json:"counter"`
+	Domain             string   `json:"domain"`
+	Domainid           string   `json:"domainid"`
+	Id                 string   `json:"id"`
+	Project            string   `json:"project"`
+	Projectid          string   `json:"projectid"`
+	Relationaloperator string   `json:"relationaloperator"`
+	Threshold          int64    `json:"threshold"`
+	Zoneid             string   `json:"zoneid"`
+}
+
+type CreateCounterParams struct {
+	p map[string]interface{}
+}
+
+func (p *CreateCounterParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["source"]; found {
+		u.Set("source", v.(string))
+	}
+	if v, found := p.p["value"]; found {
+		u.Set("value", v.(string))
+	}
+	return u
+}
+
+func (p *CreateCounterParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *CreateCounterParams) SetSource(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["source"] = v
+	return
+}
+
+func (p *CreateCounterParams) SetValue(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["value"] = v
+	return
+}
+
+// You should always use this function to get a new CreateCounterParams instance,
+// as then you are sure you have configured all required params
+func (s *AutoScaleService) NewCreateCounterParams(name string, source string, value string) *CreateCounterParams {
+	p := &CreateCounterParams{}
+	p.p = make(map[string]interface{})
+	p.p["name"] = name
+	p.p["source"] = source
+	p.p["value"] = value
+	return p
+}
+
+// Adds metric counter
+func (s *AutoScaleService) CreateCounter(p *CreateCounterParams) (*CreateCounterResponse, error) {
+	resp, err := s.cs.newRequest("createCounter", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r CreateCounterResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type CreateCounterResponse struct {
+	JobID  string `json:"jobid"`
+	Id     string `json:"id"`
+	Name   string `json:"name"`
+	Source string `json:"source"`
+	Value  string `json:"value"`
+	Zoneid string `json:"zoneid"`
+}
+
+type DeleteAutoScalePolicyParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeleteAutoScalePolicyParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *DeleteAutoScalePolicyParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new DeleteAutoScalePolicyParams instance,
+// as then you are sure you have configured all required params
+func (s *AutoScaleService) NewDeleteAutoScalePolicyParams(id string) *DeleteAutoScalePolicyParams {
+	p := &DeleteAutoScalePolicyParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Deletes a autoscale policy.
+func (s *AutoScaleService) DeleteAutoScalePolicy(p *DeleteAutoScalePolicyParams) (*DeleteAutoScalePolicyResponse, error) {
+	resp, err := s.cs.newRequest("deleteAutoScalePolicy", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeleteAutoScalePolicyResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type DeleteAutoScalePolicyResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
+
+type DeleteAutoScaleVmGroupParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeleteAutoScaleVmGroupParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *DeleteAutoScaleVmGroupParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new DeleteAutoScaleVmGroupParams instance,
+// as then you are sure you have configured all required params
+func (s *AutoScaleService) NewDeleteAutoScaleVmGroupParams(id string) *DeleteAutoScaleVmGroupParams {
+	p := &DeleteAutoScaleVmGroupParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Deletes a autoscale vm group.
+func (s *AutoScaleService) DeleteAutoScaleVmGroup(p *DeleteAutoScaleVmGroupParams) (*DeleteAutoScaleVmGroupResponse, error) {
+	resp, err := s.cs.newRequest("deleteAutoScaleVmGroup", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeleteAutoScaleVmGroupResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type DeleteAutoScaleVmGroupResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
+
+type DeleteAutoScaleVmProfileParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeleteAutoScaleVmProfileParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *DeleteAutoScaleVmProfileParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new DeleteAutoScaleVmProfileParams instance,
+// as then you are sure you have configured all required params
+func (s *AutoScaleService) NewDeleteAutoScaleVmProfileParams(id string) *DeleteAutoScaleVmProfileParams {
+	p := &DeleteAutoScaleVmProfileParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Deletes a autoscale vm profile.
+func (s *AutoScaleService) DeleteAutoScaleVmProfile(p *DeleteAutoScaleVmProfileParams) (*DeleteAutoScaleVmProfileResponse, error) {
+	resp, err := s.cs.newRequest("deleteAutoScaleVmProfile", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeleteAutoScaleVmProfileResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type DeleteAutoScaleVmProfileResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
+
+type DeleteConditionParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeleteConditionParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *DeleteConditionParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new DeleteConditionParams instance,
+// as then you are sure you have configured all required params
+func (s *AutoScaleService) NewDeleteConditionParams(id string) *DeleteConditionParams {
+	p := &DeleteConditionParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Removes a condition
+func (s *AutoScaleService) DeleteCondition(p *DeleteConditionParams) (*DeleteConditionResponse, error) {
+	resp, err := s.cs.newRequest("deleteCondition", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeleteConditionResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type DeleteConditionResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
+
+type DeleteCounterParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeleteCounterParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *DeleteCounterParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new DeleteCounterParams instance,
+// as then you are sure you have configured all required params
+func (s *AutoScaleService) NewDeleteCounterParams(id string) *DeleteCounterParams {
+	p := &DeleteCounterParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Deletes a counter
+func (s *AutoScaleService) DeleteCounter(p *DeleteCounterParams) (*DeleteCounterResponse, error) {
+	resp, err := s.cs.newRequest("deleteCounter", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeleteCounterResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type DeleteCounterResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
+
+type DisableAutoScaleVmGroupParams struct {
+	p map[string]interface{}
+}
+
+func (p *DisableAutoScaleVmGroupParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *DisableAutoScaleVmGroupParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new DisableAutoScaleVmGroupParams instance,
+// as then you are sure you have configured all required params
+func (s *AutoScaleService) NewDisableAutoScaleVmGroupParams(id string) *DisableAutoScaleVmGroupParams {
+	p := &DisableAutoScaleVmGroupParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Disables an AutoScale Vm Group
+func (s *AutoScaleService) DisableAutoScaleVmGroup(p *DisableAutoScaleVmGroupParams) (*DisableAutoScaleVmGroupResponse, error) {
+	resp, err := s.cs.newRequest("disableAutoScaleVmGroup", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DisableAutoScaleVmGroupResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type DisableAutoScaleVmGroupResponse struct {
+	JobID             string   `json:"jobid"`
+	Account           string   `json:"account"`
+	Domain            string   `json:"domain"`
+	Domainid          string   `json:"domainid"`
+	Fordisplay        bool     `json:"fordisplay"`
+	Id                string   `json:"id"`
+	Interval          int      `json:"interval"`
+	Lbruleid          string   `json:"lbruleid"`
+	Maxmembers        int      `json:"maxmembers"`
+	Minmembers        int      `json:"minmembers"`
+	Project           string   `json:"project"`
+	Projectid         string   `json:"projectid"`
+	Scaledownpolicies []string `json:"scaledownpolicies"`
+	Scaleuppolicies   []string `json:"scaleuppolicies"`
+	State             string   `json:"state"`
+	Vmprofileid       string   `json:"vmprofileid"`
+}
+
+type EnableAutoScaleVmGroupParams struct {
+	p map[string]interface{}
+}
+
+func (p *EnableAutoScaleVmGroupParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *EnableAutoScaleVmGroupParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new EnableAutoScaleVmGroupParams instance,
+// as then you are sure you have configured all required params
+func (s *AutoScaleService) NewEnableAutoScaleVmGroupParams(id string) *EnableAutoScaleVmGroupParams {
+	p := &EnableAutoScaleVmGroupParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Enables an AutoScale Vm Group
+func (s *AutoScaleService) EnableAutoScaleVmGroup(p *EnableAutoScaleVmGroupParams) (*EnableAutoScaleVmGroupResponse, error) {
+	resp, err := s.cs.newRequest("enableAutoScaleVmGroup", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r EnableAutoScaleVmGroupResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type EnableAutoScaleVmGroupResponse struct {
+	JobID             string   `json:"jobid"`
+	Account           string   `json:"account"`
+	Domain            string   `json:"domain"`
+	Domainid          string   `json:"domainid"`
+	Fordisplay        bool     `json:"fordisplay"`
+	Id                string   `json:"id"`
+	Interval          int      `json:"interval"`
+	Lbruleid          string   `json:"lbruleid"`
+	Maxmembers        int      `json:"maxmembers"`
+	Minmembers        int      `json:"minmembers"`
+	Project           string   `json:"project"`
+	Projectid         string   `json:"projectid"`
+	Scaledownpolicies []string `json:"scaledownpolicies"`
+	Scaleuppolicies   []string `json:"scaleuppolicies"`
+	State             string   `json:"state"`
+	Vmprofileid       string   `json:"vmprofileid"`
+}
+
+type ListAutoScalePoliciesParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListAutoScalePoliciesParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["action"]; found {
+		u.Set("action", v.(string))
+	}
+	if v, found := p.p["conditionid"]; found {
+		u.Set("conditionid", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["isrecursive"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("isrecursive", vv)
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["listall"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("listall", vv)
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["vmgroupid"]; found {
+		u.Set("vmgroupid", v.(string))
+	}
+	return u
+}
+
+func (p *ListAutoScalePoliciesParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *ListAutoScalePoliciesParams) SetAction(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["action"] = v
+	return
+}
+
+func (p *ListAutoScalePoliciesParams) SetConditionid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["conditionid"] = v
+	return
+}
+
+func (p *ListAutoScalePoliciesParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *ListAutoScalePoliciesParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ListAutoScalePoliciesParams) SetIsrecursive(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isrecursive"] = v
+	return
+}
+
+func (p *ListAutoScalePoliciesParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListAutoScalePoliciesParams) SetListall(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["listall"] = v
+	return
+}
+
+func (p *ListAutoScalePoliciesParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListAutoScalePoliciesParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListAutoScalePoliciesParams) SetVmgroupid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["vmgroupid"] = v
+	return
+}
+
+// You should always use this function to get a new ListAutoScalePoliciesParams instance,
+// as then you are sure you have configured all required params
+func (s *AutoScaleService) NewListAutoScalePoliciesParams() *ListAutoScalePoliciesParams {
+	p := &ListAutoScalePoliciesParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *AutoScaleService) GetAutoScalePolicyByID(id string, opts ...OptionFunc) (*AutoScalePolicy, int, error) {
+	p := &ListAutoScalePoliciesParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["id"] = id
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return nil, -1, err
+		}
+	}
+
+	l, err := s.ListAutoScalePolicies(p)
+	if err != nil {
+		if strings.Contains(err.Error(), fmt.Sprintf(
+			"Invalid parameter id value=%s due to incorrect long value format, "+
+				"or entity does not exist", id)) {
+			return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
+		}
+		return nil, -1, err
+	}
+
+	if l.Count == 0 {
+		return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
+	}
+
+	if l.Count == 1 {
+		return l.AutoScalePolicies[0], l.Count, nil
+	}
+	return nil, l.Count, fmt.Errorf("There is more then one result for AutoScalePolicy UUID: %s!", id)
+}
+
+// Lists autoscale policies.
+func (s *AutoScaleService) ListAutoScalePolicies(p *ListAutoScalePoliciesParams) (*ListAutoScalePoliciesResponse, error) {
+	resp, err := s.cs.newRequest("listAutoScalePolicies", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListAutoScalePoliciesResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListAutoScalePoliciesResponse struct {
+	Count             int                `json:"count"`
+	AutoScalePolicies []*AutoScalePolicy `json:"autoscalepolicy"`
+}
+
+type AutoScalePolicy struct {
+	Account    string   `json:"account"`
+	Action     string   `json:"action"`
+	Conditions []string `json:"conditions"`
+	Domain     string   `json:"domain"`
+	Domainid   string   `json:"domainid"`
+	Duration   int      `json:"duration"`
+	Id         string   `json:"id"`
+	Project    string   `json:"project"`
+	Projectid  string   `json:"projectid"`
+	Quiettime  int      `json:"quiettime"`
+}
+
+type ListAutoScaleVmGroupsParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListAutoScaleVmGroupsParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["fordisplay"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("fordisplay", vv)
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["isrecursive"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("isrecursive", vv)
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["lbruleid"]; found {
+		u.Set("lbruleid", v.(string))
+	}
+	if v, found := p.p["listall"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("listall", vv)
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["policyid"]; found {
+		u.Set("policyid", v.(string))
+	}
+	if v, found := p.p["projectid"]; found {
+		u.Set("projectid", v.(string))
+	}
+	if v, found := p.p["vmprofileid"]; found {
+		u.Set("vmprofileid", v.(string))
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *ListAutoScaleVmGroupsParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *ListAutoScaleVmGroupsParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *ListAutoScaleVmGroupsParams) SetFordisplay(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["fordisplay"] = v
+	return
+}
+
+func (p *ListAutoScaleVmGroupsParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ListAutoScaleVmGroupsParams) SetIsrecursive(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isrecursive"] = v
+	return
+}
+
+func (p *ListAutoScaleVmGroupsParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListAutoScaleVmGroupsParams) SetLbruleid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["lbruleid"] = v
+	return
+}
+
+func (p *ListAutoScaleVmGroupsParams) SetListall(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["listall"] = v
+	return
+}
+
+func (p *ListAutoScaleVmGroupsParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListAutoScaleVmGroupsParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListAutoScaleVmGroupsParams) SetPolicyid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["policyid"] = v
+	return
+}
+
+func (p *ListAutoScaleVmGroupsParams) SetProjectid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectid"] = v
+	return
+}
+
+func (p *ListAutoScaleVmGroupsParams) SetVmprofileid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["vmprofileid"] = v
+	return
+}
+
+func (p *ListAutoScaleVmGroupsParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new ListAutoScaleVmGroupsParams instance,
+// as then you are sure you have configured all required params
+func (s *AutoScaleService) NewListAutoScaleVmGroupsParams() *ListAutoScaleVmGroupsParams {
+	p := &ListAutoScaleVmGroupsParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *AutoScaleService) GetAutoScaleVmGroupByID(id string, opts ...OptionFunc) (*AutoScaleVmGroup, int, error) {
+	p := &ListAutoScaleVmGroupsParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["id"] = id
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return nil, -1, err
+		}
+	}
+
+	l, err := s.ListAutoScaleVmGroups(p)
+	if err != nil {
+		if strings.Contains(err.Error(), fmt.Sprintf(
+			"Invalid parameter id value=%s due to incorrect long value format, "+
+				"or entity does not exist", id)) {
+			return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
+		}
+		return nil, -1, err
+	}
+
+	if l.Count == 0 {
+		return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
+	}
+
+	if l.Count == 1 {
+		return l.AutoScaleVmGroups[0], l.Count, nil
+	}
+	return nil, l.Count, fmt.Errorf("There is more then one result for AutoScaleVmGroup UUID: %s!", id)
+}
+
+// Lists autoscale vm groups.
+func (s *AutoScaleService) ListAutoScaleVmGroups(p *ListAutoScaleVmGroupsParams) (*ListAutoScaleVmGroupsResponse, error) {
+	resp, err := s.cs.newRequest("listAutoScaleVmGroups", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListAutoScaleVmGroupsResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListAutoScaleVmGroupsResponse struct {
+	Count             int                 `json:"count"`
+	AutoScaleVmGroups []*AutoScaleVmGroup `json:"autoscalevmgroup"`
+}
+
+type AutoScaleVmGroup struct {
+	Account           string   `json:"account"`
+	Domain            string   `json:"domain"`
+	Domainid          string   `json:"domainid"`
+	Fordisplay        bool     `json:"fordisplay"`
+	Id                string   `json:"id"`
+	Interval          int      `json:"interval"`
+	Lbruleid          string   `json:"lbruleid"`
+	Maxmembers        int      `json:"maxmembers"`
+	Minmembers        int      `json:"minmembers"`
+	Project           string   `json:"project"`
+	Projectid         string   `json:"projectid"`
+	Scaledownpolicies []string `json:"scaledownpolicies"`
+	Scaleuppolicies   []string `json:"scaleuppolicies"`
+	State             string   `json:"state"`
+	Vmprofileid       string   `json:"vmprofileid"`
+}
+
+type ListAutoScaleVmProfilesParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListAutoScaleVmProfilesParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["fordisplay"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("fordisplay", vv)
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["isrecursive"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("isrecursive", vv)
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["listall"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("listall", vv)
+	}
+	if v, found := p.p["otherdeployparams"]; found {
+		u.Set("otherdeployparams", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["projectid"]; found {
+		u.Set("projectid", v.(string))
+	}
+	if v, found := p.p["serviceofferingid"]; found {
+		u.Set("serviceofferingid", v.(string))
+	}
+	if v, found := p.p["templateid"]; found {
+		u.Set("templateid", v.(string))
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *ListAutoScaleVmProfilesParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *ListAutoScaleVmProfilesParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *ListAutoScaleVmProfilesParams) SetFordisplay(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["fordisplay"] = v
+	return
+}
+
+func (p *ListAutoScaleVmProfilesParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ListAutoScaleVmProfilesParams) SetIsrecursive(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isrecursive"] = v
+	return
+}
+
+func (p *ListAutoScaleVmProfilesParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListAutoScaleVmProfilesParams) SetListall(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["listall"] = v
+	return
+}
+
+func (p *ListAutoScaleVmProfilesParams) SetOtherdeployparams(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["otherdeployparams"] = v
+	return
+}
+
+func (p *ListAutoScaleVmProfilesParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListAutoScaleVmProfilesParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListAutoScaleVmProfilesParams) SetProjectid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectid"] = v
+	return
+}
+
+func (p *ListAutoScaleVmProfilesParams) SetServiceofferingid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["serviceofferingid"] = v
+	return
+}
+
+func (p *ListAutoScaleVmProfilesParams) SetTemplateid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["templateid"] = v
+	return
+}
+
+func (p *ListAutoScaleVmProfilesParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new ListAutoScaleVmProfilesParams instance,
+// as then you are sure you have configured all required params
+func (s *AutoScaleService) NewListAutoScaleVmProfilesParams() *ListAutoScaleVmProfilesParams {
+	p := &ListAutoScaleVmProfilesParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *AutoScaleService) GetAutoScaleVmProfileByID(id string, opts ...OptionFunc) (*AutoScaleVmProfile, int, error) {
+	p := &ListAutoScaleVmProfilesParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["id"] = id
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return nil, -1, err
+		}
+	}
+
+	l, err := s.ListAutoScaleVmProfiles(p)
+	if err != nil {
+		if strings.Contains(err.Error(), fmt.Sprintf(
+			"Invalid parameter id value=%s due to incorrect long value format, "+
+				"or entity does not exist", id)) {
+			return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
+		}
+		return nil, -1, err
+	}
+
+	if l.Count == 0 {
+		return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
+	}
+
+	if l.Count == 1 {
+		return l.AutoScaleVmProfiles[0], l.Count, nil
+	}
+	return nil, l.Count, fmt.Errorf("There is more then one result for AutoScaleVmProfile UUID: %s!", id)
+}
+
+// Lists autoscale vm profiles.
+func (s *AutoScaleService) ListAutoScaleVmProfiles(p *ListAutoScaleVmProfilesParams) (*ListAutoScaleVmProfilesResponse, error) {
+	resp, err := s.cs.newRequest("listAutoScaleVmProfiles", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListAutoScaleVmProfilesResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListAutoScaleVmProfilesResponse struct {
+	Count               int                   `json:"count"`
+	AutoScaleVmProfiles []*AutoScaleVmProfile `json:"autoscalevmprofile"`
+}
+
+type AutoScaleVmProfile struct {
+	Account              string `json:"account"`
+	Autoscaleuserid      string `json:"autoscaleuserid"`
+	Destroyvmgraceperiod int    `json:"destroyvmgraceperiod"`
+	Domain               string `json:"domain"`
+	Domainid             string `json:"domainid"`
+	Fordisplay           bool   `json:"fordisplay"`
+	Id                   string `json:"id"`
+	Otherdeployparams    string `json:"otherdeployparams"`
+	Project              string `json:"project"`
+	Projectid            string `json:"projectid"`
+	Serviceofferingid    string `json:"serviceofferingid"`
+	Templateid           string `json:"templateid"`
+	Zoneid               string `json:"zoneid"`
+}
+
+type ListConditionsParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListConditionsParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["counterid"]; found {
+		u.Set("counterid", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["isrecursive"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("isrecursive", vv)
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["listall"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("listall", vv)
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["policyid"]; found {
+		u.Set("policyid", v.(string))
+	}
+	return u
+}
+
+func (p *ListConditionsParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *ListConditionsParams) SetCounterid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["counterid"] = v
+	return
+}
+
+func (p *ListConditionsParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *ListConditionsParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ListConditionsParams) SetIsrecursive(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isrecursive"] = v
+	return
+}
+
+func (p *ListConditionsParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListConditionsParams) SetListall(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["listall"] = v
+	return
+}
+
+func (p *ListConditionsParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListConditionsParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListConditionsParams) SetPolicyid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["policyid"] = v
+	return
+}
+
+// You should always use this function to get a new ListConditionsParams instance,
+// as then you are sure you have configured all required params
+func (s *AutoScaleService) NewListConditionsParams() *ListConditionsParams {
+	p := &ListConditionsParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *AutoScaleService) GetConditionByID(id string, opts ...OptionFunc) (*Condition, int, error) {
+	p := &ListConditionsParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["id"] = id
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return nil, -1, err
+		}
+	}
+
+	l, err := s.ListConditions(p)
+	if err != nil {
+		if strings.Contains(err.Error(), fmt.Sprintf(
+			"Invalid parameter id value=%s due to incorrect long value format, "+
+				"or entity does not exist", id)) {
+			return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
+		}
+		return nil, -1, err
+	}
+
+	if l.Count == 0 {
+		return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
+	}
+
+	if l.Count == 1 {
+		return l.Conditions[0], l.Count, nil
+	}
+	return nil, l.Count, fmt.Errorf("There is more then one result for Condition UUID: %s!", id)
+}
+
+// List Conditions for the specific user
+func (s *AutoScaleService) ListConditions(p *ListConditionsParams) (*ListConditionsResponse, error) {
+	resp, err := s.cs.newRequest("listConditions", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListConditionsResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListConditionsResponse struct {
+	Count      int          `json:"count"`
+	Conditions []*Condition `json:"condition"`
+}
+
+type Condition struct {
+	Account            string   `json:"account"`
+	Counter            []string `json:"counter"`
+	Domain             string   `json:"domain"`
+	Domainid           string   `json:"domainid"`
+	Id                 string   `json:"id"`
+	Project            string   `json:"project"`
+	Projectid          string   `json:"projectid"`
+	Relationaloperator string   `json:"relationaloperator"`
+	Threshold          int64    `json:"threshold"`
+	Zoneid             string   `json:"zoneid"`
+}
+
+type ListCountersParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListCountersParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["source"]; found {
+		u.Set("source", v.(string))
+	}
+	return u
+}
+
+func (p *ListCountersParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ListCountersParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListCountersParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *ListCountersParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListCountersParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListCountersParams) SetSource(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["source"] = v
+	return
+}
+
+// You should always use this function to get a new ListCountersParams instance,
+// as then you are sure you have configured all required params
+func (s *AutoScaleService) NewListCountersParams() *ListCountersParams {
+	p := &ListCountersParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *AutoScaleService) GetCounterID(name string, opts ...OptionFunc) (string, int, error) {
+	p := &ListCountersParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["name"] = name
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return "", -1, err
+		}
+	}
+
+	l, err := s.ListCounters(p)
+	if err != nil {
+		return "", -1, err
+	}
+
+	if l.Count == 0 {
+		return "", l.Count, fmt.Errorf("No match found for %s: %+v", name, l)
+	}
+
+	if l.Count == 1 {
+		return l.Counters[0].Id, l.Count, nil
+	}
+
+	if l.Count > 1 {
+		for _, v := range l.Counters {
+			if v.Name == name {
+				return v.Id, l.Count, nil
+			}
+		}
+	}
+	return "", l.Count, fmt.Errorf("Could not find an exact match for %s: %+v", name, l)
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *AutoScaleService) GetCounterByName(name string, opts ...OptionFunc) (*Counter, int, error) {
+	id, count, err := s.GetCounterID(name, opts...)
+	if err != nil {
+		return nil, count, err
+	}
+
+	r, count, err := s.GetCounterByID(id, opts...)
+	if err != nil {
+		return nil, count, err
+	}
+	return r, count, nil
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *AutoScaleService) GetCounterByID(id string, opts ...OptionFunc) (*Counter, int, error) {
+	p := &ListCountersParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["id"] = id
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return nil, -1, err
+		}
+	}
+
+	l, err := s.ListCounters(p)
+	if err != nil {
+		if strings.Contains(err.Error(), fmt.Sprintf(
+			"Invalid parameter id value=%s due to incorrect long value format, "+
+				"or entity does not exist", id)) {
+			return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
+		}
+		return nil, -1, err
+	}
+
+	if l.Count == 0 {
+		return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
+	}
+
+	if l.Count == 1 {
+		return l.Counters[0], l.Count, nil
+	}
+	return nil, l.Count, fmt.Errorf("There is more then one result for Counter UUID: %s!", id)
+}
+
+// List the counters
+func (s *AutoScaleService) ListCounters(p *ListCountersParams) (*ListCountersResponse, error) {
+	resp, err := s.cs.newRequest("listCounters", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListCountersResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListCountersResponse struct {
+	Count    int        `json:"count"`
+	Counters []*Counter `json:"counter"`
+}
+
+type Counter struct {
+	Id     string `json:"id"`
+	Name   string `json:"name"`
+	Source string `json:"source"`
+	Value  string `json:"value"`
+	Zoneid string `json:"zoneid"`
+}
+
+type UpdateAutoScalePolicyParams struct {
+	p map[string]interface{}
+}
+
+func (p *UpdateAutoScalePolicyParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["conditionids"]; found {
+		vv := strings.Join(v.([]string), ",")
+		u.Set("conditionids", vv)
+	}
+	if v, found := p.p["duration"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("duration", vv)
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["quiettime"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("quiettime", vv)
+	}
+	return u
+}
+
+func (p *UpdateAutoScalePolicyParams) SetConditionids(v []string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["conditionids"] = v
+	return
+}
+
+func (p *UpdateAutoScalePolicyParams) SetDuration(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["duration"] = v
+	return
+}
+
+func (p *UpdateAutoScalePolicyParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *UpdateAutoScalePolicyParams) SetQuiettime(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["quiettime"] = v
+	return
+}
+
+// You should always use this function to get a new UpdateAutoScalePolicyParams instance,
+// as then you are sure you have configured all required params
+func (s *AutoScaleService) NewUpdateAutoScalePolicyParams(id string) *UpdateAutoScalePolicyParams {
+	p := &UpdateAutoScalePolicyParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Updates an existing autoscale policy.
+func (s *AutoScaleService) UpdateAutoScalePolicy(p *UpdateAutoScalePolicyParams) (*UpdateAutoScalePolicyResponse, error) {
+	resp, err := s.cs.newRequest("updateAutoScalePolicy", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r UpdateAutoScalePolicyResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type UpdateAutoScalePolicyResponse struct {
+	JobID      string   `json:"jobid"`
+	Account    string   `json:"account"`
+	Action     string   `json:"action"`
+	Conditions []string `json:"conditions"`
+	Domain     string   `json:"domain"`
+	Domainid   string   `json:"domainid"`
+	Duration   int      `json:"duration"`
+	Id         string   `json:"id"`
+	Project    string   `json:"project"`
+	Projectid  string   `json:"projectid"`
+	Quiettime  int      `json:"quiettime"`
+}
+
+type UpdateAutoScaleVmGroupParams struct {
+	p map[string]interface{}
+}
+
+func (p *UpdateAutoScaleVmGroupParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["customid"]; found {
+		u.Set("customid", v.(string))
+	}
+	if v, found := p.p["fordisplay"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("fordisplay", vv)
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["interval"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("interval", vv)
+	}
+	if v, found := p.p["maxmembers"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("maxmembers", vv)
+	}
+	if v, found := p.p["minmembers"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("minmembers", vv)
+	}
+	if v, found := p.p["scaledownpolicyids"]; found {
+		vv := strings.Join(v.([]string), ",")
+		u.Set("scaledownpolicyids", vv)
+	}
+	if v, found := p.p["scaleuppolicyids"]; found {
+		vv := strings.Join(v.([]string), ",")
+		u.Set("scaleuppolicyids", vv)
+	}
+	return u
+}
+
+func (p *UpdateAutoScaleVmGroupParams) SetCustomid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["customid"] = v
+	return
+}
+
+func (p *UpdateAutoScaleVmGroupParams) SetFordisplay(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["fordisplay"] = v
+	return
+}
+
+func (p *UpdateAutoScaleVmGroupParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *UpdateAutoScaleVmGroupParams) SetInterval(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["interval"] = v
+	return
+}
+
+func (p *UpdateAutoScaleVmGroupParams) SetMaxmembers(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["maxmembers"] = v
+	return
+}
+
+func (p *UpdateAutoScaleVmGroupParams) SetMinmembers(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["minmembers"] = v
+	return
+}
+
+func (p *UpdateAutoScaleVmGroupParams) SetScaledownpolicyids(v []string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["scaledownpolicyids"] = v
+	return
+}
+
+func (p *UpdateAutoScaleVmGroupParams) SetScaleuppolicyids(v []string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["scaleuppolicyids"] = v
+	return
+}
+
+// You should always use this function to get a new UpdateAutoScaleVmGroupParams instance,
+// as then you are sure you have configured all required params
+func (s *AutoScaleService) NewUpdateAutoScaleVmGroupParams(id string) *UpdateAutoScaleVmGroupParams {
+	p := &UpdateAutoScaleVmGroupParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Updates an existing autoscale vm group.
+func (s *AutoScaleService) UpdateAutoScaleVmGroup(p *UpdateAutoScaleVmGroupParams) (*UpdateAutoScaleVmGroupResponse, error) {
+	resp, err := s.cs.newRequest("updateAutoScaleVmGroup", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r UpdateAutoScaleVmGroupResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type UpdateAutoScaleVmGroupResponse struct {
+	JobID             string   `json:"jobid"`
+	Account           string   `json:"account"`
+	Domain            string   `json:"domain"`
+	Domainid          string   `json:"domainid"`
+	Fordisplay        bool     `json:"fordisplay"`
+	Id                string   `json:"id"`
+	Interval          int      `json:"interval"`
+	Lbruleid          string   `json:"lbruleid"`
+	Maxmembers        int      `json:"maxmembers"`
+	Minmembers        int      `json:"minmembers"`
+	Project           string   `json:"project"`
+	Projectid         string   `json:"projectid"`
+	Scaledownpolicies []string `json:"scaledownpolicies"`
+	Scaleuppolicies   []string `json:"scaleuppolicies"`
+	State             string   `json:"state"`
+	Vmprofileid       string   `json:"vmprofileid"`
+}
+
+type UpdateAutoScaleVmProfileParams struct {
+	p map[string]interface{}
+}
+
+func (p *UpdateAutoScaleVmProfileParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["autoscaleuserid"]; found {
+		u.Set("autoscaleuserid", v.(string))
+	}
+	if v, found := p.p["counterparam"]; found {
+		i := 0
+		for k, vv := range v.(map[string]string) {
+			u.Set(fmt.Sprintf("counterparam[%d].key", i), k)
+			u.Set(fmt.Sprintf("counterparam[%d].value", i), vv)
+			i++
+		}
+	}
+	if v, found := p.p["customid"]; found {
+		u.Set("customid", v.(string))
+	}
+	if v, found := p.p["destroyvmgraceperiod"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("destroyvmgraceperiod", vv)
+	}
+	if v, found := p.p["fordisplay"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("fordisplay", vv)
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["templateid"]; found {
+		u.Set("templateid", v.(string))
+	}
+	return u
+}
+
+func (p *UpdateAutoScaleVmProfileParams) SetAutoscaleuserid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["autoscaleuserid"] = v
+	return
+}
+
+func (p *UpdateAutoScaleVmProfileParams) SetCounterparam(v map[string]string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["counterparam"] = v
+	return
+}
+
+func (p *UpdateAutoScaleVmProfileParams) SetCustomid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["customid"] = v
+	return
+}
+
+func (p *UpdateAutoScaleVmProfileParams) SetDestroyvmgraceperiod(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["destroyvmgraceperiod"] = v
+	return
+}
+
+func (p *UpdateAutoScaleVmProfileParams) SetFordisplay(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["fordisplay"] = v
+	return
+}
+
+func (p *UpdateAutoScaleVmProfileParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *UpdateAutoScaleVmProfileParams) SetTemplateid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["templateid"] = v
+	return
+}
+
+// You should always use this function to get a new UpdateAutoScaleVmProfileParams instance,
+// as then you are sure you have configured all required params
+func (s *AutoScaleService) NewUpdateAutoScaleVmProfileParams(id string) *UpdateAutoScaleVmProfileParams {
+	p := &UpdateAutoScaleVmProfileParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Updates an existing autoscale vm profile.
+func (s *AutoScaleService) UpdateAutoScaleVmProfile(p *UpdateAutoScaleVmProfileParams) (*UpdateAutoScaleVmProfileResponse, error) {
+	resp, err := s.cs.newRequest("updateAutoScaleVmProfile", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r UpdateAutoScaleVmProfileResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type UpdateAutoScaleVmProfileResponse struct {
+	JobID                string `json:"jobid"`
+	Account              string `json:"account"`
+	Autoscaleuserid      string `json:"autoscaleuserid"`
+	Destroyvmgraceperiod int    `json:"destroyvmgraceperiod"`
+	Domain               string `json:"domain"`
+	Domainid             string `json:"domainid"`
+	Fordisplay           bool   `json:"fordisplay"`
+	Id                   string `json:"id"`
+	Otherdeployparams    string `json:"otherdeployparams"`
+	Project              string `json:"project"`
+	Projectid            string `json:"projectid"`
+	Serviceofferingid    string `json:"serviceofferingid"`
+	Templateid           string `json:"templateid"`
+	Zoneid               string `json:"zoneid"`
+}
diff --git a/vendor/github.com/xanzy/go-cloudstack/cloudstack/BaremetalService.go b/vendor/github.com/xanzy/go-cloudstack/cloudstack/BaremetalService.go
new file mode 100644
index 0000000..2b8b9f2
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/cloudstack/BaremetalService.go
@@ -0,0 +1,994 @@
+//
+// Copyright 2018, Sander van Harmelen
+//
+// Licensed 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 cloudstack
+
+import (
+	"encoding/json"
+	"net/url"
+	"strconv"
+)
+
+type AddBaremetalDhcpParams struct {
+	p map[string]interface{}
+}
+
+func (p *AddBaremetalDhcpParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["dhcpservertype"]; found {
+		u.Set("dhcpservertype", v.(string))
+	}
+	if v, found := p.p["password"]; found {
+		u.Set("password", v.(string))
+	}
+	if v, found := p.p["physicalnetworkid"]; found {
+		u.Set("physicalnetworkid", v.(string))
+	}
+	if v, found := p.p["url"]; found {
+		u.Set("url", v.(string))
+	}
+	if v, found := p.p["username"]; found {
+		u.Set("username", v.(string))
+	}
+	return u
+}
+
+func (p *AddBaremetalDhcpParams) SetDhcpservertype(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["dhcpservertype"] = v
+	return
+}
+
+func (p *AddBaremetalDhcpParams) SetPassword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["password"] = v
+	return
+}
+
+func (p *AddBaremetalDhcpParams) SetPhysicalnetworkid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["physicalnetworkid"] = v
+	return
+}
+
+func (p *AddBaremetalDhcpParams) SetUrl(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["url"] = v
+	return
+}
+
+func (p *AddBaremetalDhcpParams) SetUsername(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["username"] = v
+	return
+}
+
+// You should always use this function to get a new AddBaremetalDhcpParams instance,
+// as then you are sure you have configured all required params
+func (s *BaremetalService) NewAddBaremetalDhcpParams(dhcpservertype string, password string, physicalnetworkid string, url string, username string) *AddBaremetalDhcpParams {
+	p := &AddBaremetalDhcpParams{}
+	p.p = make(map[string]interface{})
+	p.p["dhcpservertype"] = dhcpservertype
+	p.p["password"] = password
+	p.p["physicalnetworkid"] = physicalnetworkid
+	p.p["url"] = url
+	p.p["username"] = username
+	return p
+}
+
+// adds a baremetal dhcp server
+func (s *BaremetalService) AddBaremetalDhcp(p *AddBaremetalDhcpParams) (*AddBaremetalDhcpResponse, error) {
+	resp, err := s.cs.newRequest("addBaremetalDhcp", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r AddBaremetalDhcpResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type AddBaremetalDhcpResponse struct {
+	JobID             string `json:"jobid"`
+	Dhcpservertype    string `json:"dhcpservertype"`
+	Id                string `json:"id"`
+	Physicalnetworkid string `json:"physicalnetworkid"`
+	Provider          string `json:"provider"`
+	Url               string `json:"url"`
+}
+
+type AddBaremetalPxeKickStartServerParams struct {
+	p map[string]interface{}
+}
+
+func (p *AddBaremetalPxeKickStartServerParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["password"]; found {
+		u.Set("password", v.(string))
+	}
+	if v, found := p.p["physicalnetworkid"]; found {
+		u.Set("physicalnetworkid", v.(string))
+	}
+	if v, found := p.p["podid"]; found {
+		u.Set("podid", v.(string))
+	}
+	if v, found := p.p["pxeservertype"]; found {
+		u.Set("pxeservertype", v.(string))
+	}
+	if v, found := p.p["tftpdir"]; found {
+		u.Set("tftpdir", v.(string))
+	}
+	if v, found := p.p["url"]; found {
+		u.Set("url", v.(string))
+	}
+	if v, found := p.p["username"]; found {
+		u.Set("username", v.(string))
+	}
+	return u
+}
+
+func (p *AddBaremetalPxeKickStartServerParams) SetPassword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["password"] = v
+	return
+}
+
+func (p *AddBaremetalPxeKickStartServerParams) SetPhysicalnetworkid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["physicalnetworkid"] = v
+	return
+}
+
+func (p *AddBaremetalPxeKickStartServerParams) SetPodid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["podid"] = v
+	return
+}
+
+func (p *AddBaremetalPxeKickStartServerParams) SetPxeservertype(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pxeservertype"] = v
+	return
+}
+
+func (p *AddBaremetalPxeKickStartServerParams) SetTftpdir(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["tftpdir"] = v
+	return
+}
+
+func (p *AddBaremetalPxeKickStartServerParams) SetUrl(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["url"] = v
+	return
+}
+
+func (p *AddBaremetalPxeKickStartServerParams) SetUsername(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["username"] = v
+	return
+}
+
+// You should always use this function to get a new AddBaremetalPxeKickStartServerParams instance,
+// as then you are sure you have configured all required params
+func (s *BaremetalService) NewAddBaremetalPxeKickStartServerParams(password string, physicalnetworkid string, pxeservertype string, tftpdir string, url string, username string) *AddBaremetalPxeKickStartServerParams {
+	p := &AddBaremetalPxeKickStartServerParams{}
+	p.p = make(map[string]interface{})
+	p.p["password"] = password
+	p.p["physicalnetworkid"] = physicalnetworkid
+	p.p["pxeservertype"] = pxeservertype
+	p.p["tftpdir"] = tftpdir
+	p.p["url"] = url
+	p.p["username"] = username
+	return p
+}
+
+// add a baremetal pxe server
+func (s *BaremetalService) AddBaremetalPxeKickStartServer(p *AddBaremetalPxeKickStartServerParams) (*AddBaremetalPxeKickStartServerResponse, error) {
+	resp, err := s.cs.newRequest("addBaremetalPxeKickStartServer", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r AddBaremetalPxeKickStartServerResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type AddBaremetalPxeKickStartServerResponse struct {
+	JobID   string `json:"jobid"`
+	Tftpdir string `json:"tftpdir"`
+}
+
+type AddBaremetalPxePingServerParams struct {
+	p map[string]interface{}
+}
+
+func (p *AddBaremetalPxePingServerParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["password"]; found {
+		u.Set("password", v.(string))
+	}
+	if v, found := p.p["physicalnetworkid"]; found {
+		u.Set("physicalnetworkid", v.(string))
+	}
+	if v, found := p.p["pingcifspassword"]; found {
+		u.Set("pingcifspassword", v.(string))
+	}
+	if v, found := p.p["pingcifsusername"]; found {
+		u.Set("pingcifsusername", v.(string))
+	}
+	if v, found := p.p["pingdir"]; found {
+		u.Set("pingdir", v.(string))
+	}
+	if v, found := p.p["pingstorageserverip"]; found {
+		u.Set("pingstorageserverip", v.(string))
+	}
+	if v, found := p.p["podid"]; found {
+		u.Set("podid", v.(string))
+	}
+	if v, found := p.p["pxeservertype"]; found {
+		u.Set("pxeservertype", v.(string))
+	}
+	if v, found := p.p["tftpdir"]; found {
+		u.Set("tftpdir", v.(string))
+	}
+	if v, found := p.p["url"]; found {
+		u.Set("url", v.(string))
+	}
+	if v, found := p.p["username"]; found {
+		u.Set("username", v.(string))
+	}
+	return u
+}
+
+func (p *AddBaremetalPxePingServerParams) SetPassword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["password"] = v
+	return
+}
+
+func (p *AddBaremetalPxePingServerParams) SetPhysicalnetworkid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["physicalnetworkid"] = v
+	return
+}
+
+func (p *AddBaremetalPxePingServerParams) SetPingcifspassword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pingcifspassword"] = v
+	return
+}
+
+func (p *AddBaremetalPxePingServerParams) SetPingcifsusername(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pingcifsusername"] = v
+	return
+}
+
+func (p *AddBaremetalPxePingServerParams) SetPingdir(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pingdir"] = v
+	return
+}
+
+func (p *AddBaremetalPxePingServerParams) SetPingstorageserverip(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pingstorageserverip"] = v
+	return
+}
+
+func (p *AddBaremetalPxePingServerParams) SetPodid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["podid"] = v
+	return
+}
+
+func (p *AddBaremetalPxePingServerParams) SetPxeservertype(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pxeservertype"] = v
+	return
+}
+
+func (p *AddBaremetalPxePingServerParams) SetTftpdir(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["tftpdir"] = v
+	return
+}
+
+func (p *AddBaremetalPxePingServerParams) SetUrl(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["url"] = v
+	return
+}
+
+func (p *AddBaremetalPxePingServerParams) SetUsername(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["username"] = v
+	return
+}
+
+// You should always use this function to get a new AddBaremetalPxePingServerParams instance,
+// as then you are sure you have configured all required params
+func (s *BaremetalService) NewAddBaremetalPxePingServerParams(password string, physicalnetworkid string, pingdir string, pingstorageserverip string, pxeservertype string, tftpdir string, url string, username string) *AddBaremetalPxePingServerParams {
+	p := &AddBaremetalPxePingServerParams{}
+	p.p = make(map[string]interface{})
+	p.p["password"] = password
+	p.p["physicalnetworkid"] = physicalnetworkid
+	p.p["pingdir"] = pingdir
+	p.p["pingstorageserverip"] = pingstorageserverip
+	p.p["pxeservertype"] = pxeservertype
+	p.p["tftpdir"] = tftpdir
+	p.p["url"] = url
+	p.p["username"] = username
+	return p
+}
+
+// add a baremetal ping pxe server
+func (s *BaremetalService) AddBaremetalPxePingServer(p *AddBaremetalPxePingServerParams) (*AddBaremetalPxePingServerResponse, error) {
+	resp, err := s.cs.newRequest("addBaremetalPxePingServer", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r AddBaremetalPxePingServerResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type AddBaremetalPxePingServerResponse struct {
+	JobID               string `json:"jobid"`
+	Pingdir             string `json:"pingdir"`
+	Pingstorageserverip string `json:"pingstorageserverip"`
+	Tftpdir             string `json:"tftpdir"`
+}
+
+type AddBaremetalRctParams struct {
+	p map[string]interface{}
+}
+
+func (p *AddBaremetalRctParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["baremetalrcturl"]; found {
+		u.Set("baremetalrcturl", v.(string))
+	}
+	return u
+}
+
+func (p *AddBaremetalRctParams) SetBaremetalrcturl(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["baremetalrcturl"] = v
+	return
+}
+
+// You should always use this function to get a new AddBaremetalRctParams instance,
+// as then you are sure you have configured all required params
+func (s *BaremetalService) NewAddBaremetalRctParams(baremetalrcturl string) *AddBaremetalRctParams {
+	p := &AddBaremetalRctParams{}
+	p.p = make(map[string]interface{})
+	p.p["baremetalrcturl"] = baremetalrcturl
+	return p
+}
+
+// adds baremetal rack configuration text
+func (s *BaremetalService) AddBaremetalRct(p *AddBaremetalRctParams) (*AddBaremetalRctResponse, error) {
+	resp, err := s.cs.newRequest("addBaremetalRct", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r AddBaremetalRctResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type AddBaremetalRctResponse struct {
+	JobID string `json:"jobid"`
+	Id    string `json:"id"`
+	Url   string `json:"url"`
+}
+
+type DeleteBaremetalRctParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeleteBaremetalRctParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *DeleteBaremetalRctParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new DeleteBaremetalRctParams instance,
+// as then you are sure you have configured all required params
+func (s *BaremetalService) NewDeleteBaremetalRctParams(id string) *DeleteBaremetalRctParams {
+	p := &DeleteBaremetalRctParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// deletes baremetal rack configuration text
+func (s *BaremetalService) DeleteBaremetalRct(p *DeleteBaremetalRctParams) (*DeleteBaremetalRctResponse, error) {
+	resp, err := s.cs.newRequest("deleteBaremetalRct", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeleteBaremetalRctResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type DeleteBaremetalRctResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
+
+type ListBaremetalDhcpParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListBaremetalDhcpParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["dhcpservertype"]; found {
+		u.Set("dhcpservertype", v.(string))
+	}
+	if v, found := p.p["id"]; found {
+		vv := strconv.FormatInt(v.(int64), 10)
+		u.Set("id", vv)
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["physicalnetworkid"]; found {
+		u.Set("physicalnetworkid", v.(string))
+	}
+	return u
+}
+
+func (p *ListBaremetalDhcpParams) SetDhcpservertype(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["dhcpservertype"] = v
+	return
+}
+
+func (p *ListBaremetalDhcpParams) SetId(v int64) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ListBaremetalDhcpParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListBaremetalDhcpParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListBaremetalDhcpParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListBaremetalDhcpParams) SetPhysicalnetworkid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["physicalnetworkid"] = v
+	return
+}
+
+// You should always use this function to get a new ListBaremetalDhcpParams instance,
+// as then you are sure you have configured all required params
+func (s *BaremetalService) NewListBaremetalDhcpParams(physicalnetworkid string) *ListBaremetalDhcpParams {
+	p := &ListBaremetalDhcpParams{}
+	p.p = make(map[string]interface{})
+	p.p["physicalnetworkid"] = physicalnetworkid
+	return p
+}
+
+// list baremetal dhcp servers
+func (s *BaremetalService) ListBaremetalDhcp(p *ListBaremetalDhcpParams) (*ListBaremetalDhcpResponse, error) {
+	resp, err := s.cs.newRequest("listBaremetalDhcp", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListBaremetalDhcpResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListBaremetalDhcpResponse struct {
+	Count         int              `json:"count"`
+	BaremetalDhcp []*BaremetalDhcp `json:"baremetaldhcp"`
+}
+
+type BaremetalDhcp struct {
+	Dhcpservertype    string `json:"dhcpservertype"`
+	Id                string `json:"id"`
+	Physicalnetworkid string `json:"physicalnetworkid"`
+	Provider          string `json:"provider"`
+	Url               string `json:"url"`
+}
+
+type ListBaremetalPxeServersParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListBaremetalPxeServersParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		vv := strconv.FormatInt(v.(int64), 10)
+		u.Set("id", vv)
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["physicalnetworkid"]; found {
+		u.Set("physicalnetworkid", v.(string))
+	}
+	return u
+}
+
+func (p *ListBaremetalPxeServersParams) SetId(v int64) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ListBaremetalPxeServersParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListBaremetalPxeServersParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListBaremetalPxeServersParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListBaremetalPxeServersParams) SetPhysicalnetworkid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["physicalnetworkid"] = v
+	return
+}
+
+// You should always use this function to get a new ListBaremetalPxeServersParams instance,
+// as then you are sure you have configured all required params
+func (s *BaremetalService) NewListBaremetalPxeServersParams(physicalnetworkid string) *ListBaremetalPxeServersParams {
+	p := &ListBaremetalPxeServersParams{}
+	p.p = make(map[string]interface{})
+	p.p["physicalnetworkid"] = physicalnetworkid
+	return p
+}
+
+// list baremetal pxe server
+func (s *BaremetalService) ListBaremetalPxeServers(p *ListBaremetalPxeServersParams) (*ListBaremetalPxeServersResponse, error) {
+	resp, err := s.cs.newRequest("listBaremetalPxeServers", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListBaremetalPxeServersResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListBaremetalPxeServersResponse struct {
+	Count               int                   `json:"count"`
+	BaremetalPxeServers []*BaremetalPxeServer `json:"baremetalpxeserver"`
+}
+
+type BaremetalPxeServer struct {
+	Id                string `json:"id"`
+	Physicalnetworkid string `json:"physicalnetworkid"`
+	Provider          string `json:"provider"`
+	Url               string `json:"url"`
+}
+
+type ListBaremetalRctParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListBaremetalRctParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	return u
+}
+
+func (p *ListBaremetalRctParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListBaremetalRctParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListBaremetalRctParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+// You should always use this function to get a new ListBaremetalRctParams instance,
+// as then you are sure you have configured all required params
+func (s *BaremetalService) NewListBaremetalRctParams() *ListBaremetalRctParams {
+	p := &ListBaremetalRctParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// list baremetal rack configuration
+func (s *BaremetalService) ListBaremetalRct(p *ListBaremetalRctParams) (*ListBaremetalRctResponse, error) {
+	resp, err := s.cs.newRequest("listBaremetalRct", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListBaremetalRctResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListBaremetalRctResponse struct {
+	Count        int             `json:"count"`
+	BaremetalRct []*BaremetalRct `json:"baremetalrct"`
+}
+
+type BaremetalRct struct {
+	Id  string `json:"id"`
+	Url string `json:"url"`
+}
+
+type NotifyBaremetalProvisionDoneParams struct {
+	p map[string]interface{}
+}
+
+func (p *NotifyBaremetalProvisionDoneParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["mac"]; found {
+		u.Set("mac", v.(string))
+	}
+	return u
+}
+
+func (p *NotifyBaremetalProvisionDoneParams) SetMac(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["mac"] = v
+	return
+}
+
+// You should always use this function to get a new NotifyBaremetalProvisionDoneParams instance,
+// as then you are sure you have configured all required params
+func (s *BaremetalService) NewNotifyBaremetalProvisionDoneParams(mac string) *NotifyBaremetalProvisionDoneParams {
+	p := &NotifyBaremetalProvisionDoneParams{}
+	p.p = make(map[string]interface{})
+	p.p["mac"] = mac
+	return p
+}
+
+// Notify provision has been done on a host. This api is for baremetal virtual router service, not for end user
+func (s *BaremetalService) NotifyBaremetalProvisionDone(p *NotifyBaremetalProvisionDoneParams) (*NotifyBaremetalProvisionDoneResponse, error) {
+	resp, err := s.cs.newRequest("notifyBaremetalProvisionDone", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r NotifyBaremetalProvisionDoneResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type NotifyBaremetalProvisionDoneResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
diff --git a/vendor/github.com/xanzy/go-cloudstack/cloudstack/BigSwitchBCFService.go b/vendor/github.com/xanzy/go-cloudstack/cloudstack/BigSwitchBCFService.go
new file mode 100644
index 0000000..e85b207
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/cloudstack/BigSwitchBCFService.go
@@ -0,0 +1,327 @@
+//
+// Copyright 2018, Sander van Harmelen
+//
+// Licensed 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 cloudstack
+
+import (
+	"encoding/json"
+	"net/url"
+	"strconv"
+)
+
+type AddBigSwitchBcfDeviceParams struct {
+	p map[string]interface{}
+}
+
+func (p *AddBigSwitchBcfDeviceParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["hostname"]; found {
+		u.Set("hostname", v.(string))
+	}
+	if v, found := p.p["nat"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("nat", vv)
+	}
+	if v, found := p.p["password"]; found {
+		u.Set("password", v.(string))
+	}
+	if v, found := p.p["physicalnetworkid"]; found {
+		u.Set("physicalnetworkid", v.(string))
+	}
+	if v, found := p.p["username"]; found {
+		u.Set("username", v.(string))
+	}
+	return u
+}
+
+func (p *AddBigSwitchBcfDeviceParams) SetHostname(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["hostname"] = v
+	return
+}
+
+func (p *AddBigSwitchBcfDeviceParams) SetNat(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["nat"] = v
+	return
+}
+
+func (p *AddBigSwitchBcfDeviceParams) SetPassword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["password"] = v
+	return
+}
+
+func (p *AddBigSwitchBcfDeviceParams) SetPhysicalnetworkid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["physicalnetworkid"] = v
+	return
+}
+
+func (p *AddBigSwitchBcfDeviceParams) SetUsername(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["username"] = v
+	return
+}
+
+// You should always use this function to get a new AddBigSwitchBcfDeviceParams instance,
+// as then you are sure you have configured all required params
+func (s *BigSwitchBCFService) NewAddBigSwitchBcfDeviceParams(hostname string, nat bool, password string, physicalnetworkid string, username string) *AddBigSwitchBcfDeviceParams {
+	p := &AddBigSwitchBcfDeviceParams{}
+	p.p = make(map[string]interface{})
+	p.p["hostname"] = hostname
+	p.p["nat"] = nat
+	p.p["password"] = password
+	p.p["physicalnetworkid"] = physicalnetworkid
+	p.p["username"] = username
+	return p
+}
+
+// Adds a BigSwitch BCF Controller device
+func (s *BigSwitchBCFService) AddBigSwitchBcfDevice(p *AddBigSwitchBcfDeviceParams) (*AddBigSwitchBcfDeviceResponse, error) {
+	resp, err := s.cs.newRequest("addBigSwitchBcfDevice", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r AddBigSwitchBcfDeviceResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type AddBigSwitchBcfDeviceResponse struct {
+	JobID               string `json:"jobid"`
+	Bcfdeviceid         string `json:"bcfdeviceid"`
+	Bigswitchdevicename string `json:"bigswitchdevicename"`
+	Hostname            string `json:"hostname"`
+	Nat                 bool   `json:"nat"`
+	Password            string `json:"password"`
+	Physicalnetworkid   string `json:"physicalnetworkid"`
+	Provider            string `json:"provider"`
+	Username            string `json:"username"`
+}
+
+type DeleteBigSwitchBcfDeviceParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeleteBigSwitchBcfDeviceParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["bcfdeviceid"]; found {
+		u.Set("bcfdeviceid", v.(string))
+	}
+	return u
+}
+
+func (p *DeleteBigSwitchBcfDeviceParams) SetBcfdeviceid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["bcfdeviceid"] = v
+	return
+}
+
+// You should always use this function to get a new DeleteBigSwitchBcfDeviceParams instance,
+// as then you are sure you have configured all required params
+func (s *BigSwitchBCFService) NewDeleteBigSwitchBcfDeviceParams(bcfdeviceid string) *DeleteBigSwitchBcfDeviceParams {
+	p := &DeleteBigSwitchBcfDeviceParams{}
+	p.p = make(map[string]interface{})
+	p.p["bcfdeviceid"] = bcfdeviceid
+	return p
+}
+
+//  delete a BigSwitch BCF Controller device
+func (s *BigSwitchBCFService) DeleteBigSwitchBcfDevice(p *DeleteBigSwitchBcfDeviceParams) (*DeleteBigSwitchBcfDeviceResponse, error) {
+	resp, err := s.cs.newRequest("deleteBigSwitchBcfDevice", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeleteBigSwitchBcfDeviceResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type DeleteBigSwitchBcfDeviceResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
+
+type ListBigSwitchBcfDevicesParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListBigSwitchBcfDevicesParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["bcfdeviceid"]; found {
+		u.Set("bcfdeviceid", v.(string))
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["physicalnetworkid"]; found {
+		u.Set("physicalnetworkid", v.(string))
+	}
+	return u
+}
+
+func (p *ListBigSwitchBcfDevicesParams) SetBcfdeviceid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["bcfdeviceid"] = v
+	return
+}
+
+func (p *ListBigSwitchBcfDevicesParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListBigSwitchBcfDevicesParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListBigSwitchBcfDevicesParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListBigSwitchBcfDevicesParams) SetPhysicalnetworkid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["physicalnetworkid"] = v
+	return
+}
+
+// You should always use this function to get a new ListBigSwitchBcfDevicesParams instance,
+// as then you are sure you have configured all required params
+func (s *BigSwitchBCFService) NewListBigSwitchBcfDevicesParams() *ListBigSwitchBcfDevicesParams {
+	p := &ListBigSwitchBcfDevicesParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// Lists BigSwitch BCF Controller devices
+func (s *BigSwitchBCFService) ListBigSwitchBcfDevices(p *ListBigSwitchBcfDevicesParams) (*ListBigSwitchBcfDevicesResponse, error) {
+	resp, err := s.cs.newRequest("listBigSwitchBcfDevices", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListBigSwitchBcfDevicesResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListBigSwitchBcfDevicesResponse struct {
+	Count               int                   `json:"count"`
+	BigSwitchBcfDevices []*BigSwitchBcfDevice `json:"bigswitchbcfdevice"`
+}
+
+type BigSwitchBcfDevice struct {
+	Bcfdeviceid         string `json:"bcfdeviceid"`
+	Bigswitchdevicename string `json:"bigswitchdevicename"`
+	Hostname            string `json:"hostname"`
+	Nat                 bool   `json:"nat"`
+	Password            string `json:"password"`
+	Physicalnetworkid   string `json:"physicalnetworkid"`
+	Provider            string `json:"provider"`
+	Username            string `json:"username"`
+}
diff --git a/vendor/github.com/xanzy/go-cloudstack/cloudstack/BrocadeVCSService.go b/vendor/github.com/xanzy/go-cloudstack/cloudstack/BrocadeVCSService.go
new file mode 100644
index 0000000..1390d29
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/cloudstack/BrocadeVCSService.go
@@ -0,0 +1,511 @@
+//
+// Copyright 2018, Sander van Harmelen
+//
+// Licensed 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 cloudstack
+
+import (
+	"encoding/json"
+	"fmt"
+	"net/url"
+	"strconv"
+)
+
+type AddBrocadeVcsDeviceParams struct {
+	p map[string]interface{}
+}
+
+func (p *AddBrocadeVcsDeviceParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["hostname"]; found {
+		u.Set("hostname", v.(string))
+	}
+	if v, found := p.p["password"]; found {
+		u.Set("password", v.(string))
+	}
+	if v, found := p.p["physicalnetworkid"]; found {
+		u.Set("physicalnetworkid", v.(string))
+	}
+	if v, found := p.p["username"]; found {
+		u.Set("username", v.(string))
+	}
+	return u
+}
+
+func (p *AddBrocadeVcsDeviceParams) SetHostname(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["hostname"] = v
+	return
+}
+
+func (p *AddBrocadeVcsDeviceParams) SetPassword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["password"] = v
+	return
+}
+
+func (p *AddBrocadeVcsDeviceParams) SetPhysicalnetworkid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["physicalnetworkid"] = v
+	return
+}
+
+func (p *AddBrocadeVcsDeviceParams) SetUsername(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["username"] = v
+	return
+}
+
+// You should always use this function to get a new AddBrocadeVcsDeviceParams instance,
+// as then you are sure you have configured all required params
+func (s *BrocadeVCSService) NewAddBrocadeVcsDeviceParams(hostname string, password string, physicalnetworkid string, username string) *AddBrocadeVcsDeviceParams {
+	p := &AddBrocadeVcsDeviceParams{}
+	p.p = make(map[string]interface{})
+	p.p["hostname"] = hostname
+	p.p["password"] = password
+	p.p["physicalnetworkid"] = physicalnetworkid
+	p.p["username"] = username
+	return p
+}
+
+// Adds a Brocade VCS Switch
+func (s *BrocadeVCSService) AddBrocadeVcsDevice(p *AddBrocadeVcsDeviceParams) (*AddBrocadeVcsDeviceResponse, error) {
+	resp, err := s.cs.newRequest("addBrocadeVcsDevice", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r AddBrocadeVcsDeviceResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type AddBrocadeVcsDeviceResponse struct {
+	JobID             string `json:"jobid"`
+	Brocadedevicename string `json:"brocadedevicename"`
+	Hostname          string `json:"hostname"`
+	Physicalnetworkid string `json:"physicalnetworkid"`
+	Provider          string `json:"provider"`
+	Vcsdeviceid       string `json:"vcsdeviceid"`
+}
+
+type DeleteBrocadeVcsDeviceParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeleteBrocadeVcsDeviceParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["vcsdeviceid"]; found {
+		u.Set("vcsdeviceid", v.(string))
+	}
+	return u
+}
+
+func (p *DeleteBrocadeVcsDeviceParams) SetVcsdeviceid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["vcsdeviceid"] = v
+	return
+}
+
+// You should always use this function to get a new DeleteBrocadeVcsDeviceParams instance,
+// as then you are sure you have configured all required params
+func (s *BrocadeVCSService) NewDeleteBrocadeVcsDeviceParams(vcsdeviceid string) *DeleteBrocadeVcsDeviceParams {
+	p := &DeleteBrocadeVcsDeviceParams{}
+	p.p = make(map[string]interface{})
+	p.p["vcsdeviceid"] = vcsdeviceid
+	return p
+}
+
+//  delete a Brocade VCS Switch
+func (s *BrocadeVCSService) DeleteBrocadeVcsDevice(p *DeleteBrocadeVcsDeviceParams) (*DeleteBrocadeVcsDeviceResponse, error) {
+	resp, err := s.cs.newRequest("deleteBrocadeVcsDevice", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeleteBrocadeVcsDeviceResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type DeleteBrocadeVcsDeviceResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
+
+type ListBrocadeVcsDeviceNetworksParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListBrocadeVcsDeviceNetworksParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["vcsdeviceid"]; found {
+		u.Set("vcsdeviceid", v.(string))
+	}
+	return u
+}
+
+func (p *ListBrocadeVcsDeviceNetworksParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListBrocadeVcsDeviceNetworksParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListBrocadeVcsDeviceNetworksParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListBrocadeVcsDeviceNetworksParams) SetVcsdeviceid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["vcsdeviceid"] = v
+	return
+}
+
+// You should always use this function to get a new ListBrocadeVcsDeviceNetworksParams instance,
+// as then you are sure you have configured all required params
+func (s *BrocadeVCSService) NewListBrocadeVcsDeviceNetworksParams(vcsdeviceid string) *ListBrocadeVcsDeviceNetworksParams {
+	p := &ListBrocadeVcsDeviceNetworksParams{}
+	p.p = make(map[string]interface{})
+	p.p["vcsdeviceid"] = vcsdeviceid
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *BrocadeVCSService) GetBrocadeVcsDeviceNetworkID(keyword string, vcsdeviceid string, opts ...OptionFunc) (string, int, error) {
+	p := &ListBrocadeVcsDeviceNetworksParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["keyword"] = keyword
+	p.p["vcsdeviceid"] = vcsdeviceid
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return "", -1, err
+		}
+	}
+
+	l, err := s.ListBrocadeVcsDeviceNetworks(p)
+	if err != nil {
+		return "", -1, err
+	}
+
+	if l.Count == 0 {
+		return "", l.Count, fmt.Errorf("No match found for %s: %+v", keyword, l)
+	}
+
+	if l.Count == 1 {
+		return l.BrocadeVcsDeviceNetworks[0].Id, l.Count, nil
+	}
+
+	if l.Count > 1 {
+		for _, v := range l.BrocadeVcsDeviceNetworks {
+			if v.Name == keyword {
+				return v.Id, l.Count, nil
+			}
+		}
+	}
+	return "", l.Count, fmt.Errorf("Could not find an exact match for %s: %+v", keyword, l)
+}
+
+// lists network that are using a brocade vcs switch
+func (s *BrocadeVCSService) ListBrocadeVcsDeviceNetworks(p *ListBrocadeVcsDeviceNetworksParams) (*ListBrocadeVcsDeviceNetworksResponse, error) {
+	resp, err := s.cs.newRequest("listBrocadeVcsDeviceNetworks", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListBrocadeVcsDeviceNetworksResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListBrocadeVcsDeviceNetworksResponse struct {
+	Count                    int                        `json:"count"`
+	BrocadeVcsDeviceNetworks []*BrocadeVcsDeviceNetwork `json:"brocadevcsdevicenetwork"`
+}
+
+type BrocadeVcsDeviceNetwork struct {
+	Account                     string `json:"account"`
+	Aclid                       string `json:"aclid"`
+	Acltype                     string `json:"acltype"`
+	Broadcastdomaintype         string `json:"broadcastdomaintype"`
+	Broadcasturi                string `json:"broadcasturi"`
+	Canusefordeploy             bool   `json:"canusefordeploy"`
+	Cidr                        string `json:"cidr"`
+	Displaynetwork              bool   `json:"displaynetwork"`
+	Displaytext                 string `json:"displaytext"`
+	Dns1                        string `json:"dns1"`
+	Dns2                        string `json:"dns2"`
+	Domain                      string `json:"domain"`
+	Domainid                    string `json:"domainid"`
+	Gateway                     string `json:"gateway"`
+	Id                          string `json:"id"`
+	Ip6cidr                     string `json:"ip6cidr"`
+	Ip6gateway                  string `json:"ip6gateway"`
+	Isdefault                   bool   `json:"isdefault"`
+	Ispersistent                bool   `json:"ispersistent"`
+	Issystem                    bool   `json:"issystem"`
+	Name                        string `json:"name"`
+	Netmask                     string `json:"netmask"`
+	Networkcidr                 string `json:"networkcidr"`
+	Networkdomain               string `json:"networkdomain"`
+	Networkofferingavailability string `json:"networkofferingavailability"`
+	Networkofferingconservemode bool   `json:"networkofferingconservemode"`
+	Networkofferingdisplaytext  string `json:"networkofferingdisplaytext"`
+	Networkofferingid           string `json:"networkofferingid"`
+	Networkofferingname         string `json:"networkofferingname"`
+	Physicalnetworkid           string `json:"physicalnetworkid"`
+	Project                     string `json:"project"`
+	Projectid                   string `json:"projectid"`
+	Related                     string `json:"related"`
+	Reservediprange             string `json:"reservediprange"`
+	Restartrequired             bool   `json:"restartrequired"`
+	Service                     []struct {
+		Capability []struct {
+			Canchooseservicecapability bool   `json:"canchooseservicecapability"`
+			Name                       string `json:"name"`
+			Value                      string `json:"value"`
+		} `json:"capability"`
+		Name     string `json:"name"`
+		Provider []struct {
+			Canenableindividualservice   bool     `json:"canenableindividualservice"`
+			Destinationphysicalnetworkid string   `json:"destinationphysicalnetworkid"`
+			Id                           string   `json:"id"`
+			Name                         string   `json:"name"`
+			Physicalnetworkid            string   `json:"physicalnetworkid"`
+			Servicelist                  []string `json:"servicelist"`
+			State                        string   `json:"state"`
+		} `json:"provider"`
+	} `json:"service"`
+	Specifyipranges  bool   `json:"specifyipranges"`
+	State            string `json:"state"`
+	Strechedl2subnet bool   `json:"strechedl2subnet"`
+	Subdomainaccess  bool   `json:"subdomainaccess"`
+	Tags             []struct {
+		Account      string `json:"account"`
+		Customer     string `json:"customer"`
+		Domain       string `json:"domain"`
+		Domainid     string `json:"domainid"`
+		Key          string `json:"key"`
+		Project      string `json:"project"`
+		Projectid    string `json:"projectid"`
+		Resourceid   string `json:"resourceid"`
+		Resourcetype string `json:"resourcetype"`
+		Value        string `json:"value"`
+	} `json:"tags"`
+	Traffictype       string        `json:"traffictype"`
+	Type              string        `json:"type"`
+	Vlan              string        `json:"vlan"`
+	Vpcid             string        `json:"vpcid"`
+	Zoneid            string        `json:"zoneid"`
+	Zonename          string        `json:"zonename"`
+	Zonesnetworkspans []interface{} `json:"zonesnetworkspans"`
+}
+
+type ListBrocadeVcsDevicesParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListBrocadeVcsDevicesParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["physicalnetworkid"]; found {
+		u.Set("physicalnetworkid", v.(string))
+	}
+	if v, found := p.p["vcsdeviceid"]; found {
+		u.Set("vcsdeviceid", v.(string))
+	}
+	return u
+}
+
+func (p *ListBrocadeVcsDevicesParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListBrocadeVcsDevicesParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListBrocadeVcsDevicesParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListBrocadeVcsDevicesParams) SetPhysicalnetworkid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["physicalnetworkid"] = v
+	return
+}
+
+func (p *ListBrocadeVcsDevicesParams) SetVcsdeviceid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["vcsdeviceid"] = v
+	return
+}
+
+// You should always use this function to get a new ListBrocadeVcsDevicesParams instance,
+// as then you are sure you have configured all required params
+func (s *BrocadeVCSService) NewListBrocadeVcsDevicesParams() *ListBrocadeVcsDevicesParams {
+	p := &ListBrocadeVcsDevicesParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// Lists Brocade VCS Switches
+func (s *BrocadeVCSService) ListBrocadeVcsDevices(p *ListBrocadeVcsDevicesParams) (*ListBrocadeVcsDevicesResponse, error) {
+	resp, err := s.cs.newRequest("listBrocadeVcsDevices", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListBrocadeVcsDevicesResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListBrocadeVcsDevicesResponse struct {
+	Count             int                 `json:"count"`
+	BrocadeVcsDevices []*BrocadeVcsDevice `json:"brocadevcsdevice"`
+}
+
+type BrocadeVcsDevice struct {
+	Brocadedevicename string `json:"brocadedevicename"`
+	Hostname          string `json:"hostname"`
+	Physicalnetworkid string `json:"physicalnetworkid"`
+	Provider          string `json:"provider"`
+	Vcsdeviceid       string `json:"vcsdeviceid"`
+}
diff --git a/vendor/github.com/xanzy/go-cloudstack/cloudstack/CertificateService.go b/vendor/github.com/xanzy/go-cloudstack/cloudstack/CertificateService.go
new file mode 100644
index 0000000..196b961
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/cloudstack/CertificateService.go
@@ -0,0 +1,141 @@
+//
+// Copyright 2018, Sander van Harmelen
+//
+// Licensed 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 cloudstack
+
+import (
+	"encoding/json"
+	"net/url"
+	"strconv"
+)
+
+type UploadCustomCertificateParams struct {
+	p map[string]interface{}
+}
+
+func (p *UploadCustomCertificateParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["certificate"]; found {
+		u.Set("certificate", v.(string))
+	}
+	if v, found := p.p["domainsuffix"]; found {
+		u.Set("domainsuffix", v.(string))
+	}
+	if v, found := p.p["id"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("id", vv)
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["privatekey"]; found {
+		u.Set("privatekey", v.(string))
+	}
+	return u
+}
+
+func (p *UploadCustomCertificateParams) SetCertificate(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["certificate"] = v
+	return
+}
+
+func (p *UploadCustomCertificateParams) SetDomainsuffix(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainsuffix"] = v
+	return
+}
+
+func (p *UploadCustomCertificateParams) SetId(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *UploadCustomCertificateParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *UploadCustomCertificateParams) SetPrivatekey(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["privatekey"] = v
+	return
+}
+
+// You should always use this function to get a new UploadCustomCertificateParams instance,
+// as then you are sure you have configured all required params
+func (s *CertificateService) NewUploadCustomCertificateParams(certificate string, domainsuffix string) *UploadCustomCertificateParams {
+	p := &UploadCustomCertificateParams{}
+	p.p = make(map[string]interface{})
+	p.p["certificate"] = certificate
+	p.p["domainsuffix"] = domainsuffix
+	return p
+}
+
+// Uploads a custom certificate for the console proxy VMs to use for SSL. Can be used to upload a single certificate signed by a known CA. Can also be used, through multiple calls, to upload a chain of certificates from CA to the custom certificate itself.
+func (s *CertificateService) UploadCustomCertificate(p *UploadCustomCertificateParams) (*UploadCustomCertificateResponse, error) {
+	resp, err := s.cs.newRequest("uploadCustomCertificate", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r UploadCustomCertificateResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type UploadCustomCertificateResponse struct {
+	JobID   string `json:"jobid"`
+	Message string `json:"message"`
+}
diff --git a/vendor/github.com/xanzy/go-cloudstack/cloudstack/CloudIdentifierService.go b/vendor/github.com/xanzy/go-cloudstack/cloudstack/CloudIdentifierService.go
new file mode 100644
index 0000000..40d70aa
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/cloudstack/CloudIdentifierService.go
@@ -0,0 +1,75 @@
+//
+// Copyright 2018, Sander van Harmelen
+//
+// Licensed 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 cloudstack
+
+import (
+	"encoding/json"
+	"net/url"
+)
+
+type GetCloudIdentifierParams struct {
+	p map[string]interface{}
+}
+
+func (p *GetCloudIdentifierParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["userid"]; found {
+		u.Set("userid", v.(string))
+	}
+	return u
+}
+
+func (p *GetCloudIdentifierParams) SetUserid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["userid"] = v
+	return
+}
+
+// You should always use this function to get a new GetCloudIdentifierParams instance,
+// as then you are sure you have configured all required params
+func (s *CloudIdentifierService) NewGetCloudIdentifierParams(userid string) *GetCloudIdentifierParams {
+	p := &GetCloudIdentifierParams{}
+	p.p = make(map[string]interface{})
+	p.p["userid"] = userid
+	return p
+}
+
+// Retrieves a cloud identifier.
+func (s *CloudIdentifierService) GetCloudIdentifier(p *GetCloudIdentifierParams) (*GetCloudIdentifierResponse, error) {
+	resp, err := s.cs.newRequest("getCloudIdentifier", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r GetCloudIdentifierResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type GetCloudIdentifierResponse struct {
+	Cloudidentifier string `json:"cloudidentifier"`
+	Signature       string `json:"signature"`
+	Userid          string `json:"userid"`
+}
diff --git a/vendor/github.com/xanzy/go-cloudstack/cloudstack/ClusterService.go b/vendor/github.com/xanzy/go-cloudstack/cloudstack/ClusterService.go
new file mode 100644
index 0000000..ec4b669
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/cloudstack/ClusterService.go
@@ -0,0 +1,1233 @@
+//
+// Copyright 2018, Sander van Harmelen
+//
+// Licensed 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 cloudstack
+
+import (
+	"encoding/json"
+	"fmt"
+	"net/url"
+	"strconv"
+	"strings"
+)
+
+type AddClusterParams struct {
+	p map[string]interface{}
+}
+
+func (p *AddClusterParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["allocationstate"]; found {
+		u.Set("allocationstate", v.(string))
+	}
+	if v, found := p.p["clustername"]; found {
+		u.Set("clustername", v.(string))
+	}
+	if v, found := p.p["clustertype"]; found {
+		u.Set("clustertype", v.(string))
+	}
+	if v, found := p.p["guestvswitchname"]; found {
+		u.Set("guestvswitchname", v.(string))
+	}
+	if v, found := p.p["guestvswitchtype"]; found {
+		u.Set("guestvswitchtype", v.(string))
+	}
+	if v, found := p.p["hypervisor"]; found {
+		u.Set("hypervisor", v.(string))
+	}
+	if v, found := p.p["ovm3cluster"]; found {
+		u.Set("ovm3cluster", v.(string))
+	}
+	if v, found := p.p["ovm3pool"]; found {
+		u.Set("ovm3pool", v.(string))
+	}
+	if v, found := p.p["ovm3vip"]; found {
+		u.Set("ovm3vip", v.(string))
+	}
+	if v, found := p.p["password"]; found {
+		u.Set("password", v.(string))
+	}
+	if v, found := p.p["podid"]; found {
+		u.Set("podid", v.(string))
+	}
+	if v, found := p.p["publicvswitchname"]; found {
+		u.Set("publicvswitchname", v.(string))
+	}
+	if v, found := p.p["publicvswitchtype"]; found {
+		u.Set("publicvswitchtype", v.(string))
+	}
+	if v, found := p.p["url"]; found {
+		u.Set("url", v.(string))
+	}
+	if v, found := p.p["username"]; found {
+		u.Set("username", v.(string))
+	}
+	if v, found := p.p["vsmipaddress"]; found {
+		u.Set("vsmipaddress", v.(string))
+	}
+	if v, found := p.p["vsmpassword"]; found {
+		u.Set("vsmpassword", v.(string))
+	}
+	if v, found := p.p["vsmusername"]; found {
+		u.Set("vsmusername", v.(string))
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *AddClusterParams) SetAllocationstate(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["allocationstate"] = v
+	return
+}
+
+func (p *AddClusterParams) SetClustername(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["clustername"] = v
+	return
+}
+
+func (p *AddClusterParams) SetClustertype(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["clustertype"] = v
+	return
+}
+
+func (p *AddClusterParams) SetGuestvswitchname(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["guestvswitchname"] = v
+	return
+}
+
+func (p *AddClusterParams) SetGuestvswitchtype(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["guestvswitchtype"] = v
+	return
+}
+
+func (p *AddClusterParams) SetHypervisor(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["hypervisor"] = v
+	return
+}
+
+func (p *AddClusterParams) SetOvm3cluster(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["ovm3cluster"] = v
+	return
+}
+
+func (p *AddClusterParams) SetOvm3pool(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["ovm3pool"] = v
+	return
+}
+
+func (p *AddClusterParams) SetOvm3vip(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["ovm3vip"] = v
+	return
+}
+
+func (p *AddClusterParams) SetPassword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["password"] = v
+	return
+}
+
+func (p *AddClusterParams) SetPodid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["podid"] = v
+	return
+}
+
+func (p *AddClusterParams) SetPublicvswitchname(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["publicvswitchname"] = v
+	return
+}
+
+func (p *AddClusterParams) SetPublicvswitchtype(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["publicvswitchtype"] = v
+	return
+}
+
+func (p *AddClusterParams) SetUrl(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["url"] = v
+	return
+}
+
+func (p *AddClusterParams) SetUsername(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["username"] = v
+	return
+}
+
+func (p *AddClusterParams) SetVsmipaddress(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["vsmipaddress"] = v
+	return
+}
+
+func (p *AddClusterParams) SetVsmpassword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["vsmpassword"] = v
+	return
+}
+
+func (p *AddClusterParams) SetVsmusername(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["vsmusername"] = v
+	return
+}
+
+func (p *AddClusterParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new AddClusterParams instance,
+// as then you are sure you have configured all required params
+func (s *ClusterService) NewAddClusterParams(clustername string, clustertype string, hypervisor string, podid string, zoneid string) *AddClusterParams {
+	p := &AddClusterParams{}
+	p.p = make(map[string]interface{})
+	p.p["clustername"] = clustername
+	p.p["clustertype"] = clustertype
+	p.p["hypervisor"] = hypervisor
+	p.p["podid"] = podid
+	p.p["zoneid"] = zoneid
+	return p
+}
+
+// Adds a new cluster
+func (s *ClusterService) AddCluster(p *AddClusterParams) (*AddClusterResponse, error) {
+	resp, err := s.cs.newRequest("addCluster", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r AddClusterResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type AddClusterResponse struct {
+	Allocationstate string `json:"allocationstate"`
+	Capacity        []struct {
+		Capacitytotal int64  `json:"capacitytotal"`
+		Capacityused  int64  `json:"capacityused"`
+		Clusterid     string `json:"clusterid"`
+		Clustername   string `json:"clustername"`
+		Percentused   string `json:"percentused"`
+		Podid         string `json:"podid"`
+		Podname       string `json:"podname"`
+		Type          int    `json:"type"`
+		Zoneid        string `json:"zoneid"`
+		Zonename      string `json:"zonename"`
+	} `json:"capacity"`
+	Clustertype           string            `json:"clustertype"`
+	Cpuovercommitratio    string            `json:"cpuovercommitratio"`
+	Hypervisortype        string            `json:"hypervisortype"`
+	Id                    string            `json:"id"`
+	Managedstate          string            `json:"managedstate"`
+	Memoryovercommitratio string            `json:"memoryovercommitratio"`
+	Name                  string            `json:"name"`
+	Ovm3vip               string            `json:"ovm3vip"`
+	Podid                 string            `json:"podid"`
+	Podname               string            `json:"podname"`
+	Resourcedetails       map[string]string `json:"resourcedetails"`
+	Zoneid                string            `json:"zoneid"`
+	Zonename              string            `json:"zonename"`
+}
+
+type DedicateClusterParams struct {
+	p map[string]interface{}
+}
+
+func (p *DedicateClusterParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["clusterid"]; found {
+		u.Set("clusterid", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	return u
+}
+
+func (p *DedicateClusterParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *DedicateClusterParams) SetClusterid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["clusterid"] = v
+	return
+}
+
+func (p *DedicateClusterParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+// You should always use this function to get a new DedicateClusterParams instance,
+// as then you are sure you have configured all required params
+func (s *ClusterService) NewDedicateClusterParams(clusterid string, domainid string) *DedicateClusterParams {
+	p := &DedicateClusterParams{}
+	p.p = make(map[string]interface{})
+	p.p["clusterid"] = clusterid
+	p.p["domainid"] = domainid
+	return p
+}
+
+// Dedicate an existing cluster
+func (s *ClusterService) DedicateCluster(p *DedicateClusterParams) (*DedicateClusterResponse, error) {
+	resp, err := s.cs.newRequest("dedicateCluster", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DedicateClusterResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type DedicateClusterResponse struct {
+	JobID           string `json:"jobid"`
+	Accountid       string `json:"accountid"`
+	Affinitygroupid string `json:"affinitygroupid"`
+	Clusterid       string `json:"clusterid"`
+	Clustername     string `json:"clustername"`
+	Domainid        string `json:"domainid"`
+	Id              string `json:"id"`
+}
+
+type DeleteClusterParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeleteClusterParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *DeleteClusterParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new DeleteClusterParams instance,
+// as then you are sure you have configured all required params
+func (s *ClusterService) NewDeleteClusterParams(id string) *DeleteClusterParams {
+	p := &DeleteClusterParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Deletes a cluster.
+func (s *ClusterService) DeleteCluster(p *DeleteClusterParams) (*DeleteClusterResponse, error) {
+	resp, err := s.cs.newRequest("deleteCluster", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeleteClusterResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type DeleteClusterResponse struct {
+	Displaytext string `json:"displaytext"`
+	Success     string `json:"success"`
+}
+
+type DisableOutOfBandManagementForClusterParams struct {
+	p map[string]interface{}
+}
+
+func (p *DisableOutOfBandManagementForClusterParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["clusterid"]; found {
+		u.Set("clusterid", v.(string))
+	}
+	return u
+}
+
+func (p *DisableOutOfBandManagementForClusterParams) SetClusterid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["clusterid"] = v
+	return
+}
+
+// You should always use this function to get a new DisableOutOfBandManagementForClusterParams instance,
+// as then you are sure you have configured all required params
+func (s *ClusterService) NewDisableOutOfBandManagementForClusterParams(clusterid string) *DisableOutOfBandManagementForClusterParams {
+	p := &DisableOutOfBandManagementForClusterParams{}
+	p.p = make(map[string]interface{})
+	p.p["clusterid"] = clusterid
+	return p
+}
+
+// Disables out-of-band management for a cluster
+func (s *ClusterService) DisableOutOfBandManagementForCluster(p *DisableOutOfBandManagementForClusterParams) (*DisableOutOfBandManagementForClusterResponse, error) {
+	resp, err := s.cs.newRequest("disableOutOfBandManagementForCluster", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DisableOutOfBandManagementForClusterResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type DisableOutOfBandManagementForClusterResponse struct {
+	JobID       string `json:"jobid"`
+	Action      string `json:"action"`
+	Address     string `json:"address"`
+	Description string `json:"description"`
+	Driver      string `json:"driver"`
+	Enabled     bool   `json:"enabled"`
+	Hostid      string `json:"hostid"`
+	Password    string `json:"password"`
+	Port        string `json:"port"`
+	Powerstate  string `json:"powerstate"`
+	Status      bool   `json:"status"`
+	Username    string `json:"username"`
+}
+
+type EnableOutOfBandManagementForClusterParams struct {
+	p map[string]interface{}
+}
+
+func (p *EnableOutOfBandManagementForClusterParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["clusterid"]; found {
+		u.Set("clusterid", v.(string))
+	}
+	return u
+}
+
+func (p *EnableOutOfBandManagementForClusterParams) SetClusterid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["clusterid"] = v
+	return
+}
+
+// You should always use this function to get a new EnableOutOfBandManagementForClusterParams instance,
+// as then you are sure you have configured all required params
+func (s *ClusterService) NewEnableOutOfBandManagementForClusterParams(clusterid string) *EnableOutOfBandManagementForClusterParams {
+	p := &EnableOutOfBandManagementForClusterParams{}
+	p.p = make(map[string]interface{})
+	p.p["clusterid"] = clusterid
+	return p
+}
+
+// Enables out-of-band management for a cluster
+func (s *ClusterService) EnableOutOfBandManagementForCluster(p *EnableOutOfBandManagementForClusterParams) (*EnableOutOfBandManagementForClusterResponse, error) {
+	resp, err := s.cs.newRequest("enableOutOfBandManagementForCluster", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r EnableOutOfBandManagementForClusterResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type EnableOutOfBandManagementForClusterResponse struct {
+	JobID       string `json:"jobid"`
+	Action      string `json:"action"`
+	Address     string `json:"address"`
+	Description string `json:"description"`
+	Driver      string `json:"driver"`
+	Enabled     bool   `json:"enabled"`
+	Hostid      string `json:"hostid"`
+	Password    string `json:"password"`
+	Port        string `json:"port"`
+	Powerstate  string `json:"powerstate"`
+	Status      bool   `json:"status"`
+	Username    string `json:"username"`
+}
+
+type ListClustersParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListClustersParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["allocationstate"]; found {
+		u.Set("allocationstate", v.(string))
+	}
+	if v, found := p.p["clustertype"]; found {
+		u.Set("clustertype", v.(string))
+	}
+	if v, found := p.p["hypervisor"]; found {
+		u.Set("hypervisor", v.(string))
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["managedstate"]; found {
+		u.Set("managedstate", v.(string))
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["podid"]; found {
+		u.Set("podid", v.(string))
+	}
+	if v, found := p.p["showcapacities"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("showcapacities", vv)
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *ListClustersParams) SetAllocationstate(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["allocationstate"] = v
+	return
+}
+
+func (p *ListClustersParams) SetClustertype(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["clustertype"] = v
+	return
+}
+
+func (p *ListClustersParams) SetHypervisor(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["hypervisor"] = v
+	return
+}
+
+func (p *ListClustersParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ListClustersParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListClustersParams) SetManagedstate(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["managedstate"] = v
+	return
+}
+
+func (p *ListClustersParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *ListClustersParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListClustersParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListClustersParams) SetPodid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["podid"] = v
+	return
+}
+
+func (p *ListClustersParams) SetShowcapacities(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["showcapacities"] = v
+	return
+}
+
+func (p *ListClustersParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new ListClustersParams instance,
+// as then you are sure you have configured all required params
+func (s *ClusterService) NewListClustersParams() *ListClustersParams {
+	p := &ListClustersParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *ClusterService) GetClusterID(name string, opts ...OptionFunc) (string, int, error) {
+	p := &ListClustersParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["name"] = name
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return "", -1, err
+		}
+	}
+
+	l, err := s.ListClusters(p)
+	if err != nil {
+		return "", -1, err
+	}
+
+	if l.Count == 0 {
+		return "", l.Count, fmt.Errorf("No match found for %s: %+v", name, l)
+	}
+
+	if l.Count == 1 {
+		return l.Clusters[0].Id, l.Count, nil
+	}
+
+	if l.Count > 1 {
+		for _, v := range l.Clusters {
+			if v.Name == name {
+				return v.Id, l.Count, nil
+			}
+		}
+	}
+	return "", l.Count, fmt.Errorf("Could not find an exact match for %s: %+v", name, l)
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *ClusterService) GetClusterByName(name string, opts ...OptionFunc) (*Cluster, int, error) {
+	id, count, err := s.GetClusterID(name, opts...)
+	if err != nil {
+		return nil, count, err
+	}
+
+	r, count, err := s.GetClusterByID(id, opts...)
+	if err != nil {
+		return nil, count, err
+	}
+	return r, count, nil
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *ClusterService) GetClusterByID(id string, opts ...OptionFunc) (*Cluster, int, error) {
+	p := &ListClustersParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["id"] = id
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return nil, -1, err
+		}
+	}
+
+	l, err := s.ListClusters(p)
+	if err != nil {
+		if strings.Contains(err.Error(), fmt.Sprintf(
+			"Invalid parameter id value=%s due to incorrect long value format, "+
+				"or entity does not exist", id)) {
+			return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
+		}
+		return nil, -1, err
+	}
+
+	if l.Count == 0 {
+		return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
+	}
+
+	if l.Count == 1 {
+		return l.Clusters[0], l.Count, nil
+	}
+	return nil, l.Count, fmt.Errorf("There is more then one result for Cluster UUID: %s!", id)
+}
+
+// Lists clusters.
+func (s *ClusterService) ListClusters(p *ListClustersParams) (*ListClustersResponse, error) {
+	resp, err := s.cs.newRequest("listClusters", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListClustersResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListClustersResponse struct {
+	Count    int        `json:"count"`
+	Clusters []*Cluster `json:"cluster"`
+}
+
+type Cluster struct {
+	Allocationstate string `json:"allocationstate"`
+	Capacity        []struct {
+		Capacitytotal int64  `json:"capacitytotal"`
+		Capacityused  int64  `json:"capacityused"`
+		Clusterid     string `json:"clusterid"`
+		Clustername   string `json:"clustername"`
+		Percentused   string `json:"percentused"`
+		Podid         string `json:"podid"`
+		Podname       string `json:"podname"`
+		Type          int    `json:"type"`
+		Zoneid        string `json:"zoneid"`
+		Zonename      string `json:"zonename"`
+	} `json:"capacity"`
+	Clustertype           string            `json:"clustertype"`
+	Cpuovercommitratio    string            `json:"cpuovercommitratio"`
+	Hypervisortype        string            `json:"hypervisortype"`
+	Id                    string            `json:"id"`
+	Managedstate          string            `json:"managedstate"`
+	Memoryovercommitratio string            `json:"memoryovercommitratio"`
+	Name                  string            `json:"name"`
+	Ovm3vip               string            `json:"ovm3vip"`
+	Podid                 string            `json:"podid"`
+	Podname               string            `json:"podname"`
+	Resourcedetails       map[string]string `json:"resourcedetails"`
+	Zoneid                string            `json:"zoneid"`
+	Zonename              string            `json:"zonename"`
+}
+
+type ListDedicatedClustersParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListDedicatedClustersParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["affinitygroupid"]; found {
+		u.Set("affinitygroupid", v.(string))
+	}
+	if v, found := p.p["clusterid"]; found {
+		u.Set("clusterid", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	return u
+}
+
+func (p *ListDedicatedClustersParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *ListDedicatedClustersParams) SetAffinitygroupid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["affinitygroupid"] = v
+	return
+}
+
+func (p *ListDedicatedClustersParams) SetClusterid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["clusterid"] = v
+	return
+}
+
+func (p *ListDedicatedClustersParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *ListDedicatedClustersParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListDedicatedClustersParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListDedicatedClustersParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+// You should always use this function to get a new ListDedicatedClustersParams instance,
+// as then you are sure you have configured all required params
+func (s *ClusterService) NewListDedicatedClustersParams() *ListDedicatedClustersParams {
+	p := &ListDedicatedClustersParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// Lists dedicated clusters.
+func (s *ClusterService) ListDedicatedClusters(p *ListDedicatedClustersParams) (*ListDedicatedClustersResponse, error) {
+	resp, err := s.cs.newRequest("listDedicatedClusters", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListDedicatedClustersResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListDedicatedClustersResponse struct {
+	Count             int                 `json:"count"`
+	DedicatedClusters []*DedicatedCluster `json:"dedicatedcluster"`
+}
+
+type DedicatedCluster struct {
+	Accountid       string `json:"accountid"`
+	Affinitygroupid string `json:"affinitygroupid"`
+	Clusterid       string `json:"clusterid"`
+	Clustername     string `json:"clustername"`
+	Domainid        string `json:"domainid"`
+	Id              string `json:"id"`
+}
+
+type ReleaseDedicatedClusterParams struct {
+	p map[string]interface{}
+}
+
+func (p *ReleaseDedicatedClusterParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["clusterid"]; found {
+		u.Set("clusterid", v.(string))
+	}
+	return u
+}
+
+func (p *ReleaseDedicatedClusterParams) SetClusterid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["clusterid"] = v
+	return
+}
+
+// You should always use this function to get a new ReleaseDedicatedClusterParams instance,
+// as then you are sure you have configured all required params
+func (s *ClusterService) NewReleaseDedicatedClusterParams(clusterid string) *ReleaseDedicatedClusterParams {
+	p := &ReleaseDedicatedClusterParams{}
+	p.p = make(map[string]interface{})
+	p.p["clusterid"] = clusterid
+	return p
+}
+
+// Release the dedication for cluster
+func (s *ClusterService) ReleaseDedicatedCluster(p *ReleaseDedicatedClusterParams) (*ReleaseDedicatedClusterResponse, error) {
+	resp, err := s.cs.newRequest("releaseDedicatedCluster", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ReleaseDedicatedClusterResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type ReleaseDedicatedClusterResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
+
+type UpdateClusterParams struct {
+	p map[string]interface{}
+}
+
+func (p *UpdateClusterParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["allocationstate"]; found {
+		u.Set("allocationstate", v.(string))
+	}
+	if v, found := p.p["clustername"]; found {
+		u.Set("clustername", v.(string))
+	}
+	if v, found := p.p["clustertype"]; found {
+		u.Set("clustertype", v.(string))
+	}
+	if v, found := p.p["hypervisor"]; found {
+		u.Set("hypervisor", v.(string))
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["managedstate"]; found {
+		u.Set("managedstate", v.(string))
+	}
+	return u
+}
+
+func (p *UpdateClusterParams) SetAllocationstate(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["allocationstate"] = v
+	return
+}
+
+func (p *UpdateClusterParams) SetClustername(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["clustername"] = v
+	return
+}
+
+func (p *UpdateClusterParams) SetClustertype(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["clustertype"] = v
+	return
+}
+
+func (p *UpdateClusterParams) SetHypervisor(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["hypervisor"] = v
+	return
+}
+
+func (p *UpdateClusterParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *UpdateClusterParams) SetManagedstate(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["managedstate"] = v
+	return
+}
+
+// You should always use this function to get a new UpdateClusterParams instance,
+// as then you are sure you have configured all required params
+func (s *ClusterService) NewUpdateClusterParams(id string) *UpdateClusterParams {
+	p := &UpdateClusterParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Updates an existing cluster
+func (s *ClusterService) UpdateCluster(p *UpdateClusterParams) (*UpdateClusterResponse, error) {
+	resp, err := s.cs.newRequest("updateCluster", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r UpdateClusterResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type UpdateClusterResponse struct {
+	Allocationstate string `json:"allocationstate"`
+	Capacity        []struct {
+		Capacitytotal int64  `json:"capacitytotal"`
+		Capacityused  int64  `json:"capacityused"`
+		Clusterid     string `json:"clusterid"`
+		Clustername   string `json:"clustername"`
+		Percentused   string `json:"percentused"`
+		Podid         string `json:"podid"`
+		Podname       string `json:"podname"`
+		Type          int    `json:"type"`
+		Zoneid        string `json:"zoneid"`
+		Zonename      string `json:"zonename"`
+	} `json:"capacity"`
+	Clustertype           string            `json:"clustertype"`
+	Cpuovercommitratio    string            `json:"cpuovercommitratio"`
+	Hypervisortype        string            `json:"hypervisortype"`
+	Id                    string            `json:"id"`
+	Managedstate          string            `json:"managedstate"`
+	Memoryovercommitratio string            `json:"memoryovercommitratio"`
+	Name                  string            `json:"name"`
+	Ovm3vip               string            `json:"ovm3vip"`
+	Podid                 string            `json:"podid"`
+	Podname               string            `json:"podname"`
+	Resourcedetails       map[string]string `json:"resourcedetails"`
+	Zoneid                string            `json:"zoneid"`
+	Zonename              string            `json:"zonename"`
+}
diff --git a/vendor/github.com/xanzy/go-cloudstack/cloudstack/ConfigurationService.go b/vendor/github.com/xanzy/go-cloudstack/cloudstack/ConfigurationService.go
new file mode 100644
index 0000000..7df900b
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/cloudstack/ConfigurationService.go
@@ -0,0 +1,421 @@
+//
+// Copyright 2018, Sander van Harmelen
+//
+// Licensed 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 cloudstack
+
+import (
+	"encoding/json"
+	"net/url"
+	"strconv"
+)
+
+type ListCapabilitiesParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListCapabilitiesParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	return u
+}
+
+// You should always use this function to get a new ListCapabilitiesParams instance,
+// as then you are sure you have configured all required params
+func (s *ConfigurationService) NewListCapabilitiesParams() *ListCapabilitiesParams {
+	p := &ListCapabilitiesParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// Lists capabilities
+func (s *ConfigurationService) ListCapabilities(p *ListCapabilitiesParams) (*ListCapabilitiesResponse, error) {
+	resp, err := s.cs.newRequest("listCapabilities", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListCapabilitiesResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListCapabilitiesResponse struct {
+	Count        int           `json:"count"`
+	Capabilities []*Capability `json:"capability"`
+}
+
+type Capability struct {
+	Allowusercreateprojects   bool   `json:"allowusercreateprojects"`
+	Allowuserexpungerecovervm bool   `json:"allowuserexpungerecovervm"`
+	Allowuserviewdestroyedvm  bool   `json:"allowuserviewdestroyedvm"`
+	Apilimitinterval          int    `json:"apilimitinterval"`
+	Apilimitmax               int    `json:"apilimitmax"`
+	Cloudstackversion         string `json:"cloudstackversion"`
+	Customdiskofferingmaxsize int64  `json:"customdiskofferingmaxsize"`
+	Customdiskofferingminsize int64  `json:"customdiskofferingminsize"`
+	Dynamicrolesenabled       bool   `json:"dynamicrolesenabled"`
+	Kvmsnapshotenabled        bool   `json:"kvmsnapshotenabled"`
+	Projectinviterequired     bool   `json:"projectinviterequired"`
+	Regionsecondaryenabled    bool   `json:"regionsecondaryenabled"`
+	Securitygroupsenabled     bool   `json:"securitygroupsenabled"`
+	SupportELB                string `json:"supportELB"`
+	Userpublictemplateenabled bool   `json:"userpublictemplateenabled"`
+}
+
+type ListConfigurationsParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListConfigurationsParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["accountid"]; found {
+		u.Set("accountid", v.(string))
+	}
+	if v, found := p.p["category"]; found {
+		u.Set("category", v.(string))
+	}
+	if v, found := p.p["clusterid"]; found {
+		u.Set("clusterid", v.(string))
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["storageid"]; found {
+		u.Set("storageid", v.(string))
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *ListConfigurationsParams) SetAccountid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["accountid"] = v
+	return
+}
+
+func (p *ListConfigurationsParams) SetCategory(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["category"] = v
+	return
+}
+
+func (p *ListConfigurationsParams) SetClusterid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["clusterid"] = v
+	return
+}
+
+func (p *ListConfigurationsParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListConfigurationsParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *ListConfigurationsParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListConfigurationsParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListConfigurationsParams) SetStorageid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["storageid"] = v
+	return
+}
+
+func (p *ListConfigurationsParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new ListConfigurationsParams instance,
+// as then you are sure you have configured all required params
+func (s *ConfigurationService) NewListConfigurationsParams() *ListConfigurationsParams {
+	p := &ListConfigurationsParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// Lists all configurations.
+func (s *ConfigurationService) ListConfigurations(p *ListConfigurationsParams) (*ListConfigurationsResponse, error) {
+	resp, err := s.cs.newRequest("listConfigurations", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListConfigurationsResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListConfigurationsResponse struct {
+	Count          int              `json:"count"`
+	Configurations []*Configuration `json:"configuration"`
+}
+
+type Configuration struct {
+	Category    string `json:"category"`
+	Description string `json:"description"`
+	Id          int64  `json:"id"`
+	Name        string `json:"name"`
+	Scope       string `json:"scope"`
+	Value       string `json:"value"`
+}
+
+type ListDeploymentPlannersParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListDeploymentPlannersParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	return u
+}
+
+func (p *ListDeploymentPlannersParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListDeploymentPlannersParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListDeploymentPlannersParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+// You should always use this function to get a new ListDeploymentPlannersParams instance,
+// as then you are sure you have configured all required params
+func (s *ConfigurationService) NewListDeploymentPlannersParams() *ListDeploymentPlannersParams {
+	p := &ListDeploymentPlannersParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// Lists all DeploymentPlanners available.
+func (s *ConfigurationService) ListDeploymentPlanners(p *ListDeploymentPlannersParams) (*ListDeploymentPlannersResponse, error) {
+	resp, err := s.cs.newRequest("listDeploymentPlanners", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListDeploymentPlannersResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListDeploymentPlannersResponse struct {
+	Count              int                  `json:"count"`
+	DeploymentPlanners []*DeploymentPlanner `json:"deploymentplanner"`
+}
+
+type DeploymentPlanner struct {
+	Name string `json:"name"`
+}
+
+type UpdateConfigurationParams struct {
+	p map[string]interface{}
+}
+
+func (p *UpdateConfigurationParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["accountid"]; found {
+		u.Set("accountid", v.(string))
+	}
+	if v, found := p.p["clusterid"]; found {
+		u.Set("clusterid", v.(string))
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["storageid"]; found {
+		u.Set("storageid", v.(string))
+	}
+	if v, found := p.p["value"]; found {
+		u.Set("value", v.(string))
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *UpdateConfigurationParams) SetAccountid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["accountid"] = v
+	return
+}
+
+func (p *UpdateConfigurationParams) SetClusterid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["clusterid"] = v
+	return
+}
+
+func (p *UpdateConfigurationParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *UpdateConfigurationParams) SetStorageid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["storageid"] = v
+	return
+}
+
+func (p *UpdateConfigurationParams) SetValue(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["value"] = v
+	return
+}
+
+func (p *UpdateConfigurationParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new UpdateConfigurationParams instance,
+// as then you are sure you have configured all required params
+func (s *ConfigurationService) NewUpdateConfigurationParams(name string) *UpdateConfigurationParams {
+	p := &UpdateConfigurationParams{}
+	p.p = make(map[string]interface{})
+	p.p["name"] = name
+	return p
+}
+
+// Updates a configuration.
+func (s *ConfigurationService) UpdateConfiguration(p *UpdateConfigurationParams) (*UpdateConfigurationResponse, error) {
+	resp, err := s.cs.newRequest("updateConfiguration", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r UpdateConfigurationResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type UpdateConfigurationResponse struct {
+	Category    string `json:"category"`
+	Description string `json:"description"`
+	Id          int64  `json:"id"`
+	Name        string `json:"name"`
+	Scope       string `json:"scope"`
+	Value       string `json:"value"`
+}
diff --git a/vendor/github.com/xanzy/go-cloudstack/cloudstack/CustomService.go b/vendor/github.com/xanzy/go-cloudstack/cloudstack/CustomService.go
new file mode 100644
index 0000000..5e5c3b4
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/cloudstack/CustomService.go
@@ -0,0 +1,77 @@
+//
+// Copyright 2018, Sander van Harmelen
+//
+// Licensed 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 cloudstack
+
+import (
+	"encoding/json"
+	"fmt"
+	"net/url"
+	"strconv"
+	"strings"
+)
+
+type CustomServiceParams struct {
+	p map[string]interface{}
+}
+
+func (p *CustomServiceParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+
+	for k, v := range p.p {
+		switch t := v.(type) {
+		case bool:
+			u.Set(k, strconv.FormatBool(t))
+		case int:
+			u.Set(k, strconv.Itoa(t))
+		case int64:
+			vv := strconv.FormatInt(t, 10)
+			u.Set(k, vv)
+		case string:
+			u.Set(k, t)
+		case []string:
+			u.Set(k, strings.Join(t, ", "))
+		case map[string]string:
+			i := 0
+			for kk, vv := range t {
+				u.Set(fmt.Sprintf("%s[%d].%s", k, i, kk), vv)
+				i++
+			}
+		}
+	}
+
+	return u
+}
+
+func (p *CustomServiceParams) SetParam(param string, v interface{}) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p[param] = v
+	return
+}
+
+func (s *CustomService) CustomRequest(api string, p *CustomServiceParams, result interface{}) error {
+	resp, err := s.cs.newRequest(api, p.toURLValues())
+	if err != nil {
+		return err
+	}
+
+	return json.Unmarshal(resp, result)
+}
diff --git a/vendor/github.com/xanzy/go-cloudstack/cloudstack/DiskOfferingService.go b/vendor/github.com/xanzy/go-cloudstack/cloudstack/DiskOfferingService.go
new file mode 100644
index 0000000..efd5042
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/cloudstack/DiskOfferingService.go
@@ -0,0 +1,692 @@
+//
+// Copyright 2018, Sander van Harmelen
+//
+// Licensed 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 cloudstack
+
+import (
+	"encoding/json"
+	"fmt"
+	"net/url"
+	"strconv"
+	"strings"
+)
+
+type CreateDiskOfferingParams struct {
+	p map[string]interface{}
+}
+
+func (p *CreateDiskOfferingParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["bytesreadrate"]; found {
+		vv := strconv.FormatInt(v.(int64), 10)
+		u.Set("bytesreadrate", vv)
+	}
+	if v, found := p.p["byteswriterate"]; found {
+		vv := strconv.FormatInt(v.(int64), 10)
+		u.Set("byteswriterate", vv)
+	}
+	if v, found := p.p["customized"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("customized", vv)
+	}
+	if v, found := p.p["customizediops"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("customizediops", vv)
+	}
+	if v, found := p.p["disksize"]; found {
+		vv := strconv.FormatInt(v.(int64), 10)
+		u.Set("disksize", vv)
+	}
+	if v, found := p.p["displayoffering"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("displayoffering", vv)
+	}
+	if v, found := p.p["displaytext"]; found {
+		u.Set("displaytext", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["hypervisorsnapshotreserve"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("hypervisorsnapshotreserve", vv)
+	}
+	if v, found := p.p["iopsreadrate"]; found {
+		vv := strconv.FormatInt(v.(int64), 10)
+		u.Set("iopsreadrate", vv)
+	}
+	if v, found := p.p["iopswriterate"]; found {
+		vv := strconv.FormatInt(v.(int64), 10)
+		u.Set("iopswriterate", vv)
+	}
+	if v, found := p.p["maxiops"]; found {
+		vv := strconv.FormatInt(v.(int64), 10)
+		u.Set("maxiops", vv)
+	}
+	if v, found := p.p["miniops"]; found {
+		vv := strconv.FormatInt(v.(int64), 10)
+		u.Set("miniops", vv)
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["provisioningtype"]; found {
+		u.Set("provisioningtype", v.(string))
+	}
+	if v, found := p.p["storagetype"]; found {
+		u.Set("storagetype", v.(string))
+	}
+	if v, found := p.p["tags"]; found {
+		u.Set("tags", v.(string))
+	}
+	return u
+}
+
+func (p *CreateDiskOfferingParams) SetBytesreadrate(v int64) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["bytesreadrate"] = v
+	return
+}
+
+func (p *CreateDiskOfferingParams) SetByteswriterate(v int64) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["byteswriterate"] = v
+	return
+}
+
+func (p *CreateDiskOfferingParams) SetCustomized(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["customized"] = v
+	return
+}
+
+func (p *CreateDiskOfferingParams) SetCustomizediops(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["customizediops"] = v
+	return
+}
+
+func (p *CreateDiskOfferingParams) SetDisksize(v int64) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["disksize"] = v
+	return
+}
+
+func (p *CreateDiskOfferingParams) SetDisplayoffering(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["displayoffering"] = v
+	return
+}
+
+func (p *CreateDiskOfferingParams) SetDisplaytext(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["displaytext"] = v
+	return
+}
+
+func (p *CreateDiskOfferingParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *CreateDiskOfferingParams) SetHypervisorsnapshotreserve(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["hypervisorsnapshotreserve"] = v
+	return
+}
+
+func (p *CreateDiskOfferingParams) SetIopsreadrate(v int64) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["iopsreadrate"] = v
+	return
+}
+
+func (p *CreateDiskOfferingParams) SetIopswriterate(v int64) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["iopswriterate"] = v
+	return
+}
+
+func (p *CreateDiskOfferingParams) SetMaxiops(v int64) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["maxiops"] = v
+	return
+}
+
+func (p *CreateDiskOfferingParams) SetMiniops(v int64) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["miniops"] = v
+	return
+}
+
+func (p *CreateDiskOfferingParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *CreateDiskOfferingParams) SetProvisioningtype(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["provisioningtype"] = v
+	return
+}
+
+func (p *CreateDiskOfferingParams) SetStoragetype(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["storagetype"] = v
+	return
+}
+
+func (p *CreateDiskOfferingParams) SetTags(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["tags"] = v
+	return
+}
+
+// You should always use this function to get a new CreateDiskOfferingParams instance,
+// as then you are sure you have configured all required params
+func (s *DiskOfferingService) NewCreateDiskOfferingParams(displaytext string, name string) *CreateDiskOfferingParams {
+	p := &CreateDiskOfferingParams{}
+	p.p = make(map[string]interface{})
+	p.p["displaytext"] = displaytext
+	p.p["name"] = name
+	return p
+}
+
+// Creates a disk offering.
+func (s *DiskOfferingService) CreateDiskOffering(p *CreateDiskOfferingParams) (*CreateDiskOfferingResponse, error) {
+	resp, err := s.cs.newRequest("createDiskOffering", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r CreateDiskOfferingResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type CreateDiskOfferingResponse struct {
+	CacheMode                 string `json:"cacheMode"`
+	Created                   string `json:"created"`
+	DiskBytesReadRate         int64  `json:"diskBytesReadRate"`
+	DiskBytesWriteRate        int64  `json:"diskBytesWriteRate"`
+	DiskIopsReadRate          int64  `json:"diskIopsReadRate"`
+	DiskIopsWriteRate         int64  `json:"diskIopsWriteRate"`
+	Disksize                  int64  `json:"disksize"`
+	Displayoffering           bool   `json:"displayoffering"`
+	Displaytext               string `json:"displaytext"`
+	Domain                    string `json:"domain"`
+	Domainid                  string `json:"domainid"`
+	Hypervisorsnapshotreserve int    `json:"hypervisorsnapshotreserve"`
+	Id                        string `json:"id"`
+	Iscustomized              bool   `json:"iscustomized"`
+	Iscustomizediops          bool   `json:"iscustomizediops"`
+	Maxiops                   int64  `json:"maxiops"`
+	Miniops                   int64  `json:"miniops"`
+	Name                      string `json:"name"`
+	Provisioningtype          string `json:"provisioningtype"`
+	Storagetype               string `json:"storagetype"`
+	Tags                      string `json:"tags"`
+}
+
+type DeleteDiskOfferingParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeleteDiskOfferingParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *DeleteDiskOfferingParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new DeleteDiskOfferingParams instance,
+// as then you are sure you have configured all required params
+func (s *DiskOfferingService) NewDeleteDiskOfferingParams(id string) *DeleteDiskOfferingParams {
+	p := &DeleteDiskOfferingParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Updates a disk offering.
+func (s *DiskOfferingService) DeleteDiskOffering(p *DeleteDiskOfferingParams) (*DeleteDiskOfferingResponse, error) {
+	resp, err := s.cs.newRequest("deleteDiskOffering", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeleteDiskOfferingResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type DeleteDiskOfferingResponse struct {
+	Displaytext string `json:"displaytext"`
+	Success     string `json:"success"`
+}
+
+type ListDiskOfferingsParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListDiskOfferingsParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["isrecursive"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("isrecursive", vv)
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["listall"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("listall", vv)
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	return u
+}
+
+func (p *ListDiskOfferingsParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *ListDiskOfferingsParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ListDiskOfferingsParams) SetIsrecursive(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isrecursive"] = v
+	return
+}
+
+func (p *ListDiskOfferingsParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListDiskOfferingsParams) SetListall(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["listall"] = v
+	return
+}
+
+func (p *ListDiskOfferingsParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *ListDiskOfferingsParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListDiskOfferingsParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+// You should always use this function to get a new ListDiskOfferingsParams instance,
+// as then you are sure you have configured all required params
+func (s *DiskOfferingService) NewListDiskOfferingsParams() *ListDiskOfferingsParams {
+	p := &ListDiskOfferingsParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *DiskOfferingService) GetDiskOfferingID(name string, opts ...OptionFunc) (string, int, error) {
+	p := &ListDiskOfferingsParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["name"] = name
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return "", -1, err
+		}
+	}
+
+	l, err := s.ListDiskOfferings(p)
+	if err != nil {
+		return "", -1, err
+	}
+
+	if l.Count == 0 {
+		return "", l.Count, fmt.Errorf("No match found for %s: %+v", name, l)
+	}
+
+	if l.Count == 1 {
+		return l.DiskOfferings[0].Id, l.Count, nil
+	}
+
+	if l.Count > 1 {
+		for _, v := range l.DiskOfferings {
+			if v.Name == name {
+				return v.Id, l.Count, nil
+			}
+		}
+	}
+	return "", l.Count, fmt.Errorf("Could not find an exact match for %s: %+v", name, l)
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *DiskOfferingService) GetDiskOfferingByName(name string, opts ...OptionFunc) (*DiskOffering, int, error) {
+	id, count, err := s.GetDiskOfferingID(name, opts...)
+	if err != nil {
+		return nil, count, err
+	}
+
+	r, count, err := s.GetDiskOfferingByID(id, opts...)
+	if err != nil {
+		return nil, count, err
+	}
+	return r, count, nil
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *DiskOfferingService) GetDiskOfferingByID(id string, opts ...OptionFunc) (*DiskOffering, int, error) {
+	p := &ListDiskOfferingsParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["id"] = id
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return nil, -1, err
+		}
+	}
+
+	l, err := s.ListDiskOfferings(p)
+	if err != nil {
+		if strings.Contains(err.Error(), fmt.Sprintf(
+			"Invalid parameter id value=%s due to incorrect long value format, "+
+				"or entity does not exist", id)) {
+			return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
+		}
+		return nil, -1, err
+	}
+
+	if l.Count == 0 {
+		return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
+	}
+
+	if l.Count == 1 {
+		return l.DiskOfferings[0], l.Count, nil
+	}
+	return nil, l.Count, fmt.Errorf("There is more then one result for DiskOffering UUID: %s!", id)
+}
+
+// Lists all available disk offerings.
+func (s *DiskOfferingService) ListDiskOfferings(p *ListDiskOfferingsParams) (*ListDiskOfferingsResponse, error) {
+	resp, err := s.cs.newRequest("listDiskOfferings", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListDiskOfferingsResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListDiskOfferingsResponse struct {
+	Count         int             `json:"count"`
+	DiskOfferings []*DiskOffering `json:"diskoffering"`
+}
+
+type DiskOffering struct {
+	CacheMode                 string `json:"cacheMode"`
+	Created                   string `json:"created"`
+	DiskBytesReadRate         int64  `json:"diskBytesReadRate"`
+	DiskBytesWriteRate        int64  `json:"diskBytesWriteRate"`
+	DiskIopsReadRate          int64  `json:"diskIopsReadRate"`
+	DiskIopsWriteRate         int64  `json:"diskIopsWriteRate"`
+	Disksize                  int64  `json:"disksize"`
+	Displayoffering           bool   `json:"displayoffering"`
+	Displaytext               string `json:"displaytext"`
+	Domain                    string `json:"domain"`
+	Domainid                  string `json:"domainid"`
+	Hypervisorsnapshotreserve int    `json:"hypervisorsnapshotreserve"`
+	Id                        string `json:"id"`
+	Iscustomized              bool   `json:"iscustomized"`
+	Iscustomizediops          bool   `json:"iscustomizediops"`
+	Maxiops                   int64  `json:"maxiops"`
+	Miniops                   int64  `json:"miniops"`
+	Name                      string `json:"name"`
+	Provisioningtype          string `json:"provisioningtype"`
+	Storagetype               string `json:"storagetype"`
+	Tags                      string `json:"tags"`
+}
+
+type UpdateDiskOfferingParams struct {
+	p map[string]interface{}
+}
+
+func (p *UpdateDiskOfferingParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["displayoffering"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("displayoffering", vv)
+	}
+	if v, found := p.p["displaytext"]; found {
+		u.Set("displaytext", v.(string))
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["sortkey"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("sortkey", vv)
+	}
+	return u
+}
+
+func (p *UpdateDiskOfferingParams) SetDisplayoffering(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["displayoffering"] = v
+	return
+}
+
+func (p *UpdateDiskOfferingParams) SetDisplaytext(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["displaytext"] = v
+	return
+}
+
+func (p *UpdateDiskOfferingParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *UpdateDiskOfferingParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *UpdateDiskOfferingParams) SetSortkey(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["sortkey"] = v
+	return
+}
+
+// You should always use this function to get a new UpdateDiskOfferingParams instance,
+// as then you are sure you have configured all required params
+func (s *DiskOfferingService) NewUpdateDiskOfferingParams(id string) *UpdateDiskOfferingParams {
+	p := &UpdateDiskOfferingParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Updates a disk offering.
+func (s *DiskOfferingService) UpdateDiskOffering(p *UpdateDiskOfferingParams) (*UpdateDiskOfferingResponse, error) {
+	resp, err := s.cs.newRequest("updateDiskOffering", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r UpdateDiskOfferingResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type UpdateDiskOfferingResponse struct {
+	CacheMode                 string `json:"cacheMode"`
+	Created                   string `json:"created"`
+	DiskBytesReadRate         int64  `json:"diskBytesReadRate"`
+	DiskBytesWriteRate        int64  `json:"diskBytesWriteRate"`
+	DiskIopsReadRate          int64  `json:"diskIopsReadRate"`
+	DiskIopsWriteRate         int64  `json:"diskIopsWriteRate"`
+	Disksize                  int64  `json:"disksize"`
+	Displayoffering           bool   `json:"displayoffering"`
+	Displaytext               string `json:"displaytext"`
+	Domain                    string `json:"domain"`
+	Domainid                  string `json:"domainid"`
+	Hypervisorsnapshotreserve int    `json:"hypervisorsnapshotreserve"`
+	Id                        string `json:"id"`
+	Iscustomized              bool   `json:"iscustomized"`
+	Iscustomizediops          bool   `json:"iscustomizediops"`
+	Maxiops                   int64  `json:"maxiops"`
+	Miniops                   int64  `json:"miniops"`
+	Name                      string `json:"name"`
+	Provisioningtype          string `json:"provisioningtype"`
+	Storagetype               string `json:"storagetype"`
+	Tags                      string `json:"tags"`
+}
diff --git a/vendor/github.com/xanzy/go-cloudstack/cloudstack/DomainService.go b/vendor/github.com/xanzy/go-cloudstack/cloudstack/DomainService.go
new file mode 100644
index 0000000..114058f
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/cloudstack/DomainService.go
@@ -0,0 +1,854 @@
+//
+// Copyright 2018, Sander van Harmelen
+//
+// Licensed 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 cloudstack
+
+import (
+	"encoding/json"
+	"fmt"
+	"net/url"
+	"strconv"
+	"strings"
+)
+
+type CreateDomainParams struct {
+	p map[string]interface{}
+}
+
+func (p *CreateDomainParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["networkdomain"]; found {
+		u.Set("networkdomain", v.(string))
+	}
+	if v, found := p.p["parentdomainid"]; found {
+		u.Set("parentdomainid", v.(string))
+	}
+	return u
+}
+
+func (p *CreateDomainParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *CreateDomainParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *CreateDomainParams) SetNetworkdomain(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["networkdomain"] = v
+	return
+}
+
+func (p *CreateDomainParams) SetParentdomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["parentdomainid"] = v
+	return
+}
+
+// You should always use this function to get a new CreateDomainParams instance,
+// as then you are sure you have configured all required params
+func (s *DomainService) NewCreateDomainParams(name string) *CreateDomainParams {
+	p := &CreateDomainParams{}
+	p.p = make(map[string]interface{})
+	p.p["name"] = name
+	return p
+}
+
+// Creates a domain
+func (s *DomainService) CreateDomain(p *CreateDomainParams) (*CreateDomainResponse, error) {
+	resp, err := s.cs.newRequest("createDomain", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r CreateDomainResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type CreateDomainResponse struct {
+	Cpuavailable              string `json:"cpuavailable"`
+	Cpulimit                  string `json:"cpulimit"`
+	Cputotal                  int64  `json:"cputotal"`
+	Haschild                  bool   `json:"haschild"`
+	Id                        string `json:"id"`
+	Ipavailable               string `json:"ipavailable"`
+	Iplimit                   string `json:"iplimit"`
+	Iptotal                   int64  `json:"iptotal"`
+	Level                     int    `json:"level"`
+	Memoryavailable           string `json:"memoryavailable"`
+	Memorylimit               string `json:"memorylimit"`
+	Memorytotal               int64  `json:"memorytotal"`
+	Name                      string `json:"name"`
+	Networkavailable          string `json:"networkavailable"`
+	Networkdomain             string `json:"networkdomain"`
+	Networklimit              string `json:"networklimit"`
+	Networktotal              int64  `json:"networktotal"`
+	Parentdomainid            string `json:"parentdomainid"`
+	Parentdomainname          string `json:"parentdomainname"`
+	Path                      string `json:"path"`
+	Primarystorageavailable   string `json:"primarystorageavailable"`
+	Primarystoragelimit       string `json:"primarystoragelimit"`
+	Primarystoragetotal       int64  `json:"primarystoragetotal"`
+	Projectavailable          string `json:"projectavailable"`
+	Projectlimit              string `json:"projectlimit"`
+	Projecttotal              int64  `json:"projecttotal"`
+	Secondarystorageavailable string `json:"secondarystorageavailable"`
+	Secondarystoragelimit     string `json:"secondarystoragelimit"`
+	Secondarystoragetotal     int64  `json:"secondarystoragetotal"`
+	Snapshotavailable         string `json:"snapshotavailable"`
+	Snapshotlimit             string `json:"snapshotlimit"`
+	Snapshottotal             int64  `json:"snapshottotal"`
+	State                     string `json:"state"`
+	Templateavailable         string `json:"templateavailable"`
+	Templatelimit             string `json:"templatelimit"`
+	Templatetotal             int64  `json:"templatetotal"`
+	Vmavailable               string `json:"vmavailable"`
+	Vmlimit                   string `json:"vmlimit"`
+	Vmtotal                   int64  `json:"vmtotal"`
+	Volumeavailable           string `json:"volumeavailable"`
+	Volumelimit               string `json:"volumelimit"`
+	Volumetotal               int64  `json:"volumetotal"`
+	Vpcavailable              string `json:"vpcavailable"`
+	Vpclimit                  string `json:"vpclimit"`
+	Vpctotal                  int64  `json:"vpctotal"`
+}
+
+type DeleteDomainParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeleteDomainParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["cleanup"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("cleanup", vv)
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *DeleteDomainParams) SetCleanup(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["cleanup"] = v
+	return
+}
+
+func (p *DeleteDomainParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new DeleteDomainParams instance,
+// as then you are sure you have configured all required params
+func (s *DomainService) NewDeleteDomainParams(id string) *DeleteDomainParams {
+	p := &DeleteDomainParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Deletes a specified domain
+func (s *DomainService) DeleteDomain(p *DeleteDomainParams) (*DeleteDomainResponse, error) {
+	resp, err := s.cs.newRequest("deleteDomain", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeleteDomainResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type DeleteDomainResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
+
+type ListDomainChildrenParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListDomainChildrenParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["isrecursive"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("isrecursive", vv)
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["listall"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("listall", vv)
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	return u
+}
+
+func (p *ListDomainChildrenParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ListDomainChildrenParams) SetIsrecursive(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isrecursive"] = v
+	return
+}
+
+func (p *ListDomainChildrenParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListDomainChildrenParams) SetListall(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["listall"] = v
+	return
+}
+
+func (p *ListDomainChildrenParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *ListDomainChildrenParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListDomainChildrenParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+// You should always use this function to get a new ListDomainChildrenParams instance,
+// as then you are sure you have configured all required params
+func (s *DomainService) NewListDomainChildrenParams() *ListDomainChildrenParams {
+	p := &ListDomainChildrenParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *DomainService) GetDomainChildrenID(name string, opts ...OptionFunc) (string, int, error) {
+	p := &ListDomainChildrenParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["name"] = name
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return "", -1, err
+		}
+	}
+
+	l, err := s.ListDomainChildren(p)
+	if err != nil {
+		return "", -1, err
+	}
+
+	if l.Count == 0 {
+		return "", l.Count, fmt.Errorf("No match found for %s: %+v", name, l)
+	}
+
+	if l.Count == 1 {
+		return l.DomainChildren[0].Id, l.Count, nil
+	}
+
+	if l.Count > 1 {
+		for _, v := range l.DomainChildren {
+			if v.Name == name {
+				return v.Id, l.Count, nil
+			}
+		}
+	}
+	return "", l.Count, fmt.Errorf("Could not find an exact match for %s: %+v", name, l)
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *DomainService) GetDomainChildrenByName(name string, opts ...OptionFunc) (*DomainChildren, int, error) {
+	id, count, err := s.GetDomainChildrenID(name, opts...)
+	if err != nil {
+		return nil, count, err
+	}
+
+	r, count, err := s.GetDomainChildrenByID(id, opts...)
+	if err != nil {
+		return nil, count, err
+	}
+	return r, count, nil
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *DomainService) GetDomainChildrenByID(id string, opts ...OptionFunc) (*DomainChildren, int, error) {
+	p := &ListDomainChildrenParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["id"] = id
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return nil, -1, err
+		}
+	}
+
+	l, err := s.ListDomainChildren(p)
+	if err != nil {
+		if strings.Contains(err.Error(), fmt.Sprintf(
+			"Invalid parameter id value=%s due to incorrect long value format, "+
+				"or entity does not exist", id)) {
+			return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
+		}
+		return nil, -1, err
+	}
+
+	if l.Count == 0 {
+		return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
+	}
+
+	if l.Count == 1 {
+		return l.DomainChildren[0], l.Count, nil
+	}
+	return nil, l.Count, fmt.Errorf("There is more then one result for DomainChildren UUID: %s!", id)
+}
+
+// Lists all children domains belonging to a specified domain
+func (s *DomainService) ListDomainChildren(p *ListDomainChildrenParams) (*ListDomainChildrenResponse, error) {
+	resp, err := s.cs.newRequest("listDomainChildren", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListDomainChildrenResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListDomainChildrenResponse struct {
+	Count          int               `json:"count"`
+	DomainChildren []*DomainChildren `json:"domainchildren"`
+}
+
+type DomainChildren struct {
+	Cpuavailable              string `json:"cpuavailable"`
+	Cpulimit                  string `json:"cpulimit"`
+	Cputotal                  int64  `json:"cputotal"`
+	Haschild                  bool   `json:"haschild"`
+	Id                        string `json:"id"`
+	Ipavailable               string `json:"ipavailable"`
+	Iplimit                   string `json:"iplimit"`
+	Iptotal                   int64  `json:"iptotal"`
+	Level                     int    `json:"level"`
+	Memoryavailable           string `json:"memoryavailable"`
+	Memorylimit               string `json:"memorylimit"`
+	Memorytotal               int64  `json:"memorytotal"`
+	Name                      string `json:"name"`
+	Networkavailable          string `json:"networkavailable"`
+	Networkdomain             string `json:"networkdomain"`
+	Networklimit              string `json:"networklimit"`
+	Networktotal              int64  `json:"networktotal"`
+	Parentdomainid            string `json:"parentdomainid"`
+	Parentdomainname          string `json:"parentdomainname"`
+	Path                      string `json:"path"`
+	Primarystorageavailable   string `json:"primarystorageavailable"`
+	Primarystoragelimit       string `json:"primarystoragelimit"`
+	Primarystoragetotal       int64  `json:"primarystoragetotal"`
+	Projectavailable          string `json:"projectavailable"`
+	Projectlimit              string `json:"projectlimit"`
+	Projecttotal              int64  `json:"projecttotal"`
+	Secondarystorageavailable string `json:"secondarystorageavailable"`
+	Secondarystoragelimit     string `json:"secondarystoragelimit"`
+	Secondarystoragetotal     int64  `json:"secondarystoragetotal"`
+	Snapshotavailable         string `json:"snapshotavailable"`
+	Snapshotlimit             string `json:"snapshotlimit"`
+	Snapshottotal             int64  `json:"snapshottotal"`
+	State                     string `json:"state"`
+	Templateavailable         string `json:"templateavailable"`
+	Templatelimit             string `json:"templatelimit"`
+	Templatetotal             int64  `json:"templatetotal"`
+	Vmavailable               string `json:"vmavailable"`
+	Vmlimit                   string `json:"vmlimit"`
+	Vmtotal                   int64  `json:"vmtotal"`
+	Volumeavailable           string `json:"volumeavailable"`
+	Volumelimit               string `json:"volumelimit"`
+	Volumetotal               int64  `json:"volumetotal"`
+	Vpcavailable              string `json:"vpcavailable"`
+	Vpclimit                  string `json:"vpclimit"`
+	Vpctotal                  int64  `json:"vpctotal"`
+}
+
+type ListDomainsParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListDomainsParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["level"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("level", vv)
+	}
+	if v, found := p.p["listall"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("listall", vv)
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	return u
+}
+
+func (p *ListDomainsParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ListDomainsParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListDomainsParams) SetLevel(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["level"] = v
+	return
+}
+
+func (p *ListDomainsParams) SetListall(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["listall"] = v
+	return
+}
+
+func (p *ListDomainsParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *ListDomainsParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListDomainsParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+// You should always use this function to get a new ListDomainsParams instance,
+// as then you are sure you have configured all required params
+func (s *DomainService) NewListDomainsParams() *ListDomainsParams {
+	p := &ListDomainsParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *DomainService) GetDomainID(name string, opts ...OptionFunc) (string, int, error) {
+	p := &ListDomainsParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["name"] = name
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return "", -1, err
+		}
+	}
+
+	l, err := s.ListDomains(p)
+	if err != nil {
+		return "", -1, err
+	}
+
+	if l.Count == 0 {
+		return "", l.Count, fmt.Errorf("No match found for %s: %+v", name, l)
+	}
+
+	if l.Count == 1 {
+		return l.Domains[0].Id, l.Count, nil
+	}
+
+	if l.Count > 1 {
+		for _, v := range l.Domains {
+			if v.Name == name {
+				return v.Id, l.Count, nil
+			}
+		}
+	}
+	return "", l.Count, fmt.Errorf("Could not find an exact match for %s: %+v", name, l)
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *DomainService) GetDomainByName(name string, opts ...OptionFunc) (*Domain, int, error) {
+	id, count, err := s.GetDomainID(name, opts...)
+	if err != nil {
+		return nil, count, err
+	}
+
+	r, count, err := s.GetDomainByID(id, opts...)
+	if err != nil {
+		return nil, count, err
+	}
+	return r, count, nil
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *DomainService) GetDomainByID(id string, opts ...OptionFunc) (*Domain, int, error) {
+	p := &ListDomainsParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["id"] = id
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return nil, -1, err
+		}
+	}
+
+	l, err := s.ListDomains(p)
+	if err != nil {
+		if strings.Contains(err.Error(), fmt.Sprintf(
+			"Invalid parameter id value=%s due to incorrect long value format, "+
+				"or entity does not exist", id)) {
+			return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
+		}
+		return nil, -1, err
+	}
+
+	if l.Count == 0 {
+		return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
+	}
+
+	if l.Count == 1 {
+		return l.Domains[0], l.Count, nil
+	}
+	return nil, l.Count, fmt.Errorf("There is more then one result for Domain UUID: %s!", id)
+}
+
+// Lists domains and provides detailed information for listed domains
+func (s *DomainService) ListDomains(p *ListDomainsParams) (*ListDomainsResponse, error) {
+	resp, err := s.cs.newRequest("listDomains", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListDomainsResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListDomainsResponse struct {
+	Count   int       `json:"count"`
+	Domains []*Domain `json:"domain"`
+}
+
+type Domain struct {
+	Cpuavailable              string `json:"cpuavailable"`
+	Cpulimit                  string `json:"cpulimit"`
+	Cputotal                  int64  `json:"cputotal"`
+	Haschild                  bool   `json:"haschild"`
+	Id                        string `json:"id"`
+	Ipavailable               string `json:"ipavailable"`
+	Iplimit                   string `json:"iplimit"`
+	Iptotal                   int64  `json:"iptotal"`
+	Level                     int    `json:"level"`
+	Memoryavailable           string `json:"memoryavailable"`
+	Memorylimit               string `json:"memorylimit"`
+	Memorytotal               int64  `json:"memorytotal"`
+	Name                      string `json:"name"`
+	Networkavailable          string `json:"networkavailable"`
+	Networkdomain             string `json:"networkdomain"`
+	Networklimit              string `json:"networklimit"`
+	Networktotal              int64  `json:"networktotal"`
+	Parentdomainid            string `json:"parentdomainid"`
+	Parentdomainname          string `json:"parentdomainname"`
+	Path                      string `json:"path"`
+	Primarystorageavailable   string `json:"primarystorageavailable"`
+	Primarystoragelimit       string `json:"primarystoragelimit"`
+	Primarystoragetotal       int64  `json:"primarystoragetotal"`
+	Projectavailable          string `json:"projectavailable"`
+	Projectlimit              string `json:"projectlimit"`
+	Projecttotal              int64  `json:"projecttotal"`
+	Secondarystorageavailable string `json:"secondarystorageavailable"`
+	Secondarystoragelimit     string `json:"secondarystoragelimit"`
+	Secondarystoragetotal     int64  `json:"secondarystoragetotal"`
+	Snapshotavailable         string `json:"snapshotavailable"`
+	Snapshotlimit             string `json:"snapshotlimit"`
+	Snapshottotal             int64  `json:"snapshottotal"`
+	State                     string `json:"state"`
+	Templateavailable         string `json:"templateavailable"`
+	Templatelimit             string `json:"templatelimit"`
+	Templatetotal             int64  `json:"templatetotal"`
+	Vmavailable               string `json:"vmavailable"`
+	Vmlimit                   string `json:"vmlimit"`
+	Vmtotal                   int64  `json:"vmtotal"`
+	Volumeavailable           string `json:"volumeavailable"`
+	Volumelimit               string `json:"volumelimit"`
+	Volumetotal               int64  `json:"volumetotal"`
+	Vpcavailable              string `json:"vpcavailable"`
+	Vpclimit                  string `json:"vpclimit"`
+	Vpctotal                  int64  `json:"vpctotal"`
+}
+
+type UpdateDomainParams struct {
+	p map[string]interface{}
+}
+
+func (p *UpdateDomainParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["networkdomain"]; found {
+		u.Set("networkdomain", v.(string))
+	}
+	return u
+}
+
+func (p *UpdateDomainParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *UpdateDomainParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *UpdateDomainParams) SetNetworkdomain(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["networkdomain"] = v
+	return
+}
+
+// You should always use this function to get a new UpdateDomainParams instance,
+// as then you are sure you have configured all required params
+func (s *DomainService) NewUpdateDomainParams(id string) *UpdateDomainParams {
+	p := &UpdateDomainParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Updates a domain with a new name
+func (s *DomainService) UpdateDomain(p *UpdateDomainParams) (*UpdateDomainResponse, error) {
+	resp, err := s.cs.newRequest("updateDomain", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r UpdateDomainResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type UpdateDomainResponse struct {
+	Cpuavailable              string `json:"cpuavailable"`
+	Cpulimit                  string `json:"cpulimit"`
+	Cputotal                  int64  `json:"cputotal"`
+	Haschild                  bool   `json:"haschild"`
+	Id                        string `json:"id"`
+	Ipavailable               string `json:"ipavailable"`
+	Iplimit                   string `json:"iplimit"`
+	Iptotal                   int64  `json:"iptotal"`
+	Level                     int    `json:"level"`
+	Memoryavailable           string `json:"memoryavailable"`
+	Memorylimit               string `json:"memorylimit"`
+	Memorytotal               int64  `json:"memorytotal"`
+	Name                      string `json:"name"`
+	Networkavailable          string `json:"networkavailable"`
+	Networkdomain             string `json:"networkdomain"`
+	Networklimit              string `json:"networklimit"`
+	Networktotal              int64  `json:"networktotal"`
+	Parentdomainid            string `json:"parentdomainid"`
+	Parentdomainname          string `json:"parentdomainname"`
+	Path                      string `json:"path"`
+	Primarystorageavailable   string `json:"primarystorageavailable"`
+	Primarystoragelimit       string `json:"primarystoragelimit"`
+	Primarystoragetotal       int64  `json:"primarystoragetotal"`
+	Projectavailable          string `json:"projectavailable"`
+	Projectlimit              string `json:"projectlimit"`
+	Projecttotal              int64  `json:"projecttotal"`
+	Secondarystorageavailable string `json:"secondarystorageavailable"`
+	Secondarystoragelimit     string `json:"secondarystoragelimit"`
+	Secondarystoragetotal     int64  `json:"secondarystoragetotal"`
+	Snapshotavailable         string `json:"snapshotavailable"`
+	Snapshotlimit             string `json:"snapshotlimit"`
+	Snapshottotal             int64  `json:"snapshottotal"`
+	State                     string `json:"state"`
+	Templateavailable         string `json:"templateavailable"`
+	Templatelimit             string `json:"templatelimit"`
+	Templatetotal             int64  `json:"templatetotal"`
+	Vmavailable               string `json:"vmavailable"`
+	Vmlimit                   string `json:"vmlimit"`
+	Vmtotal                   int64  `json:"vmtotal"`
+	Volumeavailable           string `json:"volumeavailable"`
+	Volumelimit               string `json:"volumelimit"`
+	Volumetotal               int64  `json:"volumetotal"`
+	Vpcavailable              string `json:"vpcavailable"`
+	Vpclimit                  string `json:"vpclimit"`
+	Vpctotal                  int64  `json:"vpctotal"`
+}
diff --git a/vendor/github.com/xanzy/go-cloudstack/cloudstack/EventService.go b/vendor/github.com/xanzy/go-cloudstack/cloudstack/EventService.go
new file mode 100644
index 0000000..6b27cba
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/cloudstack/EventService.go
@@ -0,0 +1,499 @@
+//
+// Copyright 2018, Sander van Harmelen
+//
+// Licensed 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 cloudstack
+
+import (
+	"encoding/json"
+	"fmt"
+	"net/url"
+	"strconv"
+	"strings"
+)
+
+type ArchiveEventsParams struct {
+	p map[string]interface{}
+}
+
+func (p *ArchiveEventsParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["enddate"]; found {
+		u.Set("enddate", v.(string))
+	}
+	if v, found := p.p["ids"]; found {
+		vv := strings.Join(v.([]string), ",")
+		u.Set("ids", vv)
+	}
+	if v, found := p.p["startdate"]; found {
+		u.Set("startdate", v.(string))
+	}
+	if v, found := p.p["type"]; found {
+		u.Set("type", v.(string))
+	}
+	return u
+}
+
+func (p *ArchiveEventsParams) SetEnddate(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["enddate"] = v
+	return
+}
+
+func (p *ArchiveEventsParams) SetIds(v []string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["ids"] = v
+	return
+}
+
+func (p *ArchiveEventsParams) SetStartdate(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["startdate"] = v
+	return
+}
+
+func (p *ArchiveEventsParams) SetType(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["type"] = v
+	return
+}
+
+// You should always use this function to get a new ArchiveEventsParams instance,
+// as then you are sure you have configured all required params
+func (s *EventService) NewArchiveEventsParams() *ArchiveEventsParams {
+	p := &ArchiveEventsParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// Archive one or more events.
+func (s *EventService) ArchiveEvents(p *ArchiveEventsParams) (*ArchiveEventsResponse, error) {
+	resp, err := s.cs.newRequest("archiveEvents", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ArchiveEventsResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ArchiveEventsResponse struct {
+	Displaytext string `json:"displaytext"`
+	Success     string `json:"success"`
+}
+
+type DeleteEventsParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeleteEventsParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["enddate"]; found {
+		u.Set("enddate", v.(string))
+	}
+	if v, found := p.p["ids"]; found {
+		vv := strings.Join(v.([]string), ",")
+		u.Set("ids", vv)
+	}
+	if v, found := p.p["startdate"]; found {
+		u.Set("startdate", v.(string))
+	}
+	if v, found := p.p["type"]; found {
+		u.Set("type", v.(string))
+	}
+	return u
+}
+
+func (p *DeleteEventsParams) SetEnddate(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["enddate"] = v
+	return
+}
+
+func (p *DeleteEventsParams) SetIds(v []string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["ids"] = v
+	return
+}
+
+func (p *DeleteEventsParams) SetStartdate(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["startdate"] = v
+	return
+}
+
+func (p *DeleteEventsParams) SetType(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["type"] = v
+	return
+}
+
+// You should always use this function to get a new DeleteEventsParams instance,
+// as then you are sure you have configured all required params
+func (s *EventService) NewDeleteEventsParams() *DeleteEventsParams {
+	p := &DeleteEventsParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// Delete one or more events.
+func (s *EventService) DeleteEvents(p *DeleteEventsParams) (*DeleteEventsResponse, error) {
+	resp, err := s.cs.newRequest("deleteEvents", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeleteEventsResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type DeleteEventsResponse struct {
+	Displaytext string `json:"displaytext"`
+	Success     string `json:"success"`
+}
+
+type ListEventTypesParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListEventTypesParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	return u
+}
+
+// You should always use this function to get a new ListEventTypesParams instance,
+// as then you are sure you have configured all required params
+func (s *EventService) NewListEventTypesParams() *ListEventTypesParams {
+	p := &ListEventTypesParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// List Event Types
+func (s *EventService) ListEventTypes(p *ListEventTypesParams) (*ListEventTypesResponse, error) {
+	resp, err := s.cs.newRequest("listEventTypes", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListEventTypesResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListEventTypesResponse struct {
+	Count      int          `json:"count"`
+	EventTypes []*EventType `json:"eventtype"`
+}
+
+type EventType struct {
+	Name string `json:"name"`
+}
+
+type ListEventsParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListEventsParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["duration"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("duration", vv)
+	}
+	if v, found := p.p["enddate"]; found {
+		u.Set("enddate", v.(string))
+	}
+	if v, found := p.p["entrytime"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("entrytime", vv)
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["isrecursive"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("isrecursive", vv)
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["level"]; found {
+		u.Set("level", v.(string))
+	}
+	if v, found := p.p["listall"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("listall", vv)
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["projectid"]; found {
+		u.Set("projectid", v.(string))
+	}
+	if v, found := p.p["startdate"]; found {
+		u.Set("startdate", v.(string))
+	}
+	if v, found := p.p["type"]; found {
+		u.Set("type", v.(string))
+	}
+	return u
+}
+
+func (p *ListEventsParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *ListEventsParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *ListEventsParams) SetDuration(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["duration"] = v
+	return
+}
+
+func (p *ListEventsParams) SetEnddate(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["enddate"] = v
+	return
+}
+
+func (p *ListEventsParams) SetEntrytime(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["entrytime"] = v
+	return
+}
+
+func (p *ListEventsParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ListEventsParams) SetIsrecursive(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isrecursive"] = v
+	return
+}
+
+func (p *ListEventsParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListEventsParams) SetLevel(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["level"] = v
+	return
+}
+
+func (p *ListEventsParams) SetListall(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["listall"] = v
+	return
+}
+
+func (p *ListEventsParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListEventsParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListEventsParams) SetProjectid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectid"] = v
+	return
+}
+
+func (p *ListEventsParams) SetStartdate(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["startdate"] = v
+	return
+}
+
+func (p *ListEventsParams) SetType(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["type"] = v
+	return
+}
+
+// You should always use this function to get a new ListEventsParams instance,
+// as then you are sure you have configured all required params
+func (s *EventService) NewListEventsParams() *ListEventsParams {
+	p := &ListEventsParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *EventService) GetEventByID(id string, opts ...OptionFunc) (*Event, int, error) {
+	p := &ListEventsParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["id"] = id
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return nil, -1, err
+		}
+	}
+
+	l, err := s.ListEvents(p)
+	if err != nil {
+		if strings.Contains(err.Error(), fmt.Sprintf(
+			"Invalid parameter id value=%s due to incorrect long value format, "+
+				"or entity does not exist", id)) {
+			return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
+		}
+		return nil, -1, err
+	}
+
+	if l.Count == 0 {
+		return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
+	}
+
+	if l.Count == 1 {
+		return l.Events[0], l.Count, nil
+	}
+	return nil, l.Count, fmt.Errorf("There is more then one result for Event UUID: %s!", id)
+}
+
+// A command to list events.
+func (s *EventService) ListEvents(p *ListEventsParams) (*ListEventsResponse, error) {
+	resp, err := s.cs.newRequest("listEvents", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListEventsResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListEventsResponse struct {
+	Count  int      `json:"count"`
+	Events []*Event `json:"event"`
+}
+
+type Event struct {
+	Account     string `json:"account"`
+	Created     string `json:"created"`
+	Description string `json:"description"`
+	Domain      string `json:"domain"`
+	Domainid    string `json:"domainid"`
+	Id          string `json:"id"`
+	Level       string `json:"level"`
+	Parentid    string `json:"parentid"`
+	Project     string `json:"project"`
+	Projectid   string `json:"projectid"`
+	State       string `json:"state"`
+	Type        string `json:"type"`
+	Username    string `json:"username"`
+}
diff --git a/vendor/github.com/xanzy/go-cloudstack/cloudstack/ExtFirewallService.go b/vendor/github.com/xanzy/go-cloudstack/cloudstack/ExtFirewallService.go
new file mode 100644
index 0000000..c1407ff
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/cloudstack/ExtFirewallService.go
@@ -0,0 +1,273 @@
+//
+// Copyright 2018, Sander van Harmelen
+//
+// Licensed 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 cloudstack
+
+import (
+	"encoding/json"
+	"net/url"
+	"strconv"
+)
+
+type AddExternalFirewallParams struct {
+	p map[string]interface{}
+}
+
+func (p *AddExternalFirewallParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["password"]; found {
+		u.Set("password", v.(string))
+	}
+	if v, found := p.p["url"]; found {
+		u.Set("url", v.(string))
+	}
+	if v, found := p.p["username"]; found {
+		u.Set("username", v.(string))
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *AddExternalFirewallParams) SetPassword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["password"] = v
+	return
+}
+
+func (p *AddExternalFirewallParams) SetUrl(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["url"] = v
+	return
+}
+
+func (p *AddExternalFirewallParams) SetUsername(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["username"] = v
+	return
+}
+
+func (p *AddExternalFirewallParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new AddExternalFirewallParams instance,
+// as then you are sure you have configured all required params
+func (s *ExtFirewallService) NewAddExternalFirewallParams(password string, url string, username string, zoneid string) *AddExternalFirewallParams {
+	p := &AddExternalFirewallParams{}
+	p.p = make(map[string]interface{})
+	p.p["password"] = password
+	p.p["url"] = url
+	p.p["username"] = username
+	p.p["zoneid"] = zoneid
+	return p
+}
+
+// Adds an external firewall appliance
+func (s *ExtFirewallService) AddExternalFirewall(p *AddExternalFirewallParams) (*AddExternalFirewallResponse, error) {
+	resp, err := s.cs.newRequest("addExternalFirewall", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r AddExternalFirewallResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type AddExternalFirewallResponse struct {
+	Id               string `json:"id"`
+	Ipaddress        string `json:"ipaddress"`
+	Numretries       string `json:"numretries"`
+	Privateinterface string `json:"privateinterface"`
+	Privatezone      string `json:"privatezone"`
+	Publicinterface  string `json:"publicinterface"`
+	Publiczone       string `json:"publiczone"`
+	Timeout          string `json:"timeout"`
+	Usageinterface   string `json:"usageinterface"`
+	Username         string `json:"username"`
+	Zoneid           string `json:"zoneid"`
+}
+
+type DeleteExternalFirewallParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeleteExternalFirewallParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *DeleteExternalFirewallParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new DeleteExternalFirewallParams instance,
+// as then you are sure you have configured all required params
+func (s *ExtFirewallService) NewDeleteExternalFirewallParams(id string) *DeleteExternalFirewallParams {
+	p := &DeleteExternalFirewallParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Deletes an external firewall appliance.
+func (s *ExtFirewallService) DeleteExternalFirewall(p *DeleteExternalFirewallParams) (*DeleteExternalFirewallResponse, error) {
+	resp, err := s.cs.newRequest("deleteExternalFirewall", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeleteExternalFirewallResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type DeleteExternalFirewallResponse struct {
+	Displaytext string `json:"displaytext"`
+	Success     string `json:"success"`
+}
+
+type ListExternalFirewallsParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListExternalFirewallsParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *ListExternalFirewallsParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListExternalFirewallsParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListExternalFirewallsParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListExternalFirewallsParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new ListExternalFirewallsParams instance,
+// as then you are sure you have configured all required params
+func (s *ExtFirewallService) NewListExternalFirewallsParams(zoneid string) *ListExternalFirewallsParams {
+	p := &ListExternalFirewallsParams{}
+	p.p = make(map[string]interface{})
+	p.p["zoneid"] = zoneid
+	return p
+}
+
+// List external firewall appliances.
+func (s *ExtFirewallService) ListExternalFirewalls(p *ListExternalFirewallsParams) (*ListExternalFirewallsResponse, error) {
+	resp, err := s.cs.newRequest("listExternalFirewalls", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListExternalFirewallsResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListExternalFirewallsResponse struct {
+	Count             int                 `json:"count"`
+	ExternalFirewalls []*ExternalFirewall `json:"externalfirewall"`
+}
+
+type ExternalFirewall struct {
+	Id               string `json:"id"`
+	Ipaddress        string `json:"ipaddress"`
+	Numretries       string `json:"numretries"`
+	Privateinterface string `json:"privateinterface"`
+	Privatezone      string `json:"privatezone"`
+	Publicinterface  string `json:"publicinterface"`
+	Publiczone       string `json:"publiczone"`
+	Timeout          string `json:"timeout"`
+	Usageinterface   string `json:"usageinterface"`
+	Username         string `json:"username"`
+	Zoneid           string `json:"zoneid"`
+}
diff --git a/vendor/github.com/xanzy/go-cloudstack/cloudstack/ExtLoadBalancerService.go b/vendor/github.com/xanzy/go-cloudstack/cloudstack/ExtLoadBalancerService.go
new file mode 100644
index 0000000..523301a
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/cloudstack/ExtLoadBalancerService.go
@@ -0,0 +1,353 @@
+//
+// Copyright 2018, Sander van Harmelen
+//
+// Licensed 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 cloudstack
+
+import (
+	"encoding/json"
+	"fmt"
+	"net/url"
+	"strconv"
+)
+
+type AddExternalLoadBalancerParams struct {
+	p map[string]interface{}
+}
+
+func (p *AddExternalLoadBalancerParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["password"]; found {
+		u.Set("password", v.(string))
+	}
+	if v, found := p.p["url"]; found {
+		u.Set("url", v.(string))
+	}
+	if v, found := p.p["username"]; found {
+		u.Set("username", v.(string))
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *AddExternalLoadBalancerParams) SetPassword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["password"] = v
+	return
+}
+
+func (p *AddExternalLoadBalancerParams) SetUrl(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["url"] = v
+	return
+}
+
+func (p *AddExternalLoadBalancerParams) SetUsername(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["username"] = v
+	return
+}
+
+func (p *AddExternalLoadBalancerParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new AddExternalLoadBalancerParams instance,
+// as then you are sure you have configured all required params
+func (s *ExtLoadBalancerService) NewAddExternalLoadBalancerParams(password string, url string, username string, zoneid string) *AddExternalLoadBalancerParams {
+	p := &AddExternalLoadBalancerParams{}
+	p.p = make(map[string]interface{})
+	p.p["password"] = password
+	p.p["url"] = url
+	p.p["username"] = username
+	p.p["zoneid"] = zoneid
+	return p
+}
+
+// Adds F5 external load balancer appliance.
+func (s *ExtLoadBalancerService) AddExternalLoadBalancer(p *AddExternalLoadBalancerParams) (*AddExternalLoadBalancerResponse, error) {
+	resp, err := s.cs.newRequest("addExternalLoadBalancer", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r AddExternalLoadBalancerResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type AddExternalLoadBalancerResponse struct {
+	Id               string `json:"id"`
+	Ipaddress        string `json:"ipaddress"`
+	Numretries       string `json:"numretries"`
+	Privateinterface string `json:"privateinterface"`
+	Publicinterface  string `json:"publicinterface"`
+	Username         string `json:"username"`
+	Zoneid           string `json:"zoneid"`
+}
+
+type DeleteExternalLoadBalancerParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeleteExternalLoadBalancerParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *DeleteExternalLoadBalancerParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new DeleteExternalLoadBalancerParams instance,
+// as then you are sure you have configured all required params
+func (s *ExtLoadBalancerService) NewDeleteExternalLoadBalancerParams(id string) *DeleteExternalLoadBalancerParams {
+	p := &DeleteExternalLoadBalancerParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Deletes a F5 external load balancer appliance added in a zone.
+func (s *ExtLoadBalancerService) DeleteExternalLoadBalancer(p *DeleteExternalLoadBalancerParams) (*DeleteExternalLoadBalancerResponse, error) {
+	resp, err := s.cs.newRequest("deleteExternalLoadBalancer", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeleteExternalLoadBalancerResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type DeleteExternalLoadBalancerResponse struct {
+	Displaytext string `json:"displaytext"`
+	Success     string `json:"success"`
+}
+
+type ListExternalLoadBalancersParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListExternalLoadBalancersParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *ListExternalLoadBalancersParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListExternalLoadBalancersParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListExternalLoadBalancersParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListExternalLoadBalancersParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new ListExternalLoadBalancersParams instance,
+// as then you are sure you have configured all required params
+func (s *ExtLoadBalancerService) NewListExternalLoadBalancersParams() *ListExternalLoadBalancersParams {
+	p := &ListExternalLoadBalancersParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *ExtLoadBalancerService) GetExternalLoadBalancerID(keyword string, opts ...OptionFunc) (string, int, error) {
+	p := &ListExternalLoadBalancersParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["keyword"] = keyword
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return "", -1, err
+		}
+	}
+
+	l, err := s.ListExternalLoadBalancers(p)
+	if err != nil {
+		return "", -1, err
+	}
+
+	if l.Count == 0 {
+		return "", l.Count, fmt.Errorf("No match found for %s: %+v", keyword, l)
+	}
+
+	if l.Count == 1 {
+		return l.ExternalLoadBalancers[0].Id, l.Count, nil
+	}
+
+	if l.Count > 1 {
+		for _, v := range l.ExternalLoadBalancers {
+			if v.Name == keyword {
+				return v.Id, l.Count, nil
+			}
+		}
+	}
+	return "", l.Count, fmt.Errorf("Could not find an exact match for %s: %+v", keyword, l)
+}
+
+// Lists F5 external load balancer appliances added in a zone.
+func (s *ExtLoadBalancerService) ListExternalLoadBalancers(p *ListExternalLoadBalancersParams) (*ListExternalLoadBalancersResponse, error) {
+	resp, err := s.cs.newRequest("listExternalLoadBalancers", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListExternalLoadBalancersResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListExternalLoadBalancersResponse struct {
+	Count                 int                     `json:"count"`
+	ExternalLoadBalancers []*ExternalLoadBalancer `json:"externalloadbalancer"`
+}
+
+type ExternalLoadBalancer struct {
+	Averageload             int64             `json:"averageload"`
+	Capabilities            string            `json:"capabilities"`
+	Clusterid               string            `json:"clusterid"`
+	Clustername             string            `json:"clustername"`
+	Clustertype             string            `json:"clustertype"`
+	Cpuallocated            string            `json:"cpuallocated"`
+	Cpunumber               int               `json:"cpunumber"`
+	Cpusockets              int               `json:"cpusockets"`
+	Cpuspeed                int64             `json:"cpuspeed"`
+	Cpuused                 string            `json:"cpuused"`
+	Cpuwithoverprovisioning string            `json:"cpuwithoverprovisioning"`
+	Created                 string            `json:"created"`
+	Details                 map[string]string `json:"details"`
+	Disconnected            string            `json:"disconnected"`
+	Disksizeallocated       int64             `json:"disksizeallocated"`
+	Disksizetotal           int64             `json:"disksizetotal"`
+	Events                  string            `json:"events"`
+	Gpugroup                []struct {
+		Gpugroupname string `json:"gpugroupname"`
+		Vgpu         []struct {
+			Maxcapacity       int64  `json:"maxcapacity"`
+			Maxheads          int64  `json:"maxheads"`
+			Maxresolutionx    int64  `json:"maxresolutionx"`
+			Maxresolutiony    int64  `json:"maxresolutiony"`
+			Maxvgpuperpgpu    int64  `json:"maxvgpuperpgpu"`
+			Remainingcapacity int64  `json:"remainingcapacity"`
+			Vgputype          string `json:"vgputype"`
+			Videoram          int64  `json:"videoram"`
+		} `json:"vgpu"`
+	} `json:"gpugroup"`
+	Hahost               bool                        `json:"hahost"`
+	Hasenoughcapacity    bool                        `json:"hasenoughcapacity"`
+	Hosttags             string                      `json:"hosttags"`
+	Hypervisor           string                      `json:"hypervisor"`
+	Hypervisorversion    string                      `json:"hypervisorversion"`
+	Id                   string                      `json:"id"`
+	Ipaddress            string                      `json:"ipaddress"`
+	Islocalstorageactive bool                        `json:"islocalstorageactive"`
+	Lastpinged           string                      `json:"lastpinged"`
+	Managementserverid   int64                       `json:"managementserverid"`
+	Memoryallocated      int64                       `json:"memoryallocated"`
+	Memorytotal          int64                       `json:"memorytotal"`
+	Memoryused           int64                       `json:"memoryused"`
+	Name                 string                      `json:"name"`
+	Networkkbsread       int64                       `json:"networkkbsread"`
+	Networkkbswrite      int64                       `json:"networkkbswrite"`
+	Oscategoryid         string                      `json:"oscategoryid"`
+	Oscategoryname       string                      `json:"oscategoryname"`
+	Outofbandmanagement  OutOfBandManagementResponse `json:"outofbandmanagement"`
+	Podid                string                      `json:"podid"`
+	Podname              string                      `json:"podname"`
+	Removed              string                      `json:"removed"`
+	Resourcestate        string                      `json:"resourcestate"`
+	State                string                      `json:"state"`
+	Suitableformigration bool                        `json:"suitableformigration"`
+	Type                 string                      `json:"type"`
+	Version              string                      `json:"version"`
+	Zoneid               string                      `json:"zoneid"`
+	Zonename             string                      `json:"zonename"`
+}
diff --git a/vendor/github.com/xanzy/go-cloudstack/cloudstack/ExternalDeviceService.go b/vendor/github.com/xanzy/go-cloudstack/cloudstack/ExternalDeviceService.go
new file mode 100644
index 0000000..6834122
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/cloudstack/ExternalDeviceService.go
@@ -0,0 +1,853 @@
+//
+// Copyright 2018, Sander van Harmelen
+//
+// Licensed 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 cloudstack
+
+import (
+	"encoding/json"
+	"net/url"
+	"strconv"
+)
+
+type AddCiscoAsa1000vResourceParams struct {
+	p map[string]interface{}
+}
+
+func (p *AddCiscoAsa1000vResourceParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["clusterid"]; found {
+		u.Set("clusterid", v.(string))
+	}
+	if v, found := p.p["hostname"]; found {
+		u.Set("hostname", v.(string))
+	}
+	if v, found := p.p["insideportprofile"]; found {
+		u.Set("insideportprofile", v.(string))
+	}
+	if v, found := p.p["physicalnetworkid"]; found {
+		u.Set("physicalnetworkid", v.(string))
+	}
+	return u
+}
+
+func (p *AddCiscoAsa1000vResourceParams) SetClusterid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["clusterid"] = v
+	return
+}
+
+func (p *AddCiscoAsa1000vResourceParams) SetHostname(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["hostname"] = v
+	return
+}
+
+func (p *AddCiscoAsa1000vResourceParams) SetInsideportprofile(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["insideportprofile"] = v
+	return
+}
+
+func (p *AddCiscoAsa1000vResourceParams) SetPhysicalnetworkid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["physicalnetworkid"] = v
+	return
+}
+
+// You should always use this function to get a new AddCiscoAsa1000vResourceParams instance,
+// as then you are sure you have configured all required params
+func (s *ExternalDeviceService) NewAddCiscoAsa1000vResourceParams(clusterid string, hostname string, insideportprofile string, physicalnetworkid string) *AddCiscoAsa1000vResourceParams {
+	p := &AddCiscoAsa1000vResourceParams{}
+	p.p = make(map[string]interface{})
+	p.p["clusterid"] = clusterid
+	p.p["hostname"] = hostname
+	p.p["insideportprofile"] = insideportprofile
+	p.p["physicalnetworkid"] = physicalnetworkid
+	return p
+}
+
+// Adds a Cisco Asa 1000v appliance
+func (s *ExternalDeviceService) AddCiscoAsa1000vResource(p *AddCiscoAsa1000vResourceParams) (*AddCiscoAsa1000vResourceResponse, error) {
+	resp, err := s.cs.newRequest("addCiscoAsa1000vResource", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r AddCiscoAsa1000vResourceResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type AddCiscoAsa1000vResourceResponse struct {
+}
+
+type AddCiscoVnmcResourceParams struct {
+	p map[string]interface{}
+}
+
+func (p *AddCiscoVnmcResourceParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["hostname"]; found {
+		u.Set("hostname", v.(string))
+	}
+	if v, found := p.p["password"]; found {
+		u.Set("password", v.(string))
+	}
+	if v, found := p.p["physicalnetworkid"]; found {
+		u.Set("physicalnetworkid", v.(string))
+	}
+	if v, found := p.p["username"]; found {
+		u.Set("username", v.(string))
+	}
+	return u
+}
+
+func (p *AddCiscoVnmcResourceParams) SetHostname(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["hostname"] = v
+	return
+}
+
+func (p *AddCiscoVnmcResourceParams) SetPassword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["password"] = v
+	return
+}
+
+func (p *AddCiscoVnmcResourceParams) SetPhysicalnetworkid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["physicalnetworkid"] = v
+	return
+}
+
+func (p *AddCiscoVnmcResourceParams) SetUsername(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["username"] = v
+	return
+}
+
+// You should always use this function to get a new AddCiscoVnmcResourceParams instance,
+// as then you are sure you have configured all required params
+func (s *ExternalDeviceService) NewAddCiscoVnmcResourceParams(hostname string, password string, physicalnetworkid string, username string) *AddCiscoVnmcResourceParams {
+	p := &AddCiscoVnmcResourceParams{}
+	p.p = make(map[string]interface{})
+	p.p["hostname"] = hostname
+	p.p["password"] = password
+	p.p["physicalnetworkid"] = physicalnetworkid
+	p.p["username"] = username
+	return p
+}
+
+// Adds a Cisco Vnmc Controller
+func (s *ExternalDeviceService) AddCiscoVnmcResource(p *AddCiscoVnmcResourceParams) (*AddCiscoVnmcResourceResponse, error) {
+	resp, err := s.cs.newRequest("addCiscoVnmcResource", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r AddCiscoVnmcResourceResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type AddCiscoVnmcResourceResponse struct {
+}
+
+type DeleteCiscoAsa1000vResourceParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeleteCiscoAsa1000vResourceParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["resourceid"]; found {
+		u.Set("resourceid", v.(string))
+	}
+	return u
+}
+
+func (p *DeleteCiscoAsa1000vResourceParams) SetResourceid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["resourceid"] = v
+	return
+}
+
+// You should always use this function to get a new DeleteCiscoAsa1000vResourceParams instance,
+// as then you are sure you have configured all required params
+func (s *ExternalDeviceService) NewDeleteCiscoAsa1000vResourceParams(resourceid string) *DeleteCiscoAsa1000vResourceParams {
+	p := &DeleteCiscoAsa1000vResourceParams{}
+	p.p = make(map[string]interface{})
+	p.p["resourceid"] = resourceid
+	return p
+}
+
+// Deletes a Cisco ASA 1000v appliance
+func (s *ExternalDeviceService) DeleteCiscoAsa1000vResource(p *DeleteCiscoAsa1000vResourceParams) (*DeleteCiscoAsa1000vResourceResponse, error) {
+	resp, err := s.cs.newRequest("deleteCiscoAsa1000vResource", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeleteCiscoAsa1000vResourceResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type DeleteCiscoAsa1000vResourceResponse struct {
+	Displaytext string `json:"displaytext"`
+	Success     string `json:"success"`
+}
+
+type DeleteCiscoNexusVSMParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeleteCiscoNexusVSMParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *DeleteCiscoNexusVSMParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new DeleteCiscoNexusVSMParams instance,
+// as then you are sure you have configured all required params
+func (s *ExternalDeviceService) NewDeleteCiscoNexusVSMParams(id string) *DeleteCiscoNexusVSMParams {
+	p := &DeleteCiscoNexusVSMParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+//  delete a Cisco Nexus VSM device
+func (s *ExternalDeviceService) DeleteCiscoNexusVSM(p *DeleteCiscoNexusVSMParams) (*DeleteCiscoNexusVSMResponse, error) {
+	resp, err := s.cs.newRequest("deleteCiscoNexusVSM", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeleteCiscoNexusVSMResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type DeleteCiscoNexusVSMResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
+
+type DeleteCiscoVnmcResourceParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeleteCiscoVnmcResourceParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["resourceid"]; found {
+		u.Set("resourceid", v.(string))
+	}
+	return u
+}
+
+func (p *DeleteCiscoVnmcResourceParams) SetResourceid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["resourceid"] = v
+	return
+}
+
+// You should always use this function to get a new DeleteCiscoVnmcResourceParams instance,
+// as then you are sure you have configured all required params
+func (s *ExternalDeviceService) NewDeleteCiscoVnmcResourceParams(resourceid string) *DeleteCiscoVnmcResourceParams {
+	p := &DeleteCiscoVnmcResourceParams{}
+	p.p = make(map[string]interface{})
+	p.p["resourceid"] = resourceid
+	return p
+}
+
+// Deletes a Cisco Vnmc controller
+func (s *ExternalDeviceService) DeleteCiscoVnmcResource(p *DeleteCiscoVnmcResourceParams) (*DeleteCiscoVnmcResourceResponse, error) {
+	resp, err := s.cs.newRequest("deleteCiscoVnmcResource", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeleteCiscoVnmcResourceResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type DeleteCiscoVnmcResourceResponse struct {
+	Displaytext string `json:"displaytext"`
+	Success     string `json:"success"`
+}
+
+type DisableCiscoNexusVSMParams struct {
+	p map[string]interface{}
+}
+
+func (p *DisableCiscoNexusVSMParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *DisableCiscoNexusVSMParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new DisableCiscoNexusVSMParams instance,
+// as then you are sure you have configured all required params
+func (s *ExternalDeviceService) NewDisableCiscoNexusVSMParams(id string) *DisableCiscoNexusVSMParams {
+	p := &DisableCiscoNexusVSMParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// disable a Cisco Nexus VSM device
+func (s *ExternalDeviceService) DisableCiscoNexusVSM(p *DisableCiscoNexusVSMParams) (*DisableCiscoNexusVSMResponse, error) {
+	resp, err := s.cs.newRequest("disableCiscoNexusVSM", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DisableCiscoNexusVSMResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type DisableCiscoNexusVSMResponse struct {
+	JobID            string `json:"jobid"`
+	Ipaddress        string `json:"ipaddress"`
+	Vsmconfigmode    string `json:"vsmconfigmode"`
+	Vsmconfigstate   string `json:"vsmconfigstate"`
+	Vsmctrlvlanid    int    `json:"vsmctrlvlanid"`
+	Vsmdeviceid      string `json:"vsmdeviceid"`
+	Vsmdevicename    string `json:"vsmdevicename"`
+	Vsmdevicestate   string `json:"vsmdevicestate"`
+	Vsmdomainid      string `json:"vsmdomainid"`
+	Vsmmgmtvlanid    string `json:"vsmmgmtvlanid"`
+	Vsmpktvlanid     int    `json:"vsmpktvlanid"`
+	Vsmstoragevlanid int    `json:"vsmstoragevlanid"`
+}
+
+type EnableCiscoNexusVSMParams struct {
+	p map[string]interface{}
+}
+
+func (p *EnableCiscoNexusVSMParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *EnableCiscoNexusVSMParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new EnableCiscoNexusVSMParams instance,
+// as then you are sure you have configured all required params
+func (s *ExternalDeviceService) NewEnableCiscoNexusVSMParams(id string) *EnableCiscoNexusVSMParams {
+	p := &EnableCiscoNexusVSMParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Enable a Cisco Nexus VSM device
+func (s *ExternalDeviceService) EnableCiscoNexusVSM(p *EnableCiscoNexusVSMParams) (*EnableCiscoNexusVSMResponse, error) {
+	resp, err := s.cs.newRequest("enableCiscoNexusVSM", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r EnableCiscoNexusVSMResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type EnableCiscoNexusVSMResponse struct {
+	JobID            string `json:"jobid"`
+	Ipaddress        string `json:"ipaddress"`
+	Vsmconfigmode    string `json:"vsmconfigmode"`
+	Vsmconfigstate   string `json:"vsmconfigstate"`
+	Vsmctrlvlanid    int    `json:"vsmctrlvlanid"`
+	Vsmdeviceid      string `json:"vsmdeviceid"`
+	Vsmdevicename    string `json:"vsmdevicename"`
+	Vsmdevicestate   string `json:"vsmdevicestate"`
+	Vsmdomainid      string `json:"vsmdomainid"`
+	Vsmmgmtvlanid    string `json:"vsmmgmtvlanid"`
+	Vsmpktvlanid     int    `json:"vsmpktvlanid"`
+	Vsmstoragevlanid int    `json:"vsmstoragevlanid"`
+}
+
+type ListCiscoAsa1000vResourcesParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListCiscoAsa1000vResourcesParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["hostname"]; found {
+		u.Set("hostname", v.(string))
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["physicalnetworkid"]; found {
+		u.Set("physicalnetworkid", v.(string))
+	}
+	if v, found := p.p["resourceid"]; found {
+		u.Set("resourceid", v.(string))
+	}
+	return u
+}
+
+func (p *ListCiscoAsa1000vResourcesParams) SetHostname(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["hostname"] = v
+	return
+}
+
+func (p *ListCiscoAsa1000vResourcesParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListCiscoAsa1000vResourcesParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListCiscoAsa1000vResourcesParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListCiscoAsa1000vResourcesParams) SetPhysicalnetworkid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["physicalnetworkid"] = v
+	return
+}
+
+func (p *ListCiscoAsa1000vResourcesParams) SetResourceid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["resourceid"] = v
+	return
+}
+
+// You should always use this function to get a new ListCiscoAsa1000vResourcesParams instance,
+// as then you are sure you have configured all required params
+func (s *ExternalDeviceService) NewListCiscoAsa1000vResourcesParams() *ListCiscoAsa1000vResourcesParams {
+	p := &ListCiscoAsa1000vResourcesParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// Lists Cisco ASA 1000v appliances
+func (s *ExternalDeviceService) ListCiscoAsa1000vResources(p *ListCiscoAsa1000vResourcesParams) (*ListCiscoAsa1000vResourcesResponse, error) {
+	resp, err := s.cs.newRequest("listCiscoAsa1000vResources", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListCiscoAsa1000vResourcesResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListCiscoAsa1000vResourcesResponse struct {
+	Count                  int                      `json:"count"`
+	CiscoAsa1000vResources []*CiscoAsa1000vResource `json:"ciscoasa1000vresource"`
+}
+
+type CiscoAsa1000vResource struct {
+}
+
+type ListCiscoNexusVSMsParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListCiscoNexusVSMsParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["clusterid"]; found {
+		u.Set("clusterid", v.(string))
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *ListCiscoNexusVSMsParams) SetClusterid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["clusterid"] = v
+	return
+}
+
+func (p *ListCiscoNexusVSMsParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListCiscoNexusVSMsParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListCiscoNexusVSMsParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListCiscoNexusVSMsParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new ListCiscoNexusVSMsParams instance,
+// as then you are sure you have configured all required params
+func (s *ExternalDeviceService) NewListCiscoNexusVSMsParams() *ListCiscoNexusVSMsParams {
+	p := &ListCiscoNexusVSMsParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// Retrieves a Cisco Nexus 1000v Virtual Switch Manager device associated with a Cluster
+func (s *ExternalDeviceService) ListCiscoNexusVSMs(p *ListCiscoNexusVSMsParams) (*ListCiscoNexusVSMsResponse, error) {
+	resp, err := s.cs.newRequest("listCiscoNexusVSMs", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListCiscoNexusVSMsResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListCiscoNexusVSMsResponse struct {
+	Count          int              `json:"count"`
+	CiscoNexusVSMs []*CiscoNexusVSM `json:"cisconexusvsm"`
+}
+
+type CiscoNexusVSM struct {
+	Ipaddress        string `json:"ipaddress"`
+	Vsmconfigmode    string `json:"vsmconfigmode"`
+	Vsmconfigstate   string `json:"vsmconfigstate"`
+	Vsmctrlvlanid    int    `json:"vsmctrlvlanid"`
+	Vsmdeviceid      string `json:"vsmdeviceid"`
+	Vsmdevicename    string `json:"vsmdevicename"`
+	Vsmdevicestate   string `json:"vsmdevicestate"`
+	Vsmdomainid      string `json:"vsmdomainid"`
+	Vsmmgmtvlanid    string `json:"vsmmgmtvlanid"`
+	Vsmpktvlanid     int    `json:"vsmpktvlanid"`
+	Vsmstoragevlanid int    `json:"vsmstoragevlanid"`
+}
+
+type ListCiscoVnmcResourcesParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListCiscoVnmcResourcesParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["physicalnetworkid"]; found {
+		u.Set("physicalnetworkid", v.(string))
+	}
+	if v, found := p.p["resourceid"]; found {
+		u.Set("resourceid", v.(string))
+	}
+	return u
+}
+
+func (p *ListCiscoVnmcResourcesParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListCiscoVnmcResourcesParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListCiscoVnmcResourcesParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListCiscoVnmcResourcesParams) SetPhysicalnetworkid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["physicalnetworkid"] = v
+	return
+}
+
+func (p *ListCiscoVnmcResourcesParams) SetResourceid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["resourceid"] = v
+	return
+}
+
+// You should always use this function to get a new ListCiscoVnmcResourcesParams instance,
+// as then you are sure you have configured all required params
+func (s *ExternalDeviceService) NewListCiscoVnmcResourcesParams() *ListCiscoVnmcResourcesParams {
+	p := &ListCiscoVnmcResourcesParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// Lists Cisco VNMC controllers
+func (s *ExternalDeviceService) ListCiscoVnmcResources(p *ListCiscoVnmcResourcesParams) (*ListCiscoVnmcResourcesResponse, error) {
+	resp, err := s.cs.newRequest("listCiscoVnmcResources", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListCiscoVnmcResourcesResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListCiscoVnmcResourcesResponse struct {
+	Count              int                  `json:"count"`
+	CiscoVnmcResources []*CiscoVnmcResource `json:"ciscovnmcresource"`
+}
+
+type CiscoVnmcResource struct {
+}
diff --git a/vendor/github.com/xanzy/go-cloudstack/cloudstack/FirewallService.go b/vendor/github.com/xanzy/go-cloudstack/cloudstack/FirewallService.go
new file mode 100644
index 0000000..402e15f
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/cloudstack/FirewallService.go
@@ -0,0 +1,2981 @@
+//
+// Copyright 2018, Sander van Harmelen
+//
+// Licensed 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 cloudstack
+
+import (
+	"encoding/json"
+	"fmt"
+	"net/url"
+	"strconv"
+	"strings"
+)
+
+// Helper function for maintaining backwards compatibility
+func convertFirewallServiceResponse(b []byte) ([]byte, error) {
+	var raw map[string]interface{}
+	if err := json.Unmarshal(b, &raw); err != nil {
+		return nil, err
+	}
+
+	if _, ok := raw["firewallrule"]; ok {
+		return convertFirewallServiceListResponse(b)
+	}
+
+	for _, k := range []string{"endport", "startport"} {
+		if sVal, ok := raw[k].(string); ok {
+			iVal, err := strconv.Atoi(sVal)
+			if err != nil {
+				return nil, err
+			}
+			raw[k] = iVal
+		}
+	}
+
+	return json.Marshal(raw)
+}
+
+// Helper function for maintaining backwards compatibility
+func convertFirewallServiceListResponse(b []byte) ([]byte, error) {
+	var rawList struct {
+		Count         int                      `json:"count"`
+		FirewallRules []map[string]interface{} `json:"firewallrule"`
+	}
+
+	if err := json.Unmarshal(b, &rawList); err != nil {
+		return nil, err
+	}
+
+	for _, r := range rawList.FirewallRules {
+		for _, k := range []string{"endport", "startport"} {
+			if sVal, ok := r[k].(string); ok {
+				iVal, err := strconv.Atoi(sVal)
+				if err != nil {
+					return nil, err
+				}
+				r[k] = iVal
+			}
+		}
+	}
+
+	return json.Marshal(rawList)
+}
+
+type AddPaloAltoFirewallParams struct {
+	p map[string]interface{}
+}
+
+func (p *AddPaloAltoFirewallParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["networkdevicetype"]; found {
+		u.Set("networkdevicetype", v.(string))
+	}
+	if v, found := p.p["password"]; found {
+		u.Set("password", v.(string))
+	}
+	if v, found := p.p["physicalnetworkid"]; found {
+		u.Set("physicalnetworkid", v.(string))
+	}
+	if v, found := p.p["url"]; found {
+		u.Set("url", v.(string))
+	}
+	if v, found := p.p["username"]; found {
+		u.Set("username", v.(string))
+	}
+	return u
+}
+
+func (p *AddPaloAltoFirewallParams) SetNetworkdevicetype(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["networkdevicetype"] = v
+	return
+}
+
+func (p *AddPaloAltoFirewallParams) SetPassword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["password"] = v
+	return
+}
+
+func (p *AddPaloAltoFirewallParams) SetPhysicalnetworkid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["physicalnetworkid"] = v
+	return
+}
+
+func (p *AddPaloAltoFirewallParams) SetUrl(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["url"] = v
+	return
+}
+
+func (p *AddPaloAltoFirewallParams) SetUsername(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["username"] = v
+	return
+}
+
+// You should always use this function to get a new AddPaloAltoFirewallParams instance,
+// as then you are sure you have configured all required params
+func (s *FirewallService) NewAddPaloAltoFirewallParams(networkdevicetype string, password string, physicalnetworkid string, url string, username string) *AddPaloAltoFirewallParams {
+	p := &AddPaloAltoFirewallParams{}
+	p.p = make(map[string]interface{})
+	p.p["networkdevicetype"] = networkdevicetype
+	p.p["password"] = password
+	p.p["physicalnetworkid"] = physicalnetworkid
+	p.p["url"] = url
+	p.p["username"] = username
+	return p
+}
+
+// Adds a Palo Alto firewall device
+func (s *FirewallService) AddPaloAltoFirewall(p *AddPaloAltoFirewallParams) (*AddPaloAltoFirewallResponse, error) {
+	resp, err := s.cs.newRequest("addPaloAltoFirewall", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r AddPaloAltoFirewallResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		b, err = convertFirewallServiceResponse(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type AddPaloAltoFirewallResponse struct {
+	JobID             string `json:"jobid"`
+	Fwdevicecapacity  int64  `json:"fwdevicecapacity"`
+	Fwdeviceid        string `json:"fwdeviceid"`
+	Fwdevicename      string `json:"fwdevicename"`
+	Fwdevicestate     string `json:"fwdevicestate"`
+	Ipaddress         string `json:"ipaddress"`
+	Numretries        string `json:"numretries"`
+	Physicalnetworkid string `json:"physicalnetworkid"`
+	Privateinterface  string `json:"privateinterface"`
+	Privatezone       string `json:"privatezone"`
+	Provider          string `json:"provider"`
+	Publicinterface   string `json:"publicinterface"`
+	Publiczone        string `json:"publiczone"`
+	Timeout           string `json:"timeout"`
+	Usageinterface    string `json:"usageinterface"`
+	Username          string `json:"username"`
+	Zoneid            string `json:"zoneid"`
+}
+
+type AddSrxFirewallParams struct {
+	p map[string]interface{}
+}
+
+func (p *AddSrxFirewallParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["networkdevicetype"]; found {
+		u.Set("networkdevicetype", v.(string))
+	}
+	if v, found := p.p["password"]; found {
+		u.Set("password", v.(string))
+	}
+	if v, found := p.p["physicalnetworkid"]; found {
+		u.Set("physicalnetworkid", v.(string))
+	}
+	if v, found := p.p["url"]; found {
+		u.Set("url", v.(string))
+	}
+	if v, found := p.p["username"]; found {
+		u.Set("username", v.(string))
+	}
+	return u
+}
+
+func (p *AddSrxFirewallParams) SetNetworkdevicetype(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["networkdevicetype"] = v
+	return
+}
+
+func (p *AddSrxFirewallParams) SetPassword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["password"] = v
+	return
+}
+
+func (p *AddSrxFirewallParams) SetPhysicalnetworkid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["physicalnetworkid"] = v
+	return
+}
+
+func (p *AddSrxFirewallParams) SetUrl(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["url"] = v
+	return
+}
+
+func (p *AddSrxFirewallParams) SetUsername(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["username"] = v
+	return
+}
+
+// You should always use this function to get a new AddSrxFirewallParams instance,
+// as then you are sure you have configured all required params
+func (s *FirewallService) NewAddSrxFirewallParams(networkdevicetype string, password string, physicalnetworkid string, url string, username string) *AddSrxFirewallParams {
+	p := &AddSrxFirewallParams{}
+	p.p = make(map[string]interface{})
+	p.p["networkdevicetype"] = networkdevicetype
+	p.p["password"] = password
+	p.p["physicalnetworkid"] = physicalnetworkid
+	p.p["url"] = url
+	p.p["username"] = username
+	return p
+}
+
+// Adds a SRX firewall device
+func (s *FirewallService) AddSrxFirewall(p *AddSrxFirewallParams) (*AddSrxFirewallResponse, error) {
+	resp, err := s.cs.newRequest("addSrxFirewall", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r AddSrxFirewallResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		b, err = convertFirewallServiceResponse(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type AddSrxFirewallResponse struct {
+	JobID             string `json:"jobid"`
+	Fwdevicecapacity  int64  `json:"fwdevicecapacity"`
+	Fwdeviceid        string `json:"fwdeviceid"`
+	Fwdevicename      string `json:"fwdevicename"`
+	Fwdevicestate     string `json:"fwdevicestate"`
+	Ipaddress         string `json:"ipaddress"`
+	Numretries        string `json:"numretries"`
+	Physicalnetworkid string `json:"physicalnetworkid"`
+	Privateinterface  string `json:"privateinterface"`
+	Privatezone       string `json:"privatezone"`
+	Provider          string `json:"provider"`
+	Publicinterface   string `json:"publicinterface"`
+	Publiczone        string `json:"publiczone"`
+	Timeout           string `json:"timeout"`
+	Usageinterface    string `json:"usageinterface"`
+	Username          string `json:"username"`
+	Zoneid            string `json:"zoneid"`
+}
+
+type ConfigurePaloAltoFirewallParams struct {
+	p map[string]interface{}
+}
+
+func (p *ConfigurePaloAltoFirewallParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["fwdevicecapacity"]; found {
+		vv := strconv.FormatInt(v.(int64), 10)
+		u.Set("fwdevicecapacity", vv)
+	}
+	if v, found := p.p["fwdeviceid"]; found {
+		u.Set("fwdeviceid", v.(string))
+	}
+	return u
+}
+
+func (p *ConfigurePaloAltoFirewallParams) SetFwdevicecapacity(v int64) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["fwdevicecapacity"] = v
+	return
+}
+
+func (p *ConfigurePaloAltoFirewallParams) SetFwdeviceid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["fwdeviceid"] = v
+	return
+}
+
+// You should always use this function to get a new ConfigurePaloAltoFirewallParams instance,
+// as then you are sure you have configured all required params
+func (s *FirewallService) NewConfigurePaloAltoFirewallParams(fwdeviceid string) *ConfigurePaloAltoFirewallParams {
+	p := &ConfigurePaloAltoFirewallParams{}
+	p.p = make(map[string]interface{})
+	p.p["fwdeviceid"] = fwdeviceid
+	return p
+}
+
+// Configures a Palo Alto firewall device
+func (s *FirewallService) ConfigurePaloAltoFirewall(p *ConfigurePaloAltoFirewallParams) (*PaloAltoFirewallResponse, error) {
+	resp, err := s.cs.newRequest("configurePaloAltoFirewall", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r PaloAltoFirewallResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		b, err = convertFirewallServiceResponse(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type PaloAltoFirewallResponse struct {
+	JobID             string `json:"jobid"`
+	Fwdevicecapacity  int64  `json:"fwdevicecapacity"`
+	Fwdeviceid        string `json:"fwdeviceid"`
+	Fwdevicename      string `json:"fwdevicename"`
+	Fwdevicestate     string `json:"fwdevicestate"`
+	Ipaddress         string `json:"ipaddress"`
+	Numretries        string `json:"numretries"`
+	Physicalnetworkid string `json:"physicalnetworkid"`
+	Privateinterface  string `json:"privateinterface"`
+	Privatezone       string `json:"privatezone"`
+	Provider          string `json:"provider"`
+	Publicinterface   string `json:"publicinterface"`
+	Publiczone        string `json:"publiczone"`
+	Timeout           string `json:"timeout"`
+	Usageinterface    string `json:"usageinterface"`
+	Username          string `json:"username"`
+	Zoneid            string `json:"zoneid"`
+}
+
+type ConfigureSrxFirewallParams struct {
+	p map[string]interface{}
+}
+
+func (p *ConfigureSrxFirewallParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["fwdevicecapacity"]; found {
+		vv := strconv.FormatInt(v.(int64), 10)
+		u.Set("fwdevicecapacity", vv)
+	}
+	if v, found := p.p["fwdeviceid"]; found {
+		u.Set("fwdeviceid", v.(string))
+	}
+	return u
+}
+
+func (p *ConfigureSrxFirewallParams) SetFwdevicecapacity(v int64) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["fwdevicecapacity"] = v
+	return
+}
+
+func (p *ConfigureSrxFirewallParams) SetFwdeviceid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["fwdeviceid"] = v
+	return
+}
+
+// You should always use this function to get a new ConfigureSrxFirewallParams instance,
+// as then you are sure you have configured all required params
+func (s *FirewallService) NewConfigureSrxFirewallParams(fwdeviceid string) *ConfigureSrxFirewallParams {
+	p := &ConfigureSrxFirewallParams{}
+	p.p = make(map[string]interface{})
+	p.p["fwdeviceid"] = fwdeviceid
+	return p
+}
+
+// Configures a SRX firewall device
+func (s *FirewallService) ConfigureSrxFirewall(p *ConfigureSrxFirewallParams) (*SrxFirewallResponse, error) {
+	resp, err := s.cs.newRequest("configureSrxFirewall", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r SrxFirewallResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		b, err = convertFirewallServiceResponse(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type SrxFirewallResponse struct {
+	JobID             string `json:"jobid"`
+	Fwdevicecapacity  int64  `json:"fwdevicecapacity"`
+	Fwdeviceid        string `json:"fwdeviceid"`
+	Fwdevicename      string `json:"fwdevicename"`
+	Fwdevicestate     string `json:"fwdevicestate"`
+	Ipaddress         string `json:"ipaddress"`
+	Numretries        string `json:"numretries"`
+	Physicalnetworkid string `json:"physicalnetworkid"`
+	Privateinterface  string `json:"privateinterface"`
+	Privatezone       string `json:"privatezone"`
+	Provider          string `json:"provider"`
+	Publicinterface   string `json:"publicinterface"`
+	Publiczone        string `json:"publiczone"`
+	Timeout           string `json:"timeout"`
+	Usageinterface    string `json:"usageinterface"`
+	Username          string `json:"username"`
+	Zoneid            string `json:"zoneid"`
+}
+
+type CreateEgressFirewallRuleParams struct {
+	p map[string]interface{}
+}
+
+func (p *CreateEgressFirewallRuleParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["cidrlist"]; found {
+		vv := strings.Join(v.([]string), ",")
+		u.Set("cidrlist", vv)
+	}
+	if v, found := p.p["endport"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("endport", vv)
+	}
+	if v, found := p.p["fordisplay"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("fordisplay", vv)
+	}
+	if v, found := p.p["icmpcode"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("icmpcode", vv)
+	}
+	if v, found := p.p["icmptype"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("icmptype", vv)
+	}
+	if v, found := p.p["networkid"]; found {
+		u.Set("networkid", v.(string))
+	}
+	if v, found := p.p["protocol"]; found {
+		u.Set("protocol", v.(string))
+	}
+	if v, found := p.p["startport"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("startport", vv)
+	}
+	if v, found := p.p["type"]; found {
+		u.Set("type", v.(string))
+	}
+	return u
+}
+
+func (p *CreateEgressFirewallRuleParams) SetCidrlist(v []string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["cidrlist"] = v
+	return
+}
+
+func (p *CreateEgressFirewallRuleParams) SetEndport(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["endport"] = v
+	return
+}
+
+func (p *CreateEgressFirewallRuleParams) SetFordisplay(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["fordisplay"] = v
+	return
+}
+
+func (p *CreateEgressFirewallRuleParams) SetIcmpcode(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["icmpcode"] = v
+	return
+}
+
+func (p *CreateEgressFirewallRuleParams) SetIcmptype(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["icmptype"] = v
+	return
+}
+
+func (p *CreateEgressFirewallRuleParams) SetNetworkid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["networkid"] = v
+	return
+}
+
+func (p *CreateEgressFirewallRuleParams) SetProtocol(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["protocol"] = v
+	return
+}
+
+func (p *CreateEgressFirewallRuleParams) SetStartport(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["startport"] = v
+	return
+}
+
+func (p *CreateEgressFirewallRuleParams) SetType(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["type"] = v
+	return
+}
+
+// You should always use this function to get a new CreateEgressFirewallRuleParams instance,
+// as then you are sure you have configured all required params
+func (s *FirewallService) NewCreateEgressFirewallRuleParams(networkid string, protocol string) *CreateEgressFirewallRuleParams {
+	p := &CreateEgressFirewallRuleParams{}
+	p.p = make(map[string]interface{})
+	p.p["networkid"] = networkid
+	p.p["protocol"] = protocol
+	return p
+}
+
+// Creates a egress firewall rule for a given network
+func (s *FirewallService) CreateEgressFirewallRule(p *CreateEgressFirewallRuleParams) (*CreateEgressFirewallRuleResponse, error) {
+	resp, err := s.cs.newRequest("createEgressFirewallRule", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r CreateEgressFirewallRuleResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		b, err = convertFirewallServiceResponse(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type CreateEgressFirewallRuleResponse struct {
+	JobID       string `json:"jobid"`
+	Cidrlist    string `json:"cidrlist"`
+	Endport     int    `json:"endport"`
+	Fordisplay  bool   `json:"fordisplay"`
+	Icmpcode    int    `json:"icmpcode"`
+	Icmptype    int    `json:"icmptype"`
+	Id          string `json:"id"`
+	Ipaddress   string `json:"ipaddress"`
+	Ipaddressid string `json:"ipaddressid"`
+	Networkid   string `json:"networkid"`
+	Protocol    string `json:"protocol"`
+	Startport   int    `json:"startport"`
+	State       string `json:"state"`
+	Tags        []struct {
+		Account      string `json:"account"`
+		Customer     string `json:"customer"`
+		Domain       string `json:"domain"`
+		Domainid     string `json:"domainid"`
+		Key          string `json:"key"`
+		Project      string `json:"project"`
+		Projectid    string `json:"projectid"`
+		Resourceid   string `json:"resourceid"`
+		Resourcetype string `json:"resourcetype"`
+		Value        string `json:"value"`
+	} `json:"tags"`
+}
+
+type CreateFirewallRuleParams struct {
+	p map[string]interface{}
+}
+
+func (p *CreateFirewallRuleParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["cidrlist"]; found {
+		vv := strings.Join(v.([]string), ",")
+		u.Set("cidrlist", vv)
+	}
+	if v, found := p.p["endport"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("endport", vv)
+	}
+	if v, found := p.p["fordisplay"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("fordisplay", vv)
+	}
+	if v, found := p.p["icmpcode"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("icmpcode", vv)
+	}
+	if v, found := p.p["icmptype"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("icmptype", vv)
+	}
+	if v, found := p.p["ipaddressid"]; found {
+		u.Set("ipaddressid", v.(string))
+	}
+	if v, found := p.p["protocol"]; found {
+		u.Set("protocol", v.(string))
+	}
+	if v, found := p.p["startport"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("startport", vv)
+	}
+	if v, found := p.p["type"]; found {
+		u.Set("type", v.(string))
+	}
+	return u
+}
+
+func (p *CreateFirewallRuleParams) SetCidrlist(v []string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["cidrlist"] = v
+	return
+}
+
+func (p *CreateFirewallRuleParams) SetEndport(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["endport"] = v
+	return
+}
+
+func (p *CreateFirewallRuleParams) SetFordisplay(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["fordisplay"] = v
+	return
+}
+
+func (p *CreateFirewallRuleParams) SetIcmpcode(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["icmpcode"] = v
+	return
+}
+
+func (p *CreateFirewallRuleParams) SetIcmptype(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["icmptype"] = v
+	return
+}
+
+func (p *CreateFirewallRuleParams) SetIpaddressid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["ipaddressid"] = v
+	return
+}
+
+func (p *CreateFirewallRuleParams) SetProtocol(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["protocol"] = v
+	return
+}
+
+func (p *CreateFirewallRuleParams) SetStartport(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["startport"] = v
+	return
+}
+
+func (p *CreateFirewallRuleParams) SetType(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["type"] = v
+	return
+}
+
+// You should always use this function to get a new CreateFirewallRuleParams instance,
+// as then you are sure you have configured all required params
+func (s *FirewallService) NewCreateFirewallRuleParams(ipaddressid string, protocol string) *CreateFirewallRuleParams {
+	p := &CreateFirewallRuleParams{}
+	p.p = make(map[string]interface{})
+	p.p["ipaddressid"] = ipaddressid
+	p.p["protocol"] = protocol
+	return p
+}
+
+// Creates a firewall rule for a given IP address
+func (s *FirewallService) CreateFirewallRule(p *CreateFirewallRuleParams) (*CreateFirewallRuleResponse, error) {
+	resp, err := s.cs.newRequest("createFirewallRule", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r CreateFirewallRuleResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		b, err = convertFirewallServiceResponse(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type CreateFirewallRuleResponse struct {
+	JobID       string `json:"jobid"`
+	Cidrlist    string `json:"cidrlist"`
+	Endport     int    `json:"endport"`
+	Fordisplay  bool   `json:"fordisplay"`
+	Icmpcode    int    `json:"icmpcode"`
+	Icmptype    int    `json:"icmptype"`
+	Id          string `json:"id"`
+	Ipaddress   string `json:"ipaddress"`
+	Ipaddressid string `json:"ipaddressid"`
+	Networkid   string `json:"networkid"`
+	Protocol    string `json:"protocol"`
+	Startport   int    `json:"startport"`
+	State       string `json:"state"`
+	Tags        []struct {
+		Account      string `json:"account"`
+		Customer     string `json:"customer"`
+		Domain       string `json:"domain"`
+		Domainid     string `json:"domainid"`
+		Key          string `json:"key"`
+		Project      string `json:"project"`
+		Projectid    string `json:"projectid"`
+		Resourceid   string `json:"resourceid"`
+		Resourcetype string `json:"resourcetype"`
+		Value        string `json:"value"`
+	} `json:"tags"`
+}
+
+type CreatePortForwardingRuleParams struct {
+	p map[string]interface{}
+}
+
+func (p *CreatePortForwardingRuleParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["cidrlist"]; found {
+		vv := strings.Join(v.([]string), ",")
+		u.Set("cidrlist", vv)
+	}
+	if v, found := p.p["fordisplay"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("fordisplay", vv)
+	}
+	if v, found := p.p["ipaddressid"]; found {
+		u.Set("ipaddressid", v.(string))
+	}
+	if v, found := p.p["networkid"]; found {
+		u.Set("networkid", v.(string))
+	}
+	if v, found := p.p["openfirewall"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("openfirewall", vv)
+	}
+	if v, found := p.p["privateendport"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("privateendport", vv)
+	}
+	if v, found := p.p["privateport"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("privateport", vv)
+	}
+	if v, found := p.p["protocol"]; found {
+		u.Set("protocol", v.(string))
+	}
+	if v, found := p.p["publicendport"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("publicendport", vv)
+	}
+	if v, found := p.p["publicport"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("publicport", vv)
+	}
+	if v, found := p.p["virtualmachineid"]; found {
+		u.Set("virtualmachineid", v.(string))
+	}
+	if v, found := p.p["vmguestip"]; found {
+		u.Set("vmguestip", v.(string))
+	}
+	return u
+}
+
+func (p *CreatePortForwardingRuleParams) SetCidrlist(v []string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["cidrlist"] = v
+	return
+}
+
+func (p *CreatePortForwardingRuleParams) SetFordisplay(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["fordisplay"] = v
+	return
+}
+
+func (p *CreatePortForwardingRuleParams) SetIpaddressid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["ipaddressid"] = v
+	return
+}
+
+func (p *CreatePortForwardingRuleParams) SetNetworkid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["networkid"] = v
+	return
+}
+
+func (p *CreatePortForwardingRuleParams) SetOpenfirewall(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["openfirewall"] = v
+	return
+}
+
+func (p *CreatePortForwardingRuleParams) SetPrivateendport(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["privateendport"] = v
+	return
+}
+
+func (p *CreatePortForwardingRuleParams) SetPrivateport(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["privateport"] = v
+	return
+}
+
+func (p *CreatePortForwardingRuleParams) SetProtocol(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["protocol"] = v
+	return
+}
+
+func (p *CreatePortForwardingRuleParams) SetPublicendport(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["publicendport"] = v
+	return
+}
+
+func (p *CreatePortForwardingRuleParams) SetPublicport(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["publicport"] = v
+	return
+}
+
+func (p *CreatePortForwardingRuleParams) SetVirtualmachineid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["virtualmachineid"] = v
+	return
+}
+
+func (p *CreatePortForwardingRuleParams) SetVmguestip(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["vmguestip"] = v
+	return
+}
+
+// You should always use this function to get a new CreatePortForwardingRuleParams instance,
+// as then you are sure you have configured all required params
+func (s *FirewallService) NewCreatePortForwardingRuleParams(ipaddressid string, privateport int, protocol string, publicport int, virtualmachineid string) *CreatePortForwardingRuleParams {
+	p := &CreatePortForwardingRuleParams{}
+	p.p = make(map[string]interface{})
+	p.p["ipaddressid"] = ipaddressid
+	p.p["privateport"] = privateport
+	p.p["protocol"] = protocol
+	p.p["publicport"] = publicport
+	p.p["virtualmachineid"] = virtualmachineid
+	return p
+}
+
+// Creates a port forwarding rule
+func (s *FirewallService) CreatePortForwardingRule(p *CreatePortForwardingRuleParams) (*CreatePortForwardingRuleResponse, error) {
+	resp, err := s.cs.newRequest("createPortForwardingRule", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r CreatePortForwardingRuleResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		b, err = convertFirewallServiceResponse(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type CreatePortForwardingRuleResponse struct {
+	JobID          string `json:"jobid"`
+	Cidrlist       string `json:"cidrlist"`
+	Fordisplay     bool   `json:"fordisplay"`
+	Id             string `json:"id"`
+	Ipaddress      string `json:"ipaddress"`
+	Ipaddressid    string `json:"ipaddressid"`
+	Networkid      string `json:"networkid"`
+	Privateendport string `json:"privateendport"`
+	Privateport    string `json:"privateport"`
+	Protocol       string `json:"protocol"`
+	Publicendport  string `json:"publicendport"`
+	Publicport     string `json:"publicport"`
+	State          string `json:"state"`
+	Tags           []struct {
+		Account      string `json:"account"`
+		Customer     string `json:"customer"`
+		Domain       string `json:"domain"`
+		Domainid     string `json:"domainid"`
+		Key          string `json:"key"`
+		Project      string `json:"project"`
+		Projectid    string `json:"projectid"`
+		Resourceid   string `json:"resourceid"`
+		Resourcetype string `json:"resourcetype"`
+		Value        string `json:"value"`
+	} `json:"tags"`
+	Virtualmachinedisplayname string `json:"virtualmachinedisplayname"`
+	Virtualmachineid          string `json:"virtualmachineid"`
+	Virtualmachinename        string `json:"virtualmachinename"`
+	Vmguestip                 string `json:"vmguestip"`
+}
+
+type DeleteEgressFirewallRuleParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeleteEgressFirewallRuleParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *DeleteEgressFirewallRuleParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new DeleteEgressFirewallRuleParams instance,
+// as then you are sure you have configured all required params
+func (s *FirewallService) NewDeleteEgressFirewallRuleParams(id string) *DeleteEgressFirewallRuleParams {
+	p := &DeleteEgressFirewallRuleParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Deletes an egress firewall rule
+func (s *FirewallService) DeleteEgressFirewallRule(p *DeleteEgressFirewallRuleParams) (*DeleteEgressFirewallRuleResponse, error) {
+	resp, err := s.cs.newRequest("deleteEgressFirewallRule", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeleteEgressFirewallRuleResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = convertFirewallServiceResponse(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type DeleteEgressFirewallRuleResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
+
+type DeleteFirewallRuleParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeleteFirewallRuleParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *DeleteFirewallRuleParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new DeleteFirewallRuleParams instance,
+// as then you are sure you have configured all required params
+func (s *FirewallService) NewDeleteFirewallRuleParams(id string) *DeleteFirewallRuleParams {
+	p := &DeleteFirewallRuleParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Deletes a firewall rule
+func (s *FirewallService) DeleteFirewallRule(p *DeleteFirewallRuleParams) (*DeleteFirewallRuleResponse, error) {
+	resp, err := s.cs.newRequest("deleteFirewallRule", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeleteFirewallRuleResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = convertFirewallServiceResponse(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type DeleteFirewallRuleResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
+
+type DeletePaloAltoFirewallParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeletePaloAltoFirewallParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["fwdeviceid"]; found {
+		u.Set("fwdeviceid", v.(string))
+	}
+	return u
+}
+
+func (p *DeletePaloAltoFirewallParams) SetFwdeviceid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["fwdeviceid"] = v
+	return
+}
+
+// You should always use this function to get a new DeletePaloAltoFirewallParams instance,
+// as then you are sure you have configured all required params
+func (s *FirewallService) NewDeletePaloAltoFirewallParams(fwdeviceid string) *DeletePaloAltoFirewallParams {
+	p := &DeletePaloAltoFirewallParams{}
+	p.p = make(map[string]interface{})
+	p.p["fwdeviceid"] = fwdeviceid
+	return p
+}
+
+//  delete a Palo Alto firewall device
+func (s *FirewallService) DeletePaloAltoFirewall(p *DeletePaloAltoFirewallParams) (*DeletePaloAltoFirewallResponse, error) {
+	resp, err := s.cs.newRequest("deletePaloAltoFirewall", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeletePaloAltoFirewallResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = convertFirewallServiceResponse(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type DeletePaloAltoFirewallResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
+
+type DeletePortForwardingRuleParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeletePortForwardingRuleParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *DeletePortForwardingRuleParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new DeletePortForwardingRuleParams instance,
+// as then you are sure you have configured all required params
+func (s *FirewallService) NewDeletePortForwardingRuleParams(id string) *DeletePortForwardingRuleParams {
+	p := &DeletePortForwardingRuleParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Deletes a port forwarding rule
+func (s *FirewallService) DeletePortForwardingRule(p *DeletePortForwardingRuleParams) (*DeletePortForwardingRuleResponse, error) {
+	resp, err := s.cs.newRequest("deletePortForwardingRule", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeletePortForwardingRuleResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = convertFirewallServiceResponse(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type DeletePortForwardingRuleResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
+
+type DeleteSrxFirewallParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeleteSrxFirewallParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["fwdeviceid"]; found {
+		u.Set("fwdeviceid", v.(string))
+	}
+	return u
+}
+
+func (p *DeleteSrxFirewallParams) SetFwdeviceid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["fwdeviceid"] = v
+	return
+}
+
+// You should always use this function to get a new DeleteSrxFirewallParams instance,
+// as then you are sure you have configured all required params
+func (s *FirewallService) NewDeleteSrxFirewallParams(fwdeviceid string) *DeleteSrxFirewallParams {
+	p := &DeleteSrxFirewallParams{}
+	p.p = make(map[string]interface{})
+	p.p["fwdeviceid"] = fwdeviceid
+	return p
+}
+
+//  delete a SRX firewall device
+func (s *FirewallService) DeleteSrxFirewall(p *DeleteSrxFirewallParams) (*DeleteSrxFirewallResponse, error) {
+	resp, err := s.cs.newRequest("deleteSrxFirewall", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeleteSrxFirewallResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = convertFirewallServiceResponse(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type DeleteSrxFirewallResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
+
+type ListEgressFirewallRulesParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListEgressFirewallRulesParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["fordisplay"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("fordisplay", vv)
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["ipaddressid"]; found {
+		u.Set("ipaddressid", v.(string))
+	}
+	if v, found := p.p["isrecursive"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("isrecursive", vv)
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["listall"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("listall", vv)
+	}
+	if v, found := p.p["networkid"]; found {
+		u.Set("networkid", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["projectid"]; found {
+		u.Set("projectid", v.(string))
+	}
+	if v, found := p.p["tags"]; found {
+		i := 0
+		for k, vv := range v.(map[string]string) {
+			u.Set(fmt.Sprintf("tags[%d].key", i), k)
+			u.Set(fmt.Sprintf("tags[%d].value", i), vv)
+			i++
+		}
+	}
+	return u
+}
+
+func (p *ListEgressFirewallRulesParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *ListEgressFirewallRulesParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *ListEgressFirewallRulesParams) SetFordisplay(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["fordisplay"] = v
+	return
+}
+
+func (p *ListEgressFirewallRulesParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ListEgressFirewallRulesParams) SetIpaddressid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["ipaddressid"] = v
+	return
+}
+
+func (p *ListEgressFirewallRulesParams) SetIsrecursive(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isrecursive"] = v
+	return
+}
+
+func (p *ListEgressFirewallRulesParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListEgressFirewallRulesParams) SetListall(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["listall"] = v
+	return
+}
+
+func (p *ListEgressFirewallRulesParams) SetNetworkid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["networkid"] = v
+	return
+}
+
+func (p *ListEgressFirewallRulesParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListEgressFirewallRulesParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListEgressFirewallRulesParams) SetProjectid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectid"] = v
+	return
+}
+
+func (p *ListEgressFirewallRulesParams) SetTags(v map[string]string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["tags"] = v
+	return
+}
+
+// You should always use this function to get a new ListEgressFirewallRulesParams instance,
+// as then you are sure you have configured all required params
+func (s *FirewallService) NewListEgressFirewallRulesParams() *ListEgressFirewallRulesParams {
+	p := &ListEgressFirewallRulesParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *FirewallService) GetEgressFirewallRuleByID(id string, opts ...OptionFunc) (*EgressFirewallRule, int, error) {
+	p := &ListEgressFirewallRulesParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["id"] = id
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return nil, -1, err
+		}
+	}
+
+	l, err := s.ListEgressFirewallRules(p)
+	if err != nil {
+		if strings.Contains(err.Error(), fmt.Sprintf(
+			"Invalid parameter id value=%s due to incorrect long value format, "+
+				"or entity does not exist", id)) {
+			return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
+		}
+		return nil, -1, err
+	}
+
+	if l.Count == 0 {
+		return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
+	}
+
+	if l.Count == 1 {
+		return l.EgressFirewallRules[0], l.Count, nil
+	}
+	return nil, l.Count, fmt.Errorf("There is more then one result for EgressFirewallRule UUID: %s!", id)
+}
+
+// Lists all egress firewall rules for network ID.
+func (s *FirewallService) ListEgressFirewallRules(p *ListEgressFirewallRulesParams) (*ListEgressFirewallRulesResponse, error) {
+	resp, err := s.cs.newRequest("listEgressFirewallRules", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	resp, err = convertFirewallServiceResponse(resp)
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListEgressFirewallRulesResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListEgressFirewallRulesResponse struct {
+	Count               int                   `json:"count"`
+	EgressFirewallRules []*EgressFirewallRule `json:"firewallrule"`
+}
+
+type EgressFirewallRule struct {
+	Cidrlist    string `json:"cidrlist"`
+	Endport     int    `json:"endport"`
+	Fordisplay  bool   `json:"fordisplay"`
+	Icmpcode    int    `json:"icmpcode"`
+	Icmptype    int    `json:"icmptype"`
+	Id          string `json:"id"`
+	Ipaddress   string `json:"ipaddress"`
+	Ipaddressid string `json:"ipaddressid"`
+	Networkid   string `json:"networkid"`
+	Protocol    string `json:"protocol"`
+	Startport   int    `json:"startport"`
+	State       string `json:"state"`
+	Tags        []struct {
+		Account      string `json:"account"`
+		Customer     string `json:"customer"`
+		Domain       string `json:"domain"`
+		Domainid     string `json:"domainid"`
+		Key          string `json:"key"`
+		Project      string `json:"project"`
+		Projectid    string `json:"projectid"`
+		Resourceid   string `json:"resourceid"`
+		Resourcetype string `json:"resourcetype"`
+		Value        string `json:"value"`
+	} `json:"tags"`
+}
+
+type ListFirewallRulesParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListFirewallRulesParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["fordisplay"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("fordisplay", vv)
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["ipaddressid"]; found {
+		u.Set("ipaddressid", v.(string))
+	}
+	if v, found := p.p["isrecursive"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("isrecursive", vv)
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["listall"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("listall", vv)
+	}
+	if v, found := p.p["networkid"]; found {
+		u.Set("networkid", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["projectid"]; found {
+		u.Set("projectid", v.(string))
+	}
+	if v, found := p.p["tags"]; found {
+		i := 0
+		for k, vv := range v.(map[string]string) {
+			u.Set(fmt.Sprintf("tags[%d].key", i), k)
+			u.Set(fmt.Sprintf("tags[%d].value", i), vv)
+			i++
+		}
+	}
+	return u
+}
+
+func (p *ListFirewallRulesParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *ListFirewallRulesParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *ListFirewallRulesParams) SetFordisplay(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["fordisplay"] = v
+	return
+}
+
+func (p *ListFirewallRulesParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ListFirewallRulesParams) SetIpaddressid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["ipaddressid"] = v
+	return
+}
+
+func (p *ListFirewallRulesParams) SetIsrecursive(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isrecursive"] = v
+	return
+}
+
+func (p *ListFirewallRulesParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListFirewallRulesParams) SetListall(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["listall"] = v
+	return
+}
+
+func (p *ListFirewallRulesParams) SetNetworkid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["networkid"] = v
+	return
+}
+
+func (p *ListFirewallRulesParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListFirewallRulesParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListFirewallRulesParams) SetProjectid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectid"] = v
+	return
+}
+
+func (p *ListFirewallRulesParams) SetTags(v map[string]string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["tags"] = v
+	return
+}
+
+// You should always use this function to get a new ListFirewallRulesParams instance,
+// as then you are sure you have configured all required params
+func (s *FirewallService) NewListFirewallRulesParams() *ListFirewallRulesParams {
+	p := &ListFirewallRulesParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *FirewallService) GetFirewallRuleByID(id string, opts ...OptionFunc) (*FirewallRule, int, error) {
+	p := &ListFirewallRulesParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["id"] = id
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return nil, -1, err
+		}
+	}
+
+	l, err := s.ListFirewallRules(p)
+	if err != nil {
+		if strings.Contains(err.Error(), fmt.Sprintf(
+			"Invalid parameter id value=%s due to incorrect long value format, "+
+				"or entity does not exist", id)) {
+			return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
+		}
+		return nil, -1, err
+	}
+
+	if l.Count == 0 {
+		return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
+	}
+
+	if l.Count == 1 {
+		return l.FirewallRules[0], l.Count, nil
+	}
+	return nil, l.Count, fmt.Errorf("There is more then one result for FirewallRule UUID: %s!", id)
+}
+
+// Lists all firewall rules for an IP address.
+func (s *FirewallService) ListFirewallRules(p *ListFirewallRulesParams) (*ListFirewallRulesResponse, error) {
+	resp, err := s.cs.newRequest("listFirewallRules", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	resp, err = convertFirewallServiceResponse(resp)
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListFirewallRulesResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListFirewallRulesResponse struct {
+	Count         int             `json:"count"`
+	FirewallRules []*FirewallRule `json:"firewallrule"`
+}
+
+type FirewallRule struct {
+	Cidrlist    string `json:"cidrlist"`
+	Endport     int    `json:"endport"`
+	Fordisplay  bool   `json:"fordisplay"`
+	Icmpcode    int    `json:"icmpcode"`
+	Icmptype    int    `json:"icmptype"`
+	Id          string `json:"id"`
+	Ipaddress   string `json:"ipaddress"`
+	Ipaddressid string `json:"ipaddressid"`
+	Networkid   string `json:"networkid"`
+	Protocol    string `json:"protocol"`
+	Startport   int    `json:"startport"`
+	State       string `json:"state"`
+	Tags        []struct {
+		Account      string `json:"account"`
+		Customer     string `json:"customer"`
+		Domain       string `json:"domain"`
+		Domainid     string `json:"domainid"`
+		Key          string `json:"key"`
+		Project      string `json:"project"`
+		Projectid    string `json:"projectid"`
+		Resourceid   string `json:"resourceid"`
+		Resourcetype string `json:"resourcetype"`
+		Value        string `json:"value"`
+	} `json:"tags"`
+}
+
+type ListPaloAltoFirewallsParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListPaloAltoFirewallsParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["fwdeviceid"]; found {
+		u.Set("fwdeviceid", v.(string))
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["physicalnetworkid"]; found {
+		u.Set("physicalnetworkid", v.(string))
+	}
+	return u
+}
+
+func (p *ListPaloAltoFirewallsParams) SetFwdeviceid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["fwdeviceid"] = v
+	return
+}
+
+func (p *ListPaloAltoFirewallsParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListPaloAltoFirewallsParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListPaloAltoFirewallsParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListPaloAltoFirewallsParams) SetPhysicalnetworkid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["physicalnetworkid"] = v
+	return
+}
+
+// You should always use this function to get a new ListPaloAltoFirewallsParams instance,
+// as then you are sure you have configured all required params
+func (s *FirewallService) NewListPaloAltoFirewallsParams() *ListPaloAltoFirewallsParams {
+	p := &ListPaloAltoFirewallsParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// lists Palo Alto firewall devices in a physical network
+func (s *FirewallService) ListPaloAltoFirewalls(p *ListPaloAltoFirewallsParams) (*ListPaloAltoFirewallsResponse, error) {
+	resp, err := s.cs.newRequest("listPaloAltoFirewalls", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	resp, err = convertFirewallServiceResponse(resp)
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListPaloAltoFirewallsResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListPaloAltoFirewallsResponse struct {
+	Count             int                 `json:"count"`
+	PaloAltoFirewalls []*PaloAltoFirewall `json:"paloaltofirewall"`
+}
+
+type PaloAltoFirewall struct {
+	Fwdevicecapacity  int64  `json:"fwdevicecapacity"`
+	Fwdeviceid        string `json:"fwdeviceid"`
+	Fwdevicename      string `json:"fwdevicename"`
+	Fwdevicestate     string `json:"fwdevicestate"`
+	Ipaddress         string `json:"ipaddress"`
+	Numretries        string `json:"numretries"`
+	Physicalnetworkid string `json:"physicalnetworkid"`
+	Privateinterface  string `json:"privateinterface"`
+	Privatezone       string `json:"privatezone"`
+	Provider          string `json:"provider"`
+	Publicinterface   string `json:"publicinterface"`
+	Publiczone        string `json:"publiczone"`
+	Timeout           string `json:"timeout"`
+	Usageinterface    string `json:"usageinterface"`
+	Username          string `json:"username"`
+	Zoneid            string `json:"zoneid"`
+}
+
+type ListPortForwardingRulesParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListPortForwardingRulesParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["fordisplay"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("fordisplay", vv)
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["ipaddressid"]; found {
+		u.Set("ipaddressid", v.(string))
+	}
+	if v, found := p.p["isrecursive"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("isrecursive", vv)
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["listall"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("listall", vv)
+	}
+	if v, found := p.p["networkid"]; found {
+		u.Set("networkid", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["projectid"]; found {
+		u.Set("projectid", v.(string))
+	}
+	if v, found := p.p["tags"]; found {
+		i := 0
+		for k, vv := range v.(map[string]string) {
+			u.Set(fmt.Sprintf("tags[%d].key", i), k)
+			u.Set(fmt.Sprintf("tags[%d].value", i), vv)
+			i++
+		}
+	}
+	return u
+}
+
+func (p *ListPortForwardingRulesParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *ListPortForwardingRulesParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *ListPortForwardingRulesParams) SetFordisplay(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["fordisplay"] = v
+	return
+}
+
+func (p *ListPortForwardingRulesParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ListPortForwardingRulesParams) SetIpaddressid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["ipaddressid"] = v
+	return
+}
+
+func (p *ListPortForwardingRulesParams) SetIsrecursive(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isrecursive"] = v
+	return
+}
+
+func (p *ListPortForwardingRulesParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListPortForwardingRulesParams) SetListall(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["listall"] = v
+	return
+}
+
+func (p *ListPortForwardingRulesParams) SetNetworkid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["networkid"] = v
+	return
+}
+
+func (p *ListPortForwardingRulesParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListPortForwardingRulesParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListPortForwardingRulesParams) SetProjectid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectid"] = v
+	return
+}
+
+func (p *ListPortForwardingRulesParams) SetTags(v map[string]string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["tags"] = v
+	return
+}
+
+// You should always use this function to get a new ListPortForwardingRulesParams instance,
+// as then you are sure you have configured all required params
+func (s *FirewallService) NewListPortForwardingRulesParams() *ListPortForwardingRulesParams {
+	p := &ListPortForwardingRulesParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *FirewallService) GetPortForwardingRuleByID(id string, opts ...OptionFunc) (*PortForwardingRule, int, error) {
+	p := &ListPortForwardingRulesParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["id"] = id
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return nil, -1, err
+		}
+	}
+
+	l, err := s.ListPortForwardingRules(p)
+	if err != nil {
+		if strings.Contains(err.Error(), fmt.Sprintf(
+			"Invalid parameter id value=%s due to incorrect long value format, "+
+				"or entity does not exist", id)) {
+			return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
+		}
+		return nil, -1, err
+	}
+
+	if l.Count == 0 {
+		return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
+	}
+
+	if l.Count == 1 {
+		return l.PortForwardingRules[0], l.Count, nil
+	}
+	return nil, l.Count, fmt.Errorf("There is more then one result for PortForwardingRule UUID: %s!", id)
+}
+
+// Lists all port forwarding rules for an IP address.
+func (s *FirewallService) ListPortForwardingRules(p *ListPortForwardingRulesParams) (*ListPortForwardingRulesResponse, error) {
+	resp, err := s.cs.newRequest("listPortForwardingRules", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	resp, err = convertFirewallServiceResponse(resp)
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListPortForwardingRulesResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListPortForwardingRulesResponse struct {
+	Count               int                   `json:"count"`
+	PortForwardingRules []*PortForwardingRule `json:"portforwardingrule"`
+}
+
+type PortForwardingRule struct {
+	Cidrlist       string `json:"cidrlist"`
+	Fordisplay     bool   `json:"fordisplay"`
+	Id             string `json:"id"`
+	Ipaddress      string `json:"ipaddress"`
+	Ipaddressid    string `json:"ipaddressid"`
+	Networkid      string `json:"networkid"`
+	Privateendport string `json:"privateendport"`
+	Privateport    string `json:"privateport"`
+	Protocol       string `json:"protocol"`
+	Publicendport  string `json:"publicendport"`
+	Publicport     string `json:"publicport"`
+	State          string `json:"state"`
+	Tags           []struct {
+		Account      string `json:"account"`
+		Customer     string `json:"customer"`
+		Domain       string `json:"domain"`
+		Domainid     string `json:"domainid"`
+		Key          string `json:"key"`
+		Project      string `json:"project"`
+		Projectid    string `json:"projectid"`
+		Resourceid   string `json:"resourceid"`
+		Resourcetype string `json:"resourcetype"`
+		Value        string `json:"value"`
+	} `json:"tags"`
+	Virtualmachinedisplayname string `json:"virtualmachinedisplayname"`
+	Virtualmachineid          string `json:"virtualmachineid"`
+	Virtualmachinename        string `json:"virtualmachinename"`
+	Vmguestip                 string `json:"vmguestip"`
+}
+
+type ListSrxFirewallsParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListSrxFirewallsParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["fwdeviceid"]; found {
+		u.Set("fwdeviceid", v.(string))
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["physicalnetworkid"]; found {
+		u.Set("physicalnetworkid", v.(string))
+	}
+	return u
+}
+
+func (p *ListSrxFirewallsParams) SetFwdeviceid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["fwdeviceid"] = v
+	return
+}
+
+func (p *ListSrxFirewallsParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListSrxFirewallsParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListSrxFirewallsParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListSrxFirewallsParams) SetPhysicalnetworkid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["physicalnetworkid"] = v
+	return
+}
+
+// You should always use this function to get a new ListSrxFirewallsParams instance,
+// as then you are sure you have configured all required params
+func (s *FirewallService) NewListSrxFirewallsParams() *ListSrxFirewallsParams {
+	p := &ListSrxFirewallsParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// lists SRX firewall devices in a physical network
+func (s *FirewallService) ListSrxFirewalls(p *ListSrxFirewallsParams) (*ListSrxFirewallsResponse, error) {
+	resp, err := s.cs.newRequest("listSrxFirewalls", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	resp, err = convertFirewallServiceResponse(resp)
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListSrxFirewallsResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListSrxFirewallsResponse struct {
+	Count        int            `json:"count"`
+	SrxFirewalls []*SrxFirewall `json:"srxfirewall"`
+}
+
+type SrxFirewall struct {
+	Fwdevicecapacity  int64  `json:"fwdevicecapacity"`
+	Fwdeviceid        string `json:"fwdeviceid"`
+	Fwdevicename      string `json:"fwdevicename"`
+	Fwdevicestate     string `json:"fwdevicestate"`
+	Ipaddress         string `json:"ipaddress"`
+	Numretries        string `json:"numretries"`
+	Physicalnetworkid string `json:"physicalnetworkid"`
+	Privateinterface  string `json:"privateinterface"`
+	Privatezone       string `json:"privatezone"`
+	Provider          string `json:"provider"`
+	Publicinterface   string `json:"publicinterface"`
+	Publiczone        string `json:"publiczone"`
+	Timeout           string `json:"timeout"`
+	Usageinterface    string `json:"usageinterface"`
+	Username          string `json:"username"`
+	Zoneid            string `json:"zoneid"`
+}
+
+type UpdateEgressFirewallRuleParams struct {
+	p map[string]interface{}
+}
+
+func (p *UpdateEgressFirewallRuleParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["customid"]; found {
+		u.Set("customid", v.(string))
+	}
+	if v, found := p.p["fordisplay"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("fordisplay", vv)
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *UpdateEgressFirewallRuleParams) SetCustomid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["customid"] = v
+	return
+}
+
+func (p *UpdateEgressFirewallRuleParams) SetFordisplay(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["fordisplay"] = v
+	return
+}
+
+func (p *UpdateEgressFirewallRuleParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new UpdateEgressFirewallRuleParams instance,
+// as then you are sure you have configured all required params
+func (s *FirewallService) NewUpdateEgressFirewallRuleParams(id string) *UpdateEgressFirewallRuleParams {
+	p := &UpdateEgressFirewallRuleParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Updates egress firewall rule
+func (s *FirewallService) UpdateEgressFirewallRule(p *UpdateEgressFirewallRuleParams) (*UpdateEgressFirewallRuleResponse, error) {
+	resp, err := s.cs.newRequest("updateEgressFirewallRule", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r UpdateEgressFirewallRuleResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		b, err = convertFirewallServiceResponse(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type UpdateEgressFirewallRuleResponse struct {
+	JobID       string `json:"jobid"`
+	Cidrlist    string `json:"cidrlist"`
+	Endport     int    `json:"endport"`
+	Fordisplay  bool   `json:"fordisplay"`
+	Icmpcode    int    `json:"icmpcode"`
+	Icmptype    int    `json:"icmptype"`
+	Id          string `json:"id"`
+	Ipaddress   string `json:"ipaddress"`
+	Ipaddressid string `json:"ipaddressid"`
+	Networkid   string `json:"networkid"`
+	Protocol    string `json:"protocol"`
+	Startport   int    `json:"startport"`
+	State       string `json:"state"`
+	Tags        []struct {
+		Account      string `json:"account"`
+		Customer     string `json:"customer"`
+		Domain       string `json:"domain"`
+		Domainid     string `json:"domainid"`
+		Key          string `json:"key"`
+		Project      string `json:"project"`
+		Projectid    string `json:"projectid"`
+		Resourceid   string `json:"resourceid"`
+		Resourcetype string `json:"resourcetype"`
+		Value        string `json:"value"`
+	} `json:"tags"`
+}
+
+type UpdateFirewallRuleParams struct {
+	p map[string]interface{}
+}
+
+func (p *UpdateFirewallRuleParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["customid"]; found {
+		u.Set("customid", v.(string))
+	}
+	if v, found := p.p["fordisplay"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("fordisplay", vv)
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *UpdateFirewallRuleParams) SetCustomid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["customid"] = v
+	return
+}
+
+func (p *UpdateFirewallRuleParams) SetFordisplay(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["fordisplay"] = v
+	return
+}
+
+func (p *UpdateFirewallRuleParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new UpdateFirewallRuleParams instance,
+// as then you are sure you have configured all required params
+func (s *FirewallService) NewUpdateFirewallRuleParams(id string) *UpdateFirewallRuleParams {
+	p := &UpdateFirewallRuleParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Updates firewall rule
+func (s *FirewallService) UpdateFirewallRule(p *UpdateFirewallRuleParams) (*UpdateFirewallRuleResponse, error) {
+	resp, err := s.cs.newRequest("updateFirewallRule", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r UpdateFirewallRuleResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		b, err = convertFirewallServiceResponse(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type UpdateFirewallRuleResponse struct {
+	JobID       string `json:"jobid"`
+	Cidrlist    string `json:"cidrlist"`
+	Endport     int    `json:"endport"`
+	Fordisplay  bool   `json:"fordisplay"`
+	Icmpcode    int    `json:"icmpcode"`
+	Icmptype    int    `json:"icmptype"`
+	Id          string `json:"id"`
+	Ipaddress   string `json:"ipaddress"`
+	Ipaddressid string `json:"ipaddressid"`
+	Networkid   string `json:"networkid"`
+	Protocol    string `json:"protocol"`
+	Startport   int    `json:"startport"`
+	State       string `json:"state"`
+	Tags        []struct {
+		Account      string `json:"account"`
+		Customer     string `json:"customer"`
+		Domain       string `json:"domain"`
+		Domainid     string `json:"domainid"`
+		Key          string `json:"key"`
+		Project      string `json:"project"`
+		Projectid    string `json:"projectid"`
+		Resourceid   string `json:"resourceid"`
+		Resourcetype string `json:"resourcetype"`
+		Value        string `json:"value"`
+	} `json:"tags"`
+}
+
+type UpdatePortForwardingRuleParams struct {
+	p map[string]interface{}
+}
+
+func (p *UpdatePortForwardingRuleParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["customid"]; found {
+		u.Set("customid", v.(string))
+	}
+	if v, found := p.p["fordisplay"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("fordisplay", vv)
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["privateport"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("privateport", vv)
+	}
+	if v, found := p.p["virtualmachineid"]; found {
+		u.Set("virtualmachineid", v.(string))
+	}
+	if v, found := p.p["vmguestip"]; found {
+		u.Set("vmguestip", v.(string))
+	}
+	return u
+}
+
+func (p *UpdatePortForwardingRuleParams) SetCustomid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["customid"] = v
+	return
+}
+
+func (p *UpdatePortForwardingRuleParams) SetFordisplay(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["fordisplay"] = v
+	return
+}
+
+func (p *UpdatePortForwardingRuleParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *UpdatePortForwardingRuleParams) SetPrivateport(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["privateport"] = v
+	return
+}
+
+func (p *UpdatePortForwardingRuleParams) SetVirtualmachineid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["virtualmachineid"] = v
+	return
+}
+
+func (p *UpdatePortForwardingRuleParams) SetVmguestip(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["vmguestip"] = v
+	return
+}
+
+// You should always use this function to get a new UpdatePortForwardingRuleParams instance,
+// as then you are sure you have configured all required params
+func (s *FirewallService) NewUpdatePortForwardingRuleParams(id string) *UpdatePortForwardingRuleParams {
+	p := &UpdatePortForwardingRuleParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Updates a port forwarding rule. Only the private port and the virtual machine can be updated.
+func (s *FirewallService) UpdatePortForwardingRule(p *UpdatePortForwardingRuleParams) (*UpdatePortForwardingRuleResponse, error) {
+	resp, err := s.cs.newRequest("updatePortForwardingRule", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r UpdatePortForwardingRuleResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		b, err = convertFirewallServiceResponse(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type UpdatePortForwardingRuleResponse struct {
+	JobID          string `json:"jobid"`
+	Cidrlist       string `json:"cidrlist"`
+	Fordisplay     bool   `json:"fordisplay"`
+	Id             string `json:"id"`
+	Ipaddress      string `json:"ipaddress"`
+	Ipaddressid    string `json:"ipaddressid"`
+	Networkid      string `json:"networkid"`
+	Privateendport string `json:"privateendport"`
+	Privateport    string `json:"privateport"`
+	Protocol       string `json:"protocol"`
+	Publicendport  string `json:"publicendport"`
+	Publicport     string `json:"publicport"`
+	State          string `json:"state"`
+	Tags           []struct {
+		Account      string `json:"account"`
+		Customer     string `json:"customer"`
+		Domain       string `json:"domain"`
+		Domainid     string `json:"domainid"`
+		Key          string `json:"key"`
+		Project      string `json:"project"`
+		Projectid    string `json:"projectid"`
+		Resourceid   string `json:"resourceid"`
+		Resourcetype string `json:"resourcetype"`
+		Value        string `json:"value"`
+	} `json:"tags"`
+	Virtualmachinedisplayname string `json:"virtualmachinedisplayname"`
+	Virtualmachineid          string `json:"virtualmachineid"`
+	Virtualmachinename        string `json:"virtualmachinename"`
+	Vmguestip                 string `json:"vmguestip"`
+}
diff --git a/vendor/github.com/xanzy/go-cloudstack/cloudstack/GuestOSService.go b/vendor/github.com/xanzy/go-cloudstack/cloudstack/GuestOSService.go
new file mode 100644
index 0000000..84ea9c7
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/cloudstack/GuestOSService.go
@@ -0,0 +1,1055 @@
+//
+// Copyright 2018, Sander van Harmelen
+//
+// Licensed 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 cloudstack
+
+import (
+	"encoding/json"
+	"fmt"
+	"net/url"
+	"strconv"
+	"strings"
+)
+
+type AddGuestOsParams struct {
+	p map[string]interface{}
+}
+
+func (p *AddGuestOsParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["oscategoryid"]; found {
+		u.Set("oscategoryid", v.(string))
+	}
+	if v, found := p.p["osdisplayname"]; found {
+		u.Set("osdisplayname", v.(string))
+	}
+	return u
+}
+
+func (p *AddGuestOsParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *AddGuestOsParams) SetOscategoryid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["oscategoryid"] = v
+	return
+}
+
+func (p *AddGuestOsParams) SetOsdisplayname(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["osdisplayname"] = v
+	return
+}
+
+// You should always use this function to get a new AddGuestOsParams instance,
+// as then you are sure you have configured all required params
+func (s *GuestOSService) NewAddGuestOsParams(oscategoryid string, osdisplayname string) *AddGuestOsParams {
+	p := &AddGuestOsParams{}
+	p.p = make(map[string]interface{})
+	p.p["oscategoryid"] = oscategoryid
+	p.p["osdisplayname"] = osdisplayname
+	return p
+}
+
+// Add a new guest OS type
+func (s *GuestOSService) AddGuestOs(p *AddGuestOsParams) (*AddGuestOsResponse, error) {
+	resp, err := s.cs.newRequest("addGuestOs", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r AddGuestOsResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type AddGuestOsResponse struct {
+	JobID         string `json:"jobid"`
+	Description   string `json:"description"`
+	Id            string `json:"id"`
+	Isuserdefined string `json:"isuserdefined"`
+	Oscategoryid  string `json:"oscategoryid"`
+}
+
+type AddGuestOsMappingParams struct {
+	p map[string]interface{}
+}
+
+func (p *AddGuestOsMappingParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["hypervisor"]; found {
+		u.Set("hypervisor", v.(string))
+	}
+	if v, found := p.p["hypervisorversion"]; found {
+		u.Set("hypervisorversion", v.(string))
+	}
+	if v, found := p.p["osdisplayname"]; found {
+		u.Set("osdisplayname", v.(string))
+	}
+	if v, found := p.p["osnameforhypervisor"]; found {
+		u.Set("osnameforhypervisor", v.(string))
+	}
+	if v, found := p.p["ostypeid"]; found {
+		u.Set("ostypeid", v.(string))
+	}
+	return u
+}
+
+func (p *AddGuestOsMappingParams) SetHypervisor(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["hypervisor"] = v
+	return
+}
+
+func (p *AddGuestOsMappingParams) SetHypervisorversion(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["hypervisorversion"] = v
+	return
+}
+
+func (p *AddGuestOsMappingParams) SetOsdisplayname(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["osdisplayname"] = v
+	return
+}
+
+func (p *AddGuestOsMappingParams) SetOsnameforhypervisor(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["osnameforhypervisor"] = v
+	return
+}
+
+func (p *AddGuestOsMappingParams) SetOstypeid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["ostypeid"] = v
+	return
+}
+
+// You should always use this function to get a new AddGuestOsMappingParams instance,
+// as then you are sure you have configured all required params
+func (s *GuestOSService) NewAddGuestOsMappingParams(hypervisor string, hypervisorversion string, osnameforhypervisor string) *AddGuestOsMappingParams {
+	p := &AddGuestOsMappingParams{}
+	p.p = make(map[string]interface{})
+	p.p["hypervisor"] = hypervisor
+	p.p["hypervisorversion"] = hypervisorversion
+	p.p["osnameforhypervisor"] = osnameforhypervisor
+	return p
+}
+
+// Adds a guest OS name to hypervisor OS name mapping
+func (s *GuestOSService) AddGuestOsMapping(p *AddGuestOsMappingParams) (*AddGuestOsMappingResponse, error) {
+	resp, err := s.cs.newRequest("addGuestOsMapping", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r AddGuestOsMappingResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type AddGuestOsMappingResponse struct {
+	JobID               string `json:"jobid"`
+	Hypervisor          string `json:"hypervisor"`
+	Hypervisorversion   string `json:"hypervisorversion"`
+	Id                  string `json:"id"`
+	Isuserdefined       string `json:"isuserdefined"`
+	Osdisplayname       string `json:"osdisplayname"`
+	Osnameforhypervisor string `json:"osnameforhypervisor"`
+	Ostypeid            string `json:"ostypeid"`
+}
+
+type ListGuestOsMappingParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListGuestOsMappingParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["hypervisor"]; found {
+		u.Set("hypervisor", v.(string))
+	}
+	if v, found := p.p["hypervisorversion"]; found {
+		u.Set("hypervisorversion", v.(string))
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["ostypeid"]; found {
+		u.Set("ostypeid", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	return u
+}
+
+func (p *ListGuestOsMappingParams) SetHypervisor(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["hypervisor"] = v
+	return
+}
+
+func (p *ListGuestOsMappingParams) SetHypervisorversion(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["hypervisorversion"] = v
+	return
+}
+
+func (p *ListGuestOsMappingParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ListGuestOsMappingParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListGuestOsMappingParams) SetOstypeid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["ostypeid"] = v
+	return
+}
+
+func (p *ListGuestOsMappingParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListGuestOsMappingParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+// You should always use this function to get a new ListGuestOsMappingParams instance,
+// as then you are sure you have configured all required params
+func (s *GuestOSService) NewListGuestOsMappingParams() *ListGuestOsMappingParams {
+	p := &ListGuestOsMappingParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *GuestOSService) GetGuestOsMappingByID(id string, opts ...OptionFunc) (*GuestOsMapping, int, error) {
+	p := &ListGuestOsMappingParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["id"] = id
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return nil, -1, err
+		}
+	}
+
+	l, err := s.ListGuestOsMapping(p)
+	if err != nil {
+		if strings.Contains(err.Error(), fmt.Sprintf(
+			"Invalid parameter id value=%s due to incorrect long value format, "+
+				"or entity does not exist", id)) {
+			return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
+		}
+		return nil, -1, err
+	}
+
+	if l.Count == 0 {
+		return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
+	}
+
+	if l.Count == 1 {
+		return l.GuestOsMapping[0], l.Count, nil
+	}
+	return nil, l.Count, fmt.Errorf("There is more then one result for GuestOsMapping UUID: %s!", id)
+}
+
+// Lists all available OS mappings for given hypervisor
+func (s *GuestOSService) ListGuestOsMapping(p *ListGuestOsMappingParams) (*ListGuestOsMappingResponse, error) {
+	resp, err := s.cs.newRequest("listGuestOsMapping", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListGuestOsMappingResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListGuestOsMappingResponse struct {
+	Count          int               `json:"count"`
+	GuestOsMapping []*GuestOsMapping `json:"guestosmapping"`
+}
+
+type GuestOsMapping struct {
+	Hypervisor          string `json:"hypervisor"`
+	Hypervisorversion   string `json:"hypervisorversion"`
+	Id                  string `json:"id"`
+	Isuserdefined       string `json:"isuserdefined"`
+	Osdisplayname       string `json:"osdisplayname"`
+	Osnameforhypervisor string `json:"osnameforhypervisor"`
+	Ostypeid            string `json:"ostypeid"`
+}
+
+type ListOsCategoriesParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListOsCategoriesParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	return u
+}
+
+func (p *ListOsCategoriesParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ListOsCategoriesParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListOsCategoriesParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *ListOsCategoriesParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListOsCategoriesParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+// You should always use this function to get a new ListOsCategoriesParams instance,
+// as then you are sure you have configured all required params
+func (s *GuestOSService) NewListOsCategoriesParams() *ListOsCategoriesParams {
+	p := &ListOsCategoriesParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *GuestOSService) GetOsCategoryID(name string, opts ...OptionFunc) (string, int, error) {
+	p := &ListOsCategoriesParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["name"] = name
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return "", -1, err
+		}
+	}
+
+	l, err := s.ListOsCategories(p)
+	if err != nil {
+		return "", -1, err
+	}
+
+	if l.Count == 0 {
+		return "", l.Count, fmt.Errorf("No match found for %s: %+v", name, l)
+	}
+
+	if l.Count == 1 {
+		return l.OsCategories[0].Id, l.Count, nil
+	}
+
+	if l.Count > 1 {
+		for _, v := range l.OsCategories {
+			if v.Name == name {
+				return v.Id, l.Count, nil
+			}
+		}
+	}
+	return "", l.Count, fmt.Errorf("Could not find an exact match for %s: %+v", name, l)
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *GuestOSService) GetOsCategoryByName(name string, opts ...OptionFunc) (*OsCategory, int, error) {
+	id, count, err := s.GetOsCategoryID(name, opts...)
+	if err != nil {
+		return nil, count, err
+	}
+
+	r, count, err := s.GetOsCategoryByID(id, opts...)
+	if err != nil {
+		return nil, count, err
+	}
+	return r, count, nil
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *GuestOSService) GetOsCategoryByID(id string, opts ...OptionFunc) (*OsCategory, int, error) {
+	p := &ListOsCategoriesParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["id"] = id
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return nil, -1, err
+		}
+	}
+
+	l, err := s.ListOsCategories(p)
+	if err != nil {
+		if strings.Contains(err.Error(), fmt.Sprintf(
+			"Invalid parameter id value=%s due to incorrect long value format, "+
+				"or entity does not exist", id)) {
+			return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
+		}
+		return nil, -1, err
+	}
+
+	if l.Count == 0 {
+		return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
+	}
+
+	if l.Count == 1 {
+		return l.OsCategories[0], l.Count, nil
+	}
+	return nil, l.Count, fmt.Errorf("There is more then one result for OsCategory UUID: %s!", id)
+}
+
+// Lists all supported OS categories for this cloud.
+func (s *GuestOSService) ListOsCategories(p *ListOsCategoriesParams) (*ListOsCategoriesResponse, error) {
+	resp, err := s.cs.newRequest("listOsCategories", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListOsCategoriesResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListOsCategoriesResponse struct {
+	Count        int           `json:"count"`
+	OsCategories []*OsCategory `json:"oscategory"`
+}
+
+type OsCategory struct {
+	Id   string `json:"id"`
+	Name string `json:"name"`
+}
+
+type ListOsTypesParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListOsTypesParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["description"]; found {
+		u.Set("description", v.(string))
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["oscategoryid"]; found {
+		u.Set("oscategoryid", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	return u
+}
+
+func (p *ListOsTypesParams) SetDescription(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["description"] = v
+	return
+}
+
+func (p *ListOsTypesParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ListOsTypesParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListOsTypesParams) SetOscategoryid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["oscategoryid"] = v
+	return
+}
+
+func (p *ListOsTypesParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListOsTypesParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+// You should always use this function to get a new ListOsTypesParams instance,
+// as then you are sure you have configured all required params
+func (s *GuestOSService) NewListOsTypesParams() *ListOsTypesParams {
+	p := &ListOsTypesParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *GuestOSService) GetOsTypeByID(id string, opts ...OptionFunc) (*OsType, int, error) {
+	p := &ListOsTypesParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["id"] = id
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return nil, -1, err
+		}
+	}
+
+	l, err := s.ListOsTypes(p)
+	if err != nil {
+		if strings.Contains(err.Error(), fmt.Sprintf(
+			"Invalid parameter id value=%s due to incorrect long value format, "+
+				"or entity does not exist", id)) {
+			return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
+		}
+		return nil, -1, err
+	}
+
+	if l.Count == 0 {
+		return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
+	}
+
+	if l.Count == 1 {
+		return l.OsTypes[0], l.Count, nil
+	}
+	return nil, l.Count, fmt.Errorf("There is more then one result for OsType UUID: %s!", id)
+}
+
+// Lists all supported OS types for this cloud.
+func (s *GuestOSService) ListOsTypes(p *ListOsTypesParams) (*ListOsTypesResponse, error) {
+	resp, err := s.cs.newRequest("listOsTypes", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListOsTypesResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListOsTypesResponse struct {
+	Count   int       `json:"count"`
+	OsTypes []*OsType `json:"ostype"`
+}
+
+type OsType struct {
+	Description   string `json:"description"`
+	Id            string `json:"id"`
+	Isuserdefined string `json:"isuserdefined"`
+	Oscategoryid  string `json:"oscategoryid"`
+}
+
+type RemoveGuestOsParams struct {
+	p map[string]interface{}
+}
+
+func (p *RemoveGuestOsParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *RemoveGuestOsParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new RemoveGuestOsParams instance,
+// as then you are sure you have configured all required params
+func (s *GuestOSService) NewRemoveGuestOsParams(id string) *RemoveGuestOsParams {
+	p := &RemoveGuestOsParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Removes a Guest OS from listing.
+func (s *GuestOSService) RemoveGuestOs(p *RemoveGuestOsParams) (*RemoveGuestOsResponse, error) {
+	resp, err := s.cs.newRequest("removeGuestOs", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r RemoveGuestOsResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type RemoveGuestOsResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
+
+type RemoveGuestOsMappingParams struct {
+	p map[string]interface{}
+}
+
+func (p *RemoveGuestOsMappingParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *RemoveGuestOsMappingParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new RemoveGuestOsMappingParams instance,
+// as then you are sure you have configured all required params
+func (s *GuestOSService) NewRemoveGuestOsMappingParams(id string) *RemoveGuestOsMappingParams {
+	p := &RemoveGuestOsMappingParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Removes a Guest OS Mapping.
+func (s *GuestOSService) RemoveGuestOsMapping(p *RemoveGuestOsMappingParams) (*RemoveGuestOsMappingResponse, error) {
+	resp, err := s.cs.newRequest("removeGuestOsMapping", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r RemoveGuestOsMappingResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type RemoveGuestOsMappingResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
+
+type UpdateGuestOsParams struct {
+	p map[string]interface{}
+}
+
+func (p *UpdateGuestOsParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["osdisplayname"]; found {
+		u.Set("osdisplayname", v.(string))
+	}
+	return u
+}
+
+func (p *UpdateGuestOsParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *UpdateGuestOsParams) SetOsdisplayname(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["osdisplayname"] = v
+	return
+}
+
+// You should always use this function to get a new UpdateGuestOsParams instance,
+// as then you are sure you have configured all required params
+func (s *GuestOSService) NewUpdateGuestOsParams(id string, osdisplayname string) *UpdateGuestOsParams {
+	p := &UpdateGuestOsParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	p.p["osdisplayname"] = osdisplayname
+	return p
+}
+
+// Updates the information about Guest OS
+func (s *GuestOSService) UpdateGuestOs(p *UpdateGuestOsParams) (*UpdateGuestOsResponse, error) {
+	resp, err := s.cs.newRequest("updateGuestOs", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r UpdateGuestOsResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type UpdateGuestOsResponse struct {
+	JobID         string `json:"jobid"`
+	Description   string `json:"description"`
+	Id            string `json:"id"`
+	Isuserdefined string `json:"isuserdefined"`
+	Oscategoryid  string `json:"oscategoryid"`
+}
+
+type UpdateGuestOsMappingParams struct {
+	p map[string]interface{}
+}
+
+func (p *UpdateGuestOsMappingParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["osnameforhypervisor"]; found {
+		u.Set("osnameforhypervisor", v.(string))
+	}
+	return u
+}
+
+func (p *UpdateGuestOsMappingParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *UpdateGuestOsMappingParams) SetOsnameforhypervisor(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["osnameforhypervisor"] = v
+	return
+}
+
+// You should always use this function to get a new UpdateGuestOsMappingParams instance,
+// as then you are sure you have configured all required params
+func (s *GuestOSService) NewUpdateGuestOsMappingParams(id string, osnameforhypervisor string) *UpdateGuestOsMappingParams {
+	p := &UpdateGuestOsMappingParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	p.p["osnameforhypervisor"] = osnameforhypervisor
+	return p
+}
+
+// Updates the information about Guest OS to Hypervisor specific name mapping
+func (s *GuestOSService) UpdateGuestOsMapping(p *UpdateGuestOsMappingParams) (*UpdateGuestOsMappingResponse, error) {
+	resp, err := s.cs.newRequest("updateGuestOsMapping", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r UpdateGuestOsMappingResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type UpdateGuestOsMappingResponse struct {
+	JobID               string `json:"jobid"`
+	Hypervisor          string `json:"hypervisor"`
+	Hypervisorversion   string `json:"hypervisorversion"`
+	Id                  string `json:"id"`
+	Isuserdefined       string `json:"isuserdefined"`
+	Osdisplayname       string `json:"osdisplayname"`
+	Osnameforhypervisor string `json:"osnameforhypervisor"`
+	Ostypeid            string `json:"ostypeid"`
+}
diff --git a/vendor/github.com/xanzy/go-cloudstack/cloudstack/HostService.go b/vendor/github.com/xanzy/go-cloudstack/cloudstack/HostService.go
new file mode 100644
index 0000000..1832d4a
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/cloudstack/HostService.go
@@ -0,0 +1,2507 @@
+//
+// Copyright 2018, Sander van Harmelen
+//
+// Licensed 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 cloudstack
+
+import (
+	"encoding/json"
+	"fmt"
+	"net/url"
+	"strconv"
+	"strings"
+)
+
+type AddBaremetalHostParams struct {
+	p map[string]interface{}
+}
+
+func (p *AddBaremetalHostParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["allocationstate"]; found {
+		u.Set("allocationstate", v.(string))
+	}
+	if v, found := p.p["clusterid"]; found {
+		u.Set("clusterid", v.(string))
+	}
+	if v, found := p.p["clustername"]; found {
+		u.Set("clustername", v.(string))
+	}
+	if v, found := p.p["hosttags"]; found {
+		vv := strings.Join(v.([]string), ",")
+		u.Set("hosttags", vv)
+	}
+	if v, found := p.p["hypervisor"]; found {
+		u.Set("hypervisor", v.(string))
+	}
+	if v, found := p.p["ipaddress"]; found {
+		u.Set("ipaddress", v.(string))
+	}
+	if v, found := p.p["password"]; found {
+		u.Set("password", v.(string))
+	}
+	if v, found := p.p["podid"]; found {
+		u.Set("podid", v.(string))
+	}
+	if v, found := p.p["url"]; found {
+		u.Set("url", v.(string))
+	}
+	if v, found := p.p["username"]; found {
+		u.Set("username", v.(string))
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *AddBaremetalHostParams) SetAllocationstate(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["allocationstate"] = v
+	return
+}
+
+func (p *AddBaremetalHostParams) SetClusterid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["clusterid"] = v
+	return
+}
+
+func (p *AddBaremetalHostParams) SetClustername(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["clustername"] = v
+	return
+}
+
+func (p *AddBaremetalHostParams) SetHosttags(v []string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["hosttags"] = v
+	return
+}
+
+func (p *AddBaremetalHostParams) SetHypervisor(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["hypervisor"] = v
+	return
+}
+
+func (p *AddBaremetalHostParams) SetIpaddress(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["ipaddress"] = v
+	return
+}
+
+func (p *AddBaremetalHostParams) SetPassword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["password"] = v
+	return
+}
+
+func (p *AddBaremetalHostParams) SetPodid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["podid"] = v
+	return
+}
+
+func (p *AddBaremetalHostParams) SetUrl(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["url"] = v
+	return
+}
+
+func (p *AddBaremetalHostParams) SetUsername(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["username"] = v
+	return
+}
+
+func (p *AddBaremetalHostParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new AddBaremetalHostParams instance,
+// as then you are sure you have configured all required params
+func (s *HostService) NewAddBaremetalHostParams(hypervisor string, password string, podid string, url string, username string, zoneid string) *AddBaremetalHostParams {
+	p := &AddBaremetalHostParams{}
+	p.p = make(map[string]interface{})
+	p.p["hypervisor"] = hypervisor
+	p.p["password"] = password
+	p.p["podid"] = podid
+	p.p["url"] = url
+	p.p["username"] = username
+	p.p["zoneid"] = zoneid
+	return p
+}
+
+// add a baremetal host
+func (s *HostService) AddBaremetalHost(p *AddBaremetalHostParams) (*AddBaremetalHostResponse, error) {
+	resp, err := s.cs.newRequest("addBaremetalHost", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r AddBaremetalHostResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type AddBaremetalHostResponse struct {
+	Averageload             int64             `json:"averageload"`
+	Capabilities            string            `json:"capabilities"`
+	Clusterid               string            `json:"clusterid"`
+	Clustername             string            `json:"clustername"`
+	Clustertype             string            `json:"clustertype"`
+	Cpuallocated            string            `json:"cpuallocated"`
+	Cpunumber               int               `json:"cpunumber"`
+	Cpusockets              int               `json:"cpusockets"`
+	Cpuspeed                int64             `json:"cpuspeed"`
+	Cpuused                 string            `json:"cpuused"`
+	Cpuwithoverprovisioning string            `json:"cpuwithoverprovisioning"`
+	Created                 string            `json:"created"`
+	Details                 map[string]string `json:"details"`
+	Disconnected            string            `json:"disconnected"`
+	Disksizeallocated       int64             `json:"disksizeallocated"`
+	Disksizetotal           int64             `json:"disksizetotal"`
+	Events                  string            `json:"events"`
+	Gpugroup                []struct {
+		Gpugroupname string `json:"gpugroupname"`
+		Vgpu         []struct {
+			Maxcapacity       int64  `json:"maxcapacity"`
+			Maxheads          int64  `json:"maxheads"`
+			Maxresolutionx    int64  `json:"maxresolutionx"`
+			Maxresolutiony    int64  `json:"maxresolutiony"`
+			Maxvgpuperpgpu    int64  `json:"maxvgpuperpgpu"`
+			Remainingcapacity int64  `json:"remainingcapacity"`
+			Vgputype          string `json:"vgputype"`
+			Videoram          int64  `json:"videoram"`
+		} `json:"vgpu"`
+	} `json:"gpugroup"`
+	Hahost               bool                        `json:"hahost"`
+	Hasenoughcapacity    bool                        `json:"hasenoughcapacity"`
+	Hosttags             string                      `json:"hosttags"`
+	Hypervisor           string                      `json:"hypervisor"`
+	Hypervisorversion    string                      `json:"hypervisorversion"`
+	Id                   string                      `json:"id"`
+	Ipaddress            string                      `json:"ipaddress"`
+	Islocalstorageactive bool                        `json:"islocalstorageactive"`
+	Lastpinged           string                      `json:"lastpinged"`
+	Managementserverid   int64                       `json:"managementserverid"`
+	Memoryallocated      int64                       `json:"memoryallocated"`
+	Memorytotal          int64                       `json:"memorytotal"`
+	Memoryused           int64                       `json:"memoryused"`
+	Name                 string                      `json:"name"`
+	Networkkbsread       int64                       `json:"networkkbsread"`
+	Networkkbswrite      int64                       `json:"networkkbswrite"`
+	Oscategoryid         string                      `json:"oscategoryid"`
+	Oscategoryname       string                      `json:"oscategoryname"`
+	Outofbandmanagement  OutOfBandManagementResponse `json:"outofbandmanagement"`
+	Podid                string                      `json:"podid"`
+	Podname              string                      `json:"podname"`
+	Removed              string                      `json:"removed"`
+	Resourcestate        string                      `json:"resourcestate"`
+	State                string                      `json:"state"`
+	Suitableformigration bool                        `json:"suitableformigration"`
+	Type                 string                      `json:"type"`
+	Version              string                      `json:"version"`
+	Zoneid               string                      `json:"zoneid"`
+	Zonename             string                      `json:"zonename"`
+}
+
+type AddGloboDnsHostParams struct {
+	p map[string]interface{}
+}
+
+func (p *AddGloboDnsHostParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["password"]; found {
+		u.Set("password", v.(string))
+	}
+	if v, found := p.p["physicalnetworkid"]; found {
+		u.Set("physicalnetworkid", v.(string))
+	}
+	if v, found := p.p["url"]; found {
+		u.Set("url", v.(string))
+	}
+	if v, found := p.p["username"]; found {
+		u.Set("username", v.(string))
+	}
+	return u
+}
+
+func (p *AddGloboDnsHostParams) SetPassword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["password"] = v
+	return
+}
+
+func (p *AddGloboDnsHostParams) SetPhysicalnetworkid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["physicalnetworkid"] = v
+	return
+}
+
+func (p *AddGloboDnsHostParams) SetUrl(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["url"] = v
+	return
+}
+
+func (p *AddGloboDnsHostParams) SetUsername(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["username"] = v
+	return
+}
+
+// You should always use this function to get a new AddGloboDnsHostParams instance,
+// as then you are sure you have configured all required params
+func (s *HostService) NewAddGloboDnsHostParams(password string, physicalnetworkid string, url string, username string) *AddGloboDnsHostParams {
+	p := &AddGloboDnsHostParams{}
+	p.p = make(map[string]interface{})
+	p.p["password"] = password
+	p.p["physicalnetworkid"] = physicalnetworkid
+	p.p["url"] = url
+	p.p["username"] = username
+	return p
+}
+
+// Adds the GloboDNS external host
+func (s *HostService) AddGloboDnsHost(p *AddGloboDnsHostParams) (*AddGloboDnsHostResponse, error) {
+	resp, err := s.cs.newRequest("addGloboDnsHost", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r AddGloboDnsHostResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type AddGloboDnsHostResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
+
+type AddHostParams struct {
+	p map[string]interface{}
+}
+
+func (p *AddHostParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["allocationstate"]; found {
+		u.Set("allocationstate", v.(string))
+	}
+	if v, found := p.p["clusterid"]; found {
+		u.Set("clusterid", v.(string))
+	}
+	if v, found := p.p["clustername"]; found {
+		u.Set("clustername", v.(string))
+	}
+	if v, found := p.p["hosttags"]; found {
+		vv := strings.Join(v.([]string), ",")
+		u.Set("hosttags", vv)
+	}
+	if v, found := p.p["hypervisor"]; found {
+		u.Set("hypervisor", v.(string))
+	}
+	if v, found := p.p["password"]; found {
+		u.Set("password", v.(string))
+	}
+	if v, found := p.p["podid"]; found {
+		u.Set("podid", v.(string))
+	}
+	if v, found := p.p["url"]; found {
+		u.Set("url", v.(string))
+	}
+	if v, found := p.p["username"]; found {
+		u.Set("username", v.(string))
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *AddHostParams) SetAllocationstate(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["allocationstate"] = v
+	return
+}
+
+func (p *AddHostParams) SetClusterid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["clusterid"] = v
+	return
+}
+
+func (p *AddHostParams) SetClustername(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["clustername"] = v
+	return
+}
+
+func (p *AddHostParams) SetHosttags(v []string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["hosttags"] = v
+	return
+}
+
+func (p *AddHostParams) SetHypervisor(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["hypervisor"] = v
+	return
+}
+
+func (p *AddHostParams) SetPassword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["password"] = v
+	return
+}
+
+func (p *AddHostParams) SetPodid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["podid"] = v
+	return
+}
+
+func (p *AddHostParams) SetUrl(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["url"] = v
+	return
+}
+
+func (p *AddHostParams) SetUsername(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["username"] = v
+	return
+}
+
+func (p *AddHostParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new AddHostParams instance,
+// as then you are sure you have configured all required params
+func (s *HostService) NewAddHostParams(hypervisor string, password string, podid string, url string, username string, zoneid string) *AddHostParams {
+	p := &AddHostParams{}
+	p.p = make(map[string]interface{})
+	p.p["hypervisor"] = hypervisor
+	p.p["password"] = password
+	p.p["podid"] = podid
+	p.p["url"] = url
+	p.p["username"] = username
+	p.p["zoneid"] = zoneid
+	return p
+}
+
+// Adds a new host.
+func (s *HostService) AddHost(p *AddHostParams) (*AddHostResponse, error) {
+	resp, err := s.cs.newRequest("addHost", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r AddHostResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type AddHostResponse struct {
+	Averageload             int64             `json:"averageload"`
+	Capabilities            string            `json:"capabilities"`
+	Clusterid               string            `json:"clusterid"`
+	Clustername             string            `json:"clustername"`
+	Clustertype             string            `json:"clustertype"`
+	Cpuallocated            string            `json:"cpuallocated"`
+	Cpunumber               int               `json:"cpunumber"`
+	Cpusockets              int               `json:"cpusockets"`
+	Cpuspeed                int64             `json:"cpuspeed"`
+	Cpuused                 string            `json:"cpuused"`
+	Cpuwithoverprovisioning string            `json:"cpuwithoverprovisioning"`
+	Created                 string            `json:"created"`
+	Details                 map[string]string `json:"details"`
+	Disconnected            string            `json:"disconnected"`
+	Disksizeallocated       int64             `json:"disksizeallocated"`
+	Disksizetotal           int64             `json:"disksizetotal"`
+	Events                  string            `json:"events"`
+	Gpugroup                []struct {
+		Gpugroupname string `json:"gpugroupname"`
+		Vgpu         []struct {
+			Maxcapacity       int64  `json:"maxcapacity"`
+			Maxheads          int64  `json:"maxheads"`
+			Maxresolutionx    int64  `json:"maxresolutionx"`
+			Maxresolutiony    int64  `json:"maxresolutiony"`
+			Maxvgpuperpgpu    int64  `json:"maxvgpuperpgpu"`
+			Remainingcapacity int64  `json:"remainingcapacity"`
+			Vgputype          string `json:"vgputype"`
+			Videoram          int64  `json:"videoram"`
+		} `json:"vgpu"`
+	} `json:"gpugroup"`
+	Hahost               bool                        `json:"hahost"`
+	Hasenoughcapacity    bool                        `json:"hasenoughcapacity"`
+	Hosttags             string                      `json:"hosttags"`
+	Hypervisor           string                      `json:"hypervisor"`
+	Hypervisorversion    string                      `json:"hypervisorversion"`
+	Id                   string                      `json:"id"`
+	Ipaddress            string                      `json:"ipaddress"`
+	Islocalstorageactive bool                        `json:"islocalstorageactive"`
+	Lastpinged           string                      `json:"lastpinged"`
+	Managementserverid   int64                       `json:"managementserverid"`
+	Memoryallocated      int64                       `json:"memoryallocated"`
+	Memorytotal          int64                       `json:"memorytotal"`
+	Memoryused           int64                       `json:"memoryused"`
+	Name                 string                      `json:"name"`
+	Networkkbsread       int64                       `json:"networkkbsread"`
+	Networkkbswrite      int64                       `json:"networkkbswrite"`
+	Oscategoryid         string                      `json:"oscategoryid"`
+	Oscategoryname       string                      `json:"oscategoryname"`
+	Outofbandmanagement  OutOfBandManagementResponse `json:"outofbandmanagement"`
+	Podid                string                      `json:"podid"`
+	Podname              string                      `json:"podname"`
+	Removed              string                      `json:"removed"`
+	Resourcestate        string                      `json:"resourcestate"`
+	State                string                      `json:"state"`
+	Suitableformigration bool                        `json:"suitableformigration"`
+	Type                 string                      `json:"type"`
+	Version              string                      `json:"version"`
+	Zoneid               string                      `json:"zoneid"`
+	Zonename             string                      `json:"zonename"`
+}
+
+type AddSecondaryStorageParams struct {
+	p map[string]interface{}
+}
+
+func (p *AddSecondaryStorageParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["url"]; found {
+		u.Set("url", v.(string))
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *AddSecondaryStorageParams) SetUrl(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["url"] = v
+	return
+}
+
+func (p *AddSecondaryStorageParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new AddSecondaryStorageParams instance,
+// as then you are sure you have configured all required params
+func (s *HostService) NewAddSecondaryStorageParams(url string) *AddSecondaryStorageParams {
+	p := &AddSecondaryStorageParams{}
+	p.p = make(map[string]interface{})
+	p.p["url"] = url
+	return p
+}
+
+// Adds secondary storage.
+func (s *HostService) AddSecondaryStorage(p *AddSecondaryStorageParams) (*AddSecondaryStorageResponse, error) {
+	resp, err := s.cs.newRequest("addSecondaryStorage", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r AddSecondaryStorageResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type AddSecondaryStorageResponse struct {
+	Details      []interface{} `json:"details"`
+	Id           string        `json:"id"`
+	Name         string        `json:"name"`
+	Protocol     string        `json:"protocol"`
+	Providername string        `json:"providername"`
+	Scope        string        `json:"scope"`
+	Url          string        `json:"url"`
+	Zoneid       string        `json:"zoneid"`
+	Zonename     string        `json:"zonename"`
+}
+
+type CancelHostMaintenanceParams struct {
+	p map[string]interface{}
+}
+
+func (p *CancelHostMaintenanceParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *CancelHostMaintenanceParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new CancelHostMaintenanceParams instance,
+// as then you are sure you have configured all required params
+func (s *HostService) NewCancelHostMaintenanceParams(id string) *CancelHostMaintenanceParams {
+	p := &CancelHostMaintenanceParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Cancels host maintenance.
+func (s *HostService) CancelHostMaintenance(p *CancelHostMaintenanceParams) (*CancelHostMaintenanceResponse, error) {
+	resp, err := s.cs.newRequest("cancelHostMaintenance", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r CancelHostMaintenanceResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type CancelHostMaintenanceResponse struct {
+	JobID                   string            `json:"jobid"`
+	Averageload             int64             `json:"averageload"`
+	Capabilities            string            `json:"capabilities"`
+	Clusterid               string            `json:"clusterid"`
+	Clustername             string            `json:"clustername"`
+	Clustertype             string            `json:"clustertype"`
+	Cpuallocated            string            `json:"cpuallocated"`
+	Cpunumber               int               `json:"cpunumber"`
+	Cpusockets              int               `json:"cpusockets"`
+	Cpuspeed                int64             `json:"cpuspeed"`
+	Cpuused                 string            `json:"cpuused"`
+	Cpuwithoverprovisioning string            `json:"cpuwithoverprovisioning"`
+	Created                 string            `json:"created"`
+	Details                 map[string]string `json:"details"`
+	Disconnected            string            `json:"disconnected"`
+	Disksizeallocated       int64             `json:"disksizeallocated"`
+	Disksizetotal           int64             `json:"disksizetotal"`
+	Events                  string            `json:"events"`
+	Gpugroup                []struct {
+		Gpugroupname string `json:"gpugroupname"`
+		Vgpu         []struct {
+			Maxcapacity       int64  `json:"maxcapacity"`
+			Maxheads          int64  `json:"maxheads"`
+			Maxresolutionx    int64  `json:"maxresolutionx"`
+			Maxresolutiony    int64  `json:"maxresolutiony"`
+			Maxvgpuperpgpu    int64  `json:"maxvgpuperpgpu"`
+			Remainingcapacity int64  `json:"remainingcapacity"`
+			Vgputype          string `json:"vgputype"`
+			Videoram          int64  `json:"videoram"`
+		} `json:"vgpu"`
+	} `json:"gpugroup"`
+	Hahost               bool                        `json:"hahost"`
+	Hasenoughcapacity    bool                        `json:"hasenoughcapacity"`
+	Hosttags             string                      `json:"hosttags"`
+	Hypervisor           string                      `json:"hypervisor"`
+	Hypervisorversion    string                      `json:"hypervisorversion"`
+	Id                   string                      `json:"id"`
+	Ipaddress            string                      `json:"ipaddress"`
+	Islocalstorageactive bool                        `json:"islocalstorageactive"`
+	Lastpinged           string                      `json:"lastpinged"`
+	Managementserverid   int64                       `json:"managementserverid"`
+	Memoryallocated      int64                       `json:"memoryallocated"`
+	Memorytotal          int64                       `json:"memorytotal"`
+	Memoryused           int64                       `json:"memoryused"`
+	Name                 string                      `json:"name"`
+	Networkkbsread       int64                       `json:"networkkbsread"`
+	Networkkbswrite      int64                       `json:"networkkbswrite"`
+	Oscategoryid         string                      `json:"oscategoryid"`
+	Oscategoryname       string                      `json:"oscategoryname"`
+	Outofbandmanagement  OutOfBandManagementResponse `json:"outofbandmanagement"`
+	Podid                string                      `json:"podid"`
+	Podname              string                      `json:"podname"`
+	Removed              string                      `json:"removed"`
+	Resourcestate        string                      `json:"resourcestate"`
+	State                string                      `json:"state"`
+	Suitableformigration bool                        `json:"suitableformigration"`
+	Type                 string                      `json:"type"`
+	Version              string                      `json:"version"`
+	Zoneid               string                      `json:"zoneid"`
+	Zonename             string                      `json:"zonename"`
+}
+
+type DedicateHostParams struct {
+	p map[string]interface{}
+}
+
+func (p *DedicateHostParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["hostid"]; found {
+		u.Set("hostid", v.(string))
+	}
+	return u
+}
+
+func (p *DedicateHostParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *DedicateHostParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *DedicateHostParams) SetHostid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["hostid"] = v
+	return
+}
+
+// You should always use this function to get a new DedicateHostParams instance,
+// as then you are sure you have configured all required params
+func (s *HostService) NewDedicateHostParams(domainid string, hostid string) *DedicateHostParams {
+	p := &DedicateHostParams{}
+	p.p = make(map[string]interface{})
+	p.p["domainid"] = domainid
+	p.p["hostid"] = hostid
+	return p
+}
+
+// Dedicates a host.
+func (s *HostService) DedicateHost(p *DedicateHostParams) (*DedicateHostResponse, error) {
+	resp, err := s.cs.newRequest("dedicateHost", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DedicateHostResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type DedicateHostResponse struct {
+	JobID           string `json:"jobid"`
+	Accountid       string `json:"accountid"`
+	Affinitygroupid string `json:"affinitygroupid"`
+	Domainid        string `json:"domainid"`
+	Hostid          string `json:"hostid"`
+	Hostname        string `json:"hostname"`
+	Id              string `json:"id"`
+}
+
+type DeleteHostParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeleteHostParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["forced"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("forced", vv)
+	}
+	if v, found := p.p["forcedestroylocalstorage"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("forcedestroylocalstorage", vv)
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *DeleteHostParams) SetForced(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["forced"] = v
+	return
+}
+
+func (p *DeleteHostParams) SetForcedestroylocalstorage(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["forcedestroylocalstorage"] = v
+	return
+}
+
+func (p *DeleteHostParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new DeleteHostParams instance,
+// as then you are sure you have configured all required params
+func (s *HostService) NewDeleteHostParams(id string) *DeleteHostParams {
+	p := &DeleteHostParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Deletes a host.
+func (s *HostService) DeleteHost(p *DeleteHostParams) (*DeleteHostResponse, error) {
+	resp, err := s.cs.newRequest("deleteHost", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeleteHostResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type DeleteHostResponse struct {
+	Displaytext string `json:"displaytext"`
+	Success     string `json:"success"`
+}
+
+type DisableOutOfBandManagementForHostParams struct {
+	p map[string]interface{}
+}
+
+func (p *DisableOutOfBandManagementForHostParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["hostid"]; found {
+		u.Set("hostid", v.(string))
+	}
+	return u
+}
+
+func (p *DisableOutOfBandManagementForHostParams) SetHostid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["hostid"] = v
+	return
+}
+
+// You should always use this function to get a new DisableOutOfBandManagementForHostParams instance,
+// as then you are sure you have configured all required params
+func (s *HostService) NewDisableOutOfBandManagementForHostParams(hostid string) *DisableOutOfBandManagementForHostParams {
+	p := &DisableOutOfBandManagementForHostParams{}
+	p.p = make(map[string]interface{})
+	p.p["hostid"] = hostid
+	return p
+}
+
+// Disables out-of-band management for a host
+func (s *HostService) DisableOutOfBandManagementForHost(p *DisableOutOfBandManagementForHostParams) (*DisableOutOfBandManagementForHostResponse, error) {
+	resp, err := s.cs.newRequest("disableOutOfBandManagementForHost", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DisableOutOfBandManagementForHostResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type DisableOutOfBandManagementForHostResponse struct {
+	JobID       string `json:"jobid"`
+	Action      string `json:"action"`
+	Address     string `json:"address"`
+	Description string `json:"description"`
+	Driver      string `json:"driver"`
+	Enabled     bool   `json:"enabled"`
+	Hostid      string `json:"hostid"`
+	Password    string `json:"password"`
+	Port        string `json:"port"`
+	Powerstate  string `json:"powerstate"`
+	Status      bool   `json:"status"`
+	Username    string `json:"username"`
+}
+
+type EnableOutOfBandManagementForHostParams struct {
+	p map[string]interface{}
+}
+
+func (p *EnableOutOfBandManagementForHostParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["hostid"]; found {
+		u.Set("hostid", v.(string))
+	}
+	return u
+}
+
+func (p *EnableOutOfBandManagementForHostParams) SetHostid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["hostid"] = v
+	return
+}
+
+// You should always use this function to get a new EnableOutOfBandManagementForHostParams instance,
+// as then you are sure you have configured all required params
+func (s *HostService) NewEnableOutOfBandManagementForHostParams(hostid string) *EnableOutOfBandManagementForHostParams {
+	p := &EnableOutOfBandManagementForHostParams{}
+	p.p = make(map[string]interface{})
+	p.p["hostid"] = hostid
+	return p
+}
+
+// Enables out-of-band management for a host
+func (s *HostService) EnableOutOfBandManagementForHost(p *EnableOutOfBandManagementForHostParams) (*EnableOutOfBandManagementForHostResponse, error) {
+	resp, err := s.cs.newRequest("enableOutOfBandManagementForHost", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r EnableOutOfBandManagementForHostResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type EnableOutOfBandManagementForHostResponse struct {
+	JobID       string `json:"jobid"`
+	Action      string `json:"action"`
+	Address     string `json:"address"`
+	Description string `json:"description"`
+	Driver      string `json:"driver"`
+	Enabled     bool   `json:"enabled"`
+	Hostid      string `json:"hostid"`
+	Password    string `json:"password"`
+	Port        string `json:"port"`
+	Powerstate  string `json:"powerstate"`
+	Status      bool   `json:"status"`
+	Username    string `json:"username"`
+}
+
+type FindHostsForMigrationParams struct {
+	p map[string]interface{}
+}
+
+func (p *FindHostsForMigrationParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["virtualmachineid"]; found {
+		u.Set("virtualmachineid", v.(string))
+	}
+	return u
+}
+
+func (p *FindHostsForMigrationParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *FindHostsForMigrationParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *FindHostsForMigrationParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *FindHostsForMigrationParams) SetVirtualmachineid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["virtualmachineid"] = v
+	return
+}
+
+// You should always use this function to get a new FindHostsForMigrationParams instance,
+// as then you are sure you have configured all required params
+func (s *HostService) NewFindHostsForMigrationParams(virtualmachineid string) *FindHostsForMigrationParams {
+	p := &FindHostsForMigrationParams{}
+	p.p = make(map[string]interface{})
+	p.p["virtualmachineid"] = virtualmachineid
+	return p
+}
+
+// Find hosts suitable for migrating a virtual machine.
+func (s *HostService) FindHostsForMigration(p *FindHostsForMigrationParams) (*FindHostsForMigrationResponse, error) {
+	resp, err := s.cs.newRequest("findHostsForMigration", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r FindHostsForMigrationResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type FindHostsForMigrationResponse struct {
+	Averageload             int64  `json:"averageload"`
+	Capabilities            string `json:"capabilities"`
+	Clusterid               string `json:"clusterid"`
+	Clustername             string `json:"clustername"`
+	Clustertype             string `json:"clustertype"`
+	Cpuallocated            string `json:"cpuallocated"`
+	Cpunumber               int    `json:"cpunumber"`
+	Cpuspeed                int64  `json:"cpuspeed"`
+	Cpuused                 string `json:"cpuused"`
+	Cpuwithoverprovisioning string `json:"cpuwithoverprovisioning"`
+	Created                 string `json:"created"`
+	Disconnected            string `json:"disconnected"`
+	Disksizeallocated       int64  `json:"disksizeallocated"`
+	Disksizetotal           int64  `json:"disksizetotal"`
+	Events                  string `json:"events"`
+	Hahost                  bool   `json:"hahost"`
+	Hasenoughcapacity       bool   `json:"hasenoughcapacity"`
+	Hosttags                string `json:"hosttags"`
+	Hypervisor              string `json:"hypervisor"`
+	Hypervisorversion       string `json:"hypervisorversion"`
+	Id                      string `json:"id"`
+	Ipaddress               string `json:"ipaddress"`
+	Islocalstorageactive    bool   `json:"islocalstorageactive"`
+	Lastpinged              string `json:"lastpinged"`
+	Managementserverid      int64  `json:"managementserverid"`
+	Memoryallocated         int64  `json:"memoryallocated"`
+	Memorytotal             int64  `json:"memorytotal"`
+	Memoryused              int64  `json:"memoryused"`
+	Name                    string `json:"name"`
+	Networkkbsread          int64  `json:"networkkbsread"`
+	Networkkbswrite         int64  `json:"networkkbswrite"`
+	Oscategoryid            string `json:"oscategoryid"`
+	Oscategoryname          string `json:"oscategoryname"`
+	Podid                   string `json:"podid"`
+	Podname                 string `json:"podname"`
+	Removed                 string `json:"removed"`
+	RequiresStorageMotion   bool   `json:"requiresStorageMotion"`
+	Resourcestate           string `json:"resourcestate"`
+	State                   string `json:"state"`
+	Suitableformigration    bool   `json:"suitableformigration"`
+	Type                    string `json:"type"`
+	Version                 string `json:"version"`
+	Zoneid                  string `json:"zoneid"`
+	Zonename                string `json:"zonename"`
+}
+
+type ListDedicatedHostsParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListDedicatedHostsParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["affinitygroupid"]; found {
+		u.Set("affinitygroupid", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["hostid"]; found {
+		u.Set("hostid", v.(string))
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	return u
+}
+
+func (p *ListDedicatedHostsParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *ListDedicatedHostsParams) SetAffinitygroupid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["affinitygroupid"] = v
+	return
+}
+
+func (p *ListDedicatedHostsParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *ListDedicatedHostsParams) SetHostid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["hostid"] = v
+	return
+}
+
+func (p *ListDedicatedHostsParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListDedicatedHostsParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListDedicatedHostsParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+// You should always use this function to get a new ListDedicatedHostsParams instance,
+// as then you are sure you have configured all required params
+func (s *HostService) NewListDedicatedHostsParams() *ListDedicatedHostsParams {
+	p := &ListDedicatedHostsParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// Lists dedicated hosts.
+func (s *HostService) ListDedicatedHosts(p *ListDedicatedHostsParams) (*ListDedicatedHostsResponse, error) {
+	resp, err := s.cs.newRequest("listDedicatedHosts", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListDedicatedHostsResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListDedicatedHostsResponse struct {
+	Count          int              `json:"count"`
+	DedicatedHosts []*DedicatedHost `json:"dedicatedhost"`
+}
+
+type DedicatedHost struct {
+	Accountid       string `json:"accountid"`
+	Affinitygroupid string `json:"affinitygroupid"`
+	Domainid        string `json:"domainid"`
+	Hostid          string `json:"hostid"`
+	Hostname        string `json:"hostname"`
+	Id              string `json:"id"`
+}
+
+type ListHostTagsParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListHostTagsParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	return u
+}
+
+func (p *ListHostTagsParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListHostTagsParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListHostTagsParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+// You should always use this function to get a new ListHostTagsParams instance,
+// as then you are sure you have configured all required params
+func (s *HostService) NewListHostTagsParams() *ListHostTagsParams {
+	p := &ListHostTagsParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *HostService) GetHostTagID(keyword string, opts ...OptionFunc) (string, int, error) {
+	p := &ListHostTagsParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["keyword"] = keyword
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return "", -1, err
+		}
+	}
+
+	l, err := s.ListHostTags(p)
+	if err != nil {
+		return "", -1, err
+	}
+
+	if l.Count == 0 {
+		return "", l.Count, fmt.Errorf("No match found for %s: %+v", keyword, l)
+	}
+
+	if l.Count == 1 {
+		return l.HostTags[0].Id, l.Count, nil
+	}
+
+	if l.Count > 1 {
+		for _, v := range l.HostTags {
+			if v.Name == keyword {
+				return v.Id, l.Count, nil
+			}
+		}
+	}
+	return "", l.Count, fmt.Errorf("Could not find an exact match for %s: %+v", keyword, l)
+}
+
+// Lists host tags
+func (s *HostService) ListHostTags(p *ListHostTagsParams) (*ListHostTagsResponse, error) {
+	resp, err := s.cs.newRequest("listHostTags", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListHostTagsResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListHostTagsResponse struct {
+	Count    int        `json:"count"`
+	HostTags []*HostTag `json:"hosttag"`
+}
+
+type HostTag struct {
+	Hostid int64  `json:"hostid"`
+	Id     string `json:"id"`
+	Name   string `json:"name"`
+}
+
+type ListHostsParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListHostsParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["clusterid"]; found {
+		u.Set("clusterid", v.(string))
+	}
+	if v, found := p.p["details"]; found {
+		vv := strings.Join(v.([]string), ",")
+		u.Set("details", vv)
+	}
+	if v, found := p.p["hahost"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("hahost", vv)
+	}
+	if v, found := p.p["hypervisor"]; found {
+		u.Set("hypervisor", v.(string))
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["outofbandmanagementenabled"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("outofbandmanagementenabled", vv)
+	}
+	if v, found := p.p["outofbandmanagementpowerstate"]; found {
+		u.Set("outofbandmanagementpowerstate", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["podid"]; found {
+		u.Set("podid", v.(string))
+	}
+	if v, found := p.p["resourcestate"]; found {
+		u.Set("resourcestate", v.(string))
+	}
+	if v, found := p.p["state"]; found {
+		u.Set("state", v.(string))
+	}
+	if v, found := p.p["type"]; found {
+		u.Set("type", v.(string))
+	}
+	if v, found := p.p["virtualmachineid"]; found {
+		u.Set("virtualmachineid", v.(string))
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *ListHostsParams) SetClusterid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["clusterid"] = v
+	return
+}
+
+func (p *ListHostsParams) SetDetails(v []string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["details"] = v
+	return
+}
+
+func (p *ListHostsParams) SetHahost(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["hahost"] = v
+	return
+}
+
+func (p *ListHostsParams) SetHypervisor(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["hypervisor"] = v
+	return
+}
+
+func (p *ListHostsParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ListHostsParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListHostsParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *ListHostsParams) SetOutofbandmanagementenabled(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["outofbandmanagementenabled"] = v
+	return
+}
+
+func (p *ListHostsParams) SetOutofbandmanagementpowerstate(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["outofbandmanagementpowerstate"] = v
+	return
+}
+
+func (p *ListHostsParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListHostsParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListHostsParams) SetPodid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["podid"] = v
+	return
+}
+
+func (p *ListHostsParams) SetResourcestate(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["resourcestate"] = v
+	return
+}
+
+func (p *ListHostsParams) SetState(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["state"] = v
+	return
+}
+
+func (p *ListHostsParams) SetType(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["type"] = v
+	return
+}
+
+func (p *ListHostsParams) SetVirtualmachineid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["virtualmachineid"] = v
+	return
+}
+
+func (p *ListHostsParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new ListHostsParams instance,
+// as then you are sure you have configured all required params
+func (s *HostService) NewListHostsParams() *ListHostsParams {
+	p := &ListHostsParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *HostService) GetHostID(name string, opts ...OptionFunc) (string, int, error) {
+	p := &ListHostsParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["name"] = name
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return "", -1, err
+		}
+	}
+
+	l, err := s.ListHosts(p)
+	if err != nil {
+		return "", -1, err
+	}
+
+	if l.Count == 0 {
+		return "", l.Count, fmt.Errorf("No match found for %s: %+v", name, l)
+	}
+
+	if l.Count == 1 {
+		return l.Hosts[0].Id, l.Count, nil
+	}
+
+	if l.Count > 1 {
+		for _, v := range l.Hosts {
+			if v.Name == name {
+				return v.Id, l.Count, nil
+			}
+		}
+	}
+	return "", l.Count, fmt.Errorf("Could not find an exact match for %s: %+v", name, l)
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *HostService) GetHostByName(name string, opts ...OptionFunc) (*Host, int, error) {
+	id, count, err := s.GetHostID(name, opts...)
+	if err != nil {
+		return nil, count, err
+	}
+
+	r, count, err := s.GetHostByID(id, opts...)
+	if err != nil {
+		return nil, count, err
+	}
+	return r, count, nil
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *HostService) GetHostByID(id string, opts ...OptionFunc) (*Host, int, error) {
+	p := &ListHostsParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["id"] = id
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return nil, -1, err
+		}
+	}
+
+	l, err := s.ListHosts(p)
+	if err != nil {
+		if strings.Contains(err.Error(), fmt.Sprintf(
+			"Invalid parameter id value=%s due to incorrect long value format, "+
+				"or entity does not exist", id)) {
+			return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
+		}
+		return nil, -1, err
+	}
+
+	if l.Count == 0 {
+		return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
+	}
+
+	if l.Count == 1 {
+		return l.Hosts[0], l.Count, nil
+	}
+	return nil, l.Count, fmt.Errorf("There is more then one result for Host UUID: %s!", id)
+}
+
+// Lists hosts.
+func (s *HostService) ListHosts(p *ListHostsParams) (*ListHostsResponse, error) {
+	resp, err := s.cs.newRequest("listHosts", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListHostsResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListHostsResponse struct {
+	Count int     `json:"count"`
+	Hosts []*Host `json:"host"`
+}
+
+type Host struct {
+	Averageload             int64             `json:"averageload"`
+	Capabilities            string            `json:"capabilities"`
+	Clusterid               string            `json:"clusterid"`
+	Clustername             string            `json:"clustername"`
+	Clustertype             string            `json:"clustertype"`
+	Cpuallocated            string            `json:"cpuallocated"`
+	Cpunumber               int               `json:"cpunumber"`
+	Cpusockets              int               `json:"cpusockets"`
+	Cpuspeed                int64             `json:"cpuspeed"`
+	Cpuused                 string            `json:"cpuused"`
+	Cpuwithoverprovisioning string            `json:"cpuwithoverprovisioning"`
+	Created                 string            `json:"created"`
+	Details                 map[string]string `json:"details"`
+	Disconnected            string            `json:"disconnected"`
+	Disksizeallocated       int64             `json:"disksizeallocated"`
+	Disksizetotal           int64             `json:"disksizetotal"`
+	Events                  string            `json:"events"`
+	Gpugroup                []struct {
+		Gpugroupname string `json:"gpugroupname"`
+		Vgpu         []struct {
+			Maxcapacity       int64  `json:"maxcapacity"`
+			Maxheads          int64  `json:"maxheads"`
+			Maxresolutionx    int64  `json:"maxresolutionx"`
+			Maxresolutiony    int64  `json:"maxresolutiony"`
+			Maxvgpuperpgpu    int64  `json:"maxvgpuperpgpu"`
+			Remainingcapacity int64  `json:"remainingcapacity"`
+			Vgputype          string `json:"vgputype"`
+			Videoram          int64  `json:"videoram"`
+		} `json:"vgpu"`
+	} `json:"gpugroup"`
+	Hahost               bool                        `json:"hahost"`
+	Hasenoughcapacity    bool                        `json:"hasenoughcapacity"`
+	Hosttags             string                      `json:"hosttags"`
+	Hypervisor           string                      `json:"hypervisor"`
+	Hypervisorversion    string                      `json:"hypervisorversion"`
+	Id                   string                      `json:"id"`
+	Ipaddress            string                      `json:"ipaddress"`
+	Islocalstorageactive bool                        `json:"islocalstorageactive"`
+	Lastpinged           string                      `json:"lastpinged"`
+	Managementserverid   int64                       `json:"managementserverid"`
+	Memoryallocated      int64                       `json:"memoryallocated"`
+	Memorytotal          int64                       `json:"memorytotal"`
+	Memoryused           int64                       `json:"memoryused"`
+	Name                 string                      `json:"name"`
+	Networkkbsread       int64                       `json:"networkkbsread"`
+	Networkkbswrite      int64                       `json:"networkkbswrite"`
+	Oscategoryid         string                      `json:"oscategoryid"`
+	Oscategoryname       string                      `json:"oscategoryname"`
+	Outofbandmanagement  OutOfBandManagementResponse `json:"outofbandmanagement"`
+	Podid                string                      `json:"podid"`
+	Podname              string                      `json:"podname"`
+	Removed              string                      `json:"removed"`
+	Resourcestate        string                      `json:"resourcestate"`
+	State                string                      `json:"state"`
+	Suitableformigration bool                        `json:"suitableformigration"`
+	Type                 string                      `json:"type"`
+	Version              string                      `json:"version"`
+	Zoneid               string                      `json:"zoneid"`
+	Zonename             string                      `json:"zonename"`
+}
+
+type PrepareHostForMaintenanceParams struct {
+	p map[string]interface{}
+}
+
+func (p *PrepareHostForMaintenanceParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *PrepareHostForMaintenanceParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new PrepareHostForMaintenanceParams instance,
+// as then you are sure you have configured all required params
+func (s *HostService) NewPrepareHostForMaintenanceParams(id string) *PrepareHostForMaintenanceParams {
+	p := &PrepareHostForMaintenanceParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Prepares a host for maintenance.
+func (s *HostService) PrepareHostForMaintenance(p *PrepareHostForMaintenanceParams) (*PrepareHostForMaintenanceResponse, error) {
+	resp, err := s.cs.newRequest("prepareHostForMaintenance", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r PrepareHostForMaintenanceResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type PrepareHostForMaintenanceResponse struct {
+	JobID                   string            `json:"jobid"`
+	Averageload             int64             `json:"averageload"`
+	Capabilities            string            `json:"capabilities"`
+	Clusterid               string            `json:"clusterid"`
+	Clustername             string            `json:"clustername"`
+	Clustertype             string            `json:"clustertype"`
+	Cpuallocated            string            `json:"cpuallocated"`
+	Cpunumber               int               `json:"cpunumber"`
+	Cpusockets              int               `json:"cpusockets"`
+	Cpuspeed                int64             `json:"cpuspeed"`
+	Cpuused                 string            `json:"cpuused"`
+	Cpuwithoverprovisioning string            `json:"cpuwithoverprovisioning"`
+	Created                 string            `json:"created"`
+	Details                 map[string]string `json:"details"`
+	Disconnected            string            `json:"disconnected"`
+	Disksizeallocated       int64             `json:"disksizeallocated"`
+	Disksizetotal           int64             `json:"disksizetotal"`
+	Events                  string            `json:"events"`
+	Gpugroup                []struct {
+		Gpugroupname string `json:"gpugroupname"`
+		Vgpu         []struct {
+			Maxcapacity       int64  `json:"maxcapacity"`
+			Maxheads          int64  `json:"maxheads"`
+			Maxresolutionx    int64  `json:"maxresolutionx"`
+			Maxresolutiony    int64  `json:"maxresolutiony"`
+			Maxvgpuperpgpu    int64  `json:"maxvgpuperpgpu"`
+			Remainingcapacity int64  `json:"remainingcapacity"`
+			Vgputype          string `json:"vgputype"`
+			Videoram          int64  `json:"videoram"`
+		} `json:"vgpu"`
+	} `json:"gpugroup"`
+	Hahost               bool                        `json:"hahost"`
+	Hasenoughcapacity    bool                        `json:"hasenoughcapacity"`
+	Hosttags             string                      `json:"hosttags"`
+	Hypervisor           string                      `json:"hypervisor"`
+	Hypervisorversion    string                      `json:"hypervisorversion"`
+	Id                   string                      `json:"id"`
+	Ipaddress            string                      `json:"ipaddress"`
+	Islocalstorageactive bool                        `json:"islocalstorageactive"`
+	Lastpinged           string                      `json:"lastpinged"`
+	Managementserverid   int64                       `json:"managementserverid"`
+	Memoryallocated      int64                       `json:"memoryallocated"`
+	Memorytotal          int64                       `json:"memorytotal"`
+	Memoryused           int64                       `json:"memoryused"`
+	Name                 string                      `json:"name"`
+	Networkkbsread       int64                       `json:"networkkbsread"`
+	Networkkbswrite      int64                       `json:"networkkbswrite"`
+	Oscategoryid         string                      `json:"oscategoryid"`
+	Oscategoryname       string                      `json:"oscategoryname"`
+	Outofbandmanagement  OutOfBandManagementResponse `json:"outofbandmanagement"`
+	Podid                string                      `json:"podid"`
+	Podname              string                      `json:"podname"`
+	Removed              string                      `json:"removed"`
+	Resourcestate        string                      `json:"resourcestate"`
+	State                string                      `json:"state"`
+	Suitableformigration bool                        `json:"suitableformigration"`
+	Type                 string                      `json:"type"`
+	Version              string                      `json:"version"`
+	Zoneid               string                      `json:"zoneid"`
+	Zonename             string                      `json:"zonename"`
+}
+
+type ReconnectHostParams struct {
+	p map[string]interface{}
+}
+
+func (p *ReconnectHostParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *ReconnectHostParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new ReconnectHostParams instance,
+// as then you are sure you have configured all required params
+func (s *HostService) NewReconnectHostParams(id string) *ReconnectHostParams {
+	p := &ReconnectHostParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Reconnects a host.
+func (s *HostService) ReconnectHost(p *ReconnectHostParams) (*ReconnectHostResponse, error) {
+	resp, err := s.cs.newRequest("reconnectHost", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ReconnectHostResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type ReconnectHostResponse struct {
+	JobID                   string            `json:"jobid"`
+	Averageload             int64             `json:"averageload"`
+	Capabilities            string            `json:"capabilities"`
+	Clusterid               string            `json:"clusterid"`
+	Clustername             string            `json:"clustername"`
+	Clustertype             string            `json:"clustertype"`
+	Cpuallocated            string            `json:"cpuallocated"`
+	Cpunumber               int               `json:"cpunumber"`
+	Cpusockets              int               `json:"cpusockets"`
+	Cpuspeed                int64             `json:"cpuspeed"`
+	Cpuused                 string            `json:"cpuused"`
+	Cpuwithoverprovisioning string            `json:"cpuwithoverprovisioning"`
+	Created                 string            `json:"created"`
+	Details                 map[string]string `json:"details"`
+	Disconnected            string            `json:"disconnected"`
+	Disksizeallocated       int64             `json:"disksizeallocated"`
+	Disksizetotal           int64             `json:"disksizetotal"`
+	Events                  string            `json:"events"`
+	Gpugroup                []struct {
+		Gpugroupname string `json:"gpugroupname"`
+		Vgpu         []struct {
+			Maxcapacity       int64  `json:"maxcapacity"`
+			Maxheads          int64  `json:"maxheads"`
+			Maxresolutionx    int64  `json:"maxresolutionx"`
+			Maxresolutiony    int64  `json:"maxresolutiony"`
+			Maxvgpuperpgpu    int64  `json:"maxvgpuperpgpu"`
+			Remainingcapacity int64  `json:"remainingcapacity"`
+			Vgputype          string `json:"vgputype"`
+			Videoram          int64  `json:"videoram"`
+		} `json:"vgpu"`
+	} `json:"gpugroup"`
+	Hahost               bool                        `json:"hahost"`
+	Hasenoughcapacity    bool                        `json:"hasenoughcapacity"`
+	Hosttags             string                      `json:"hosttags"`
+	Hypervisor           string                      `json:"hypervisor"`
+	Hypervisorversion    string                      `json:"hypervisorversion"`
+	Id                   string                      `json:"id"`
+	Ipaddress            string                      `json:"ipaddress"`
+	Islocalstorageactive bool                        `json:"islocalstorageactive"`
+	Lastpinged           string                      `json:"lastpinged"`
+	Managementserverid   int64                       `json:"managementserverid"`
+	Memoryallocated      int64                       `json:"memoryallocated"`
+	Memorytotal          int64                       `json:"memorytotal"`
+	Memoryused           int64                       `json:"memoryused"`
+	Name                 string                      `json:"name"`
+	Networkkbsread       int64                       `json:"networkkbsread"`
+	Networkkbswrite      int64                       `json:"networkkbswrite"`
+	Oscategoryid         string                      `json:"oscategoryid"`
+	Oscategoryname       string                      `json:"oscategoryname"`
+	Outofbandmanagement  OutOfBandManagementResponse `json:"outofbandmanagement"`
+	Podid                string                      `json:"podid"`
+	Podname              string                      `json:"podname"`
+	Removed              string                      `json:"removed"`
+	Resourcestate        string                      `json:"resourcestate"`
+	State                string                      `json:"state"`
+	Suitableformigration bool                        `json:"suitableformigration"`
+	Type                 string                      `json:"type"`
+	Version              string                      `json:"version"`
+	Zoneid               string                      `json:"zoneid"`
+	Zonename             string                      `json:"zonename"`
+}
+
+type ReleaseDedicatedHostParams struct {
+	p map[string]interface{}
+}
+
+func (p *ReleaseDedicatedHostParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["hostid"]; found {
+		u.Set("hostid", v.(string))
+	}
+	return u
+}
+
+func (p *ReleaseDedicatedHostParams) SetHostid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["hostid"] = v
+	return
+}
+
+// You should always use this function to get a new ReleaseDedicatedHostParams instance,
+// as then you are sure you have configured all required params
+func (s *HostService) NewReleaseDedicatedHostParams(hostid string) *ReleaseDedicatedHostParams {
+	p := &ReleaseDedicatedHostParams{}
+	p.p = make(map[string]interface{})
+	p.p["hostid"] = hostid
+	return p
+}
+
+// Release the dedication for host
+func (s *HostService) ReleaseDedicatedHost(p *ReleaseDedicatedHostParams) (*ReleaseDedicatedHostResponse, error) {
+	resp, err := s.cs.newRequest("releaseDedicatedHost", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ReleaseDedicatedHostResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type ReleaseDedicatedHostResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
+
+type ReleaseHostReservationParams struct {
+	p map[string]interface{}
+}
+
+func (p *ReleaseHostReservationParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *ReleaseHostReservationParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new ReleaseHostReservationParams instance,
+// as then you are sure you have configured all required params
+func (s *HostService) NewReleaseHostReservationParams(id string) *ReleaseHostReservationParams {
+	p := &ReleaseHostReservationParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Releases host reservation.
+func (s *HostService) ReleaseHostReservation(p *ReleaseHostReservationParams) (*ReleaseHostReservationResponse, error) {
+	resp, err := s.cs.newRequest("releaseHostReservation", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ReleaseHostReservationResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type ReleaseHostReservationResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
+
+type UpdateHostParams struct {
+	p map[string]interface{}
+}
+
+func (p *UpdateHostParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["allocationstate"]; found {
+		u.Set("allocationstate", v.(string))
+	}
+	if v, found := p.p["hosttags"]; found {
+		vv := strings.Join(v.([]string), ",")
+		u.Set("hosttags", vv)
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["oscategoryid"]; found {
+		u.Set("oscategoryid", v.(string))
+	}
+	if v, found := p.p["url"]; found {
+		u.Set("url", v.(string))
+	}
+	return u
+}
+
+func (p *UpdateHostParams) SetAllocationstate(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["allocationstate"] = v
+	return
+}
+
+func (p *UpdateHostParams) SetHosttags(v []string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["hosttags"] = v
+	return
+}
+
+func (p *UpdateHostParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *UpdateHostParams) SetOscategoryid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["oscategoryid"] = v
+	return
+}
+
+func (p *UpdateHostParams) SetUrl(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["url"] = v
+	return
+}
+
+// You should always use this function to get a new UpdateHostParams instance,
+// as then you are sure you have configured all required params
+func (s *HostService) NewUpdateHostParams(id string) *UpdateHostParams {
+	p := &UpdateHostParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Updates a host.
+func (s *HostService) UpdateHost(p *UpdateHostParams) (*UpdateHostResponse, error) {
+	resp, err := s.cs.newRequest("updateHost", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r UpdateHostResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type UpdateHostResponse struct {
+	Averageload             int64             `json:"averageload"`
+	Capabilities            string            `json:"capabilities"`
+	Clusterid               string            `json:"clusterid"`
+	Clustername             string            `json:"clustername"`
+	Clustertype             string            `json:"clustertype"`
+	Cpuallocated            string            `json:"cpuallocated"`
+	Cpunumber               int               `json:"cpunumber"`
+	Cpusockets              int               `json:"cpusockets"`
+	Cpuspeed                int64             `json:"cpuspeed"`
+	Cpuused                 string            `json:"cpuused"`
+	Cpuwithoverprovisioning string            `json:"cpuwithoverprovisioning"`
+	Created                 string            `json:"created"`
+	Details                 map[string]string `json:"details"`
+	Disconnected            string            `json:"disconnected"`
+	Disksizeallocated       int64             `json:"disksizeallocated"`
+	Disksizetotal           int64             `json:"disksizetotal"`
+	Events                  string            `json:"events"`
+	Gpugroup                []struct {
+		Gpugroupname string `json:"gpugroupname"`
+		Vgpu         []struct {
+			Maxcapacity       int64  `json:"maxcapacity"`
+			Maxheads          int64  `json:"maxheads"`
+			Maxresolutionx    int64  `json:"maxresolutionx"`
+			Maxresolutiony    int64  `json:"maxresolutiony"`
+			Maxvgpuperpgpu    int64  `json:"maxvgpuperpgpu"`
+			Remainingcapacity int64  `json:"remainingcapacity"`
+			Vgputype          string `json:"vgputype"`
+			Videoram          int64  `json:"videoram"`
+		} `json:"vgpu"`
+	} `json:"gpugroup"`
+	Hahost               bool                        `json:"hahost"`
+	Hasenoughcapacity    bool                        `json:"hasenoughcapacity"`
+	Hosttags             string                      `json:"hosttags"`
+	Hypervisor           string                      `json:"hypervisor"`
+	Hypervisorversion    string                      `json:"hypervisorversion"`
+	Id                   string                      `json:"id"`
+	Ipaddress            string                      `json:"ipaddress"`
+	Islocalstorageactive bool                        `json:"islocalstorageactive"`
+	Lastpinged           string                      `json:"lastpinged"`
+	Managementserverid   int64                       `json:"managementserverid"`
+	Memoryallocated      int64                       `json:"memoryallocated"`
+	Memorytotal          int64                       `json:"memorytotal"`
+	Memoryused           int64                       `json:"memoryused"`
+	Name                 string                      `json:"name"`
+	Networkkbsread       int64                       `json:"networkkbsread"`
+	Networkkbswrite      int64                       `json:"networkkbswrite"`
+	Oscategoryid         string                      `json:"oscategoryid"`
+	Oscategoryname       string                      `json:"oscategoryname"`
+	Outofbandmanagement  OutOfBandManagementResponse `json:"outofbandmanagement"`
+	Podid                string                      `json:"podid"`
+	Podname              string                      `json:"podname"`
+	Removed              string                      `json:"removed"`
+	Resourcestate        string                      `json:"resourcestate"`
+	State                string                      `json:"state"`
+	Suitableformigration bool                        `json:"suitableformigration"`
+	Type                 string                      `json:"type"`
+	Version              string                      `json:"version"`
+	Zoneid               string                      `json:"zoneid"`
+	Zonename             string                      `json:"zonename"`
+}
+
+type UpdateHostPasswordParams struct {
+	p map[string]interface{}
+}
+
+func (p *UpdateHostPasswordParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["clusterid"]; found {
+		u.Set("clusterid", v.(string))
+	}
+	if v, found := p.p["hostid"]; found {
+		u.Set("hostid", v.(string))
+	}
+	if v, found := p.p["password"]; found {
+		u.Set("password", v.(string))
+	}
+	if v, found := p.p["update_passwd_on_host"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("update_passwd_on_host", vv)
+	}
+	if v, found := p.p["username"]; found {
+		u.Set("username", v.(string))
+	}
+	return u
+}
+
+func (p *UpdateHostPasswordParams) SetClusterid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["clusterid"] = v
+	return
+}
+
+func (p *UpdateHostPasswordParams) SetHostid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["hostid"] = v
+	return
+}
+
+func (p *UpdateHostPasswordParams) SetPassword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["password"] = v
+	return
+}
+
+func (p *UpdateHostPasswordParams) SetUpdate_passwd_on_host(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["update_passwd_on_host"] = v
+	return
+}
+
+func (p *UpdateHostPasswordParams) SetUsername(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["username"] = v
+	return
+}
+
+// You should always use this function to get a new UpdateHostPasswordParams instance,
+// as then you are sure you have configured all required params
+func (s *HostService) NewUpdateHostPasswordParams(password string, username string) *UpdateHostPasswordParams {
+	p := &UpdateHostPasswordParams{}
+	p.p = make(map[string]interface{})
+	p.p["password"] = password
+	p.p["username"] = username
+	return p
+}
+
+// Update password of a host/pool on management server.
+func (s *HostService) UpdateHostPassword(p *UpdateHostPasswordParams) (*UpdateHostPasswordResponse, error) {
+	resp, err := s.cs.newRequest("updateHostPassword", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r UpdateHostPasswordResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type UpdateHostPasswordResponse struct {
+	Displaytext string `json:"displaytext"`
+	Success     string `json:"success"`
+}
diff --git a/vendor/github.com/xanzy/go-cloudstack/cloudstack/HypervisorService.go b/vendor/github.com/xanzy/go-cloudstack/cloudstack/HypervisorService.go
new file mode 100644
index 0000000..c457b30
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/cloudstack/HypervisorService.go
@@ -0,0 +1,302 @@
+//
+// Copyright 2018, Sander van Harmelen
+//
+// Licensed 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 cloudstack
+
+import (
+	"encoding/json"
+	"fmt"
+	"net/url"
+	"strconv"
+	"strings"
+)
+
+type ListHypervisorCapabilitiesParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListHypervisorCapabilitiesParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["hypervisor"]; found {
+		u.Set("hypervisor", v.(string))
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	return u
+}
+
+func (p *ListHypervisorCapabilitiesParams) SetHypervisor(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["hypervisor"] = v
+	return
+}
+
+func (p *ListHypervisorCapabilitiesParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ListHypervisorCapabilitiesParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListHypervisorCapabilitiesParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListHypervisorCapabilitiesParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+// You should always use this function to get a new ListHypervisorCapabilitiesParams instance,
+// as then you are sure you have configured all required params
+func (s *HypervisorService) NewListHypervisorCapabilitiesParams() *ListHypervisorCapabilitiesParams {
+	p := &ListHypervisorCapabilitiesParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *HypervisorService) GetHypervisorCapabilityByID(id string, opts ...OptionFunc) (*HypervisorCapability, int, error) {
+	p := &ListHypervisorCapabilitiesParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["id"] = id
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return nil, -1, err
+		}
+	}
+
+	l, err := s.ListHypervisorCapabilities(p)
+	if err != nil {
+		if strings.Contains(err.Error(), fmt.Sprintf(
+			"Invalid parameter id value=%s due to incorrect long value format, "+
+				"or entity does not exist", id)) {
+			return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
+		}
+		return nil, -1, err
+	}
+
+	if l.Count == 0 {
+		return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
+	}
+
+	if l.Count == 1 {
+		return l.HypervisorCapabilities[0], l.Count, nil
+	}
+	return nil, l.Count, fmt.Errorf("There is more then one result for HypervisorCapability UUID: %s!", id)
+}
+
+// Lists all hypervisor capabilities.
+func (s *HypervisorService) ListHypervisorCapabilities(p *ListHypervisorCapabilitiesParams) (*ListHypervisorCapabilitiesResponse, error) {
+	resp, err := s.cs.newRequest("listHypervisorCapabilities", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListHypervisorCapabilitiesResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListHypervisorCapabilitiesResponse struct {
+	Count                  int                     `json:"count"`
+	HypervisorCapabilities []*HypervisorCapability `json:"hypervisorcapability"`
+}
+
+type HypervisorCapability struct {
+	Hypervisor           string `json:"hypervisor"`
+	Hypervisorversion    string `json:"hypervisorversion"`
+	Id                   string `json:"id"`
+	Maxdatavolumeslimit  int    `json:"maxdatavolumeslimit"`
+	Maxguestslimit       int64  `json:"maxguestslimit"`
+	Maxhostspercluster   int    `json:"maxhostspercluster"`
+	Securitygroupenabled bool   `json:"securitygroupenabled"`
+	Storagemotionenabled bool   `json:"storagemotionenabled"`
+}
+
+type ListHypervisorsParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListHypervisorsParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *ListHypervisorsParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new ListHypervisorsParams instance,
+// as then you are sure you have configured all required params
+func (s *HypervisorService) NewListHypervisorsParams() *ListHypervisorsParams {
+	p := &ListHypervisorsParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// List hypervisors
+func (s *HypervisorService) ListHypervisors(p *ListHypervisorsParams) (*ListHypervisorsResponse, error) {
+	resp, err := s.cs.newRequest("listHypervisors", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListHypervisorsResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListHypervisorsResponse struct {
+	Count       int           `json:"count"`
+	Hypervisors []*Hypervisor `json:"hypervisor"`
+}
+
+type Hypervisor struct {
+	Name string `json:"name"`
+}
+
+type UpdateHypervisorCapabilitiesParams struct {
+	p map[string]interface{}
+}
+
+func (p *UpdateHypervisorCapabilitiesParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["maxguestslimit"]; found {
+		vv := strconv.FormatInt(v.(int64), 10)
+		u.Set("maxguestslimit", vv)
+	}
+	if v, found := p.p["securitygroupenabled"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("securitygroupenabled", vv)
+	}
+	return u
+}
+
+func (p *UpdateHypervisorCapabilitiesParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *UpdateHypervisorCapabilitiesParams) SetMaxguestslimit(v int64) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["maxguestslimit"] = v
+	return
+}
+
+func (p *UpdateHypervisorCapabilitiesParams) SetSecuritygroupenabled(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["securitygroupenabled"] = v
+	return
+}
+
+// You should always use this function to get a new UpdateHypervisorCapabilitiesParams instance,
+// as then you are sure you have configured all required params
+func (s *HypervisorService) NewUpdateHypervisorCapabilitiesParams() *UpdateHypervisorCapabilitiesParams {
+	p := &UpdateHypervisorCapabilitiesParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// Updates a hypervisor capabilities.
+func (s *HypervisorService) UpdateHypervisorCapabilities(p *UpdateHypervisorCapabilitiesParams) (*UpdateHypervisorCapabilitiesResponse, error) {
+	resp, err := s.cs.newRequest("updateHypervisorCapabilities", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r UpdateHypervisorCapabilitiesResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type UpdateHypervisorCapabilitiesResponse struct {
+	Hypervisor           string `json:"hypervisor"`
+	Hypervisorversion    string `json:"hypervisorversion"`
+	Id                   string `json:"id"`
+	Maxdatavolumeslimit  int    `json:"maxdatavolumeslimit"`
+	Maxguestslimit       int64  `json:"maxguestslimit"`
+	Maxhostspercluster   int    `json:"maxhostspercluster"`
+	Securitygroupenabled bool   `json:"securitygroupenabled"`
+	Storagemotionenabled bool   `json:"storagemotionenabled"`
+}
diff --git a/vendor/github.com/xanzy/go-cloudstack/cloudstack/ISOService.go b/vendor/github.com/xanzy/go-cloudstack/cloudstack/ISOService.go
new file mode 100644
index 0000000..5393375
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/cloudstack/ISOService.go
@@ -0,0 +1,1891 @@
+//
+// Copyright 2018, Sander van Harmelen
+//
+// Licensed 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 cloudstack
+
+import (
+	"encoding/json"
+	"fmt"
+	"net/url"
+	"strconv"
+	"strings"
+)
+
+type AttachIsoParams struct {
+	p map[string]interface{}
+}
+
+func (p *AttachIsoParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["virtualmachineid"]; found {
+		u.Set("virtualmachineid", v.(string))
+	}
+	return u
+}
+
+func (p *AttachIsoParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *AttachIsoParams) SetVirtualmachineid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["virtualmachineid"] = v
+	return
+}
+
+// You should always use this function to get a new AttachIsoParams instance,
+// as then you are sure you have configured all required params
+func (s *ISOService) NewAttachIsoParams(id string, virtualmachineid string) *AttachIsoParams {
+	p := &AttachIsoParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	p.p["virtualmachineid"] = virtualmachineid
+	return p
+}
+
+// Attaches an ISO to a virtual machine.
+func (s *ISOService) AttachIso(p *AttachIsoParams) (*AttachIsoResponse, error) {
+	resp, err := s.cs.newRequest("attachIso", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r AttachIsoResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type AttachIsoResponse struct {
+	JobID         string `json:"jobid"`
+	Account       string `json:"account"`
+	Affinitygroup []struct {
+		Account           string   `json:"account"`
+		Description       string   `json:"description"`
+		Domain            string   `json:"domain"`
+		Domainid          string   `json:"domainid"`
+		Id                string   `json:"id"`
+		Name              string   `json:"name"`
+		Project           string   `json:"project"`
+		Projectid         string   `json:"projectid"`
+		Type              string   `json:"type"`
+		VirtualmachineIds []string `json:"virtualmachineIds"`
+	} `json:"affinitygroup"`
+	Cpunumber             int               `json:"cpunumber"`
+	Cpuspeed              int               `json:"cpuspeed"`
+	Cpuused               string            `json:"cpuused"`
+	Created               string            `json:"created"`
+	Details               map[string]string `json:"details"`
+	Diskioread            int64             `json:"diskioread"`
+	Diskiowrite           int64             `json:"diskiowrite"`
+	Diskkbsread           int64             `json:"diskkbsread"`
+	Diskkbswrite          int64             `json:"diskkbswrite"`
+	Diskofferingid        string            `json:"diskofferingid"`
+	Diskofferingname      string            `json:"diskofferingname"`
+	Displayname           string            `json:"displayname"`
+	Displayvm             bool              `json:"displayvm"`
+	Domain                string            `json:"domain"`
+	Domainid              string            `json:"domainid"`
+	Forvirtualnetwork     bool              `json:"forvirtualnetwork"`
+	Group                 string            `json:"group"`
+	Groupid               string            `json:"groupid"`
+	Guestosid             string            `json:"guestosid"`
+	Haenable              bool              `json:"haenable"`
+	Hostid                string            `json:"hostid"`
+	Hostname              string            `json:"hostname"`
+	Hypervisor            string            `json:"hypervisor"`
+	Id                    string            `json:"id"`
+	Instancename          string            `json:"instancename"`
+	Isdynamicallyscalable bool              `json:"isdynamicallyscalable"`
+	Isodisplaytext        string            `json:"isodisplaytext"`
+	Isoid                 string            `json:"isoid"`
+	Isoname               string            `json:"isoname"`
+	Keypair               string            `json:"keypair"`
+	Memory                int               `json:"memory"`
+	Memoryintfreekbs      int64             `json:"memoryintfreekbs"`
+	Memorykbs             int64             `json:"memorykbs"`
+	Memorytargetkbs       int64             `json:"memorytargetkbs"`
+	Name                  string            `json:"name"`
+	Networkkbsread        int64             `json:"networkkbsread"`
+	Networkkbswrite       int64             `json:"networkkbswrite"`
+	Nic                   []struct {
+		Broadcasturi         string `json:"broadcasturi"`
+		Deviceid             string `json:"deviceid"`
+		Gateway              string `json:"gateway"`
+		Id                   string `json:"id"`
+		Ip6address           string `json:"ip6address"`
+		Ip6cidr              string `json:"ip6cidr"`
+		Ip6gateway           string `json:"ip6gateway"`
+		Ipaddress            string `json:"ipaddress"`
+		Isdefault            bool   `json:"isdefault"`
+		Isolationuri         string `json:"isolationuri"`
+		Macaddress           string `json:"macaddress"`
+		Netmask              string `json:"netmask"`
+		Networkid            string `json:"networkid"`
+		Networkname          string `json:"networkname"`
+		Nsxlogicalswitch     string `json:"nsxlogicalswitch"`
+		Nsxlogicalswitchport string `json:"nsxlogicalswitchport"`
+		Secondaryip          []struct {
+			Id        string `json:"id"`
+			Ipaddress string `json:"ipaddress"`
+		} `json:"secondaryip"`
+		Traffictype      string `json:"traffictype"`
+		Type             string `json:"type"`
+		Virtualmachineid string `json:"virtualmachineid"`
+	} `json:"nic"`
+	Ostypeid        int64  `json:"ostypeid"`
+	Password        string `json:"password"`
+	Passwordenabled bool   `json:"passwordenabled"`
+	Project         string `json:"project"`
+	Projectid       string `json:"projectid"`
+	Publicip        string `json:"publicip"`
+	Publicipid      string `json:"publicipid"`
+	Rootdeviceid    int64  `json:"rootdeviceid"`
+	Rootdevicetype  string `json:"rootdevicetype"`
+	Securitygroup   []struct {
+		Account     string `json:"account"`
+		Description string `json:"description"`
+		Domain      string `json:"domain"`
+		Domainid    string `json:"domainid"`
+		Egressrule  []struct {
+			Account           string `json:"account"`
+			Cidr              string `json:"cidr"`
+			Endport           int    `json:"endport"`
+			Icmpcode          int    `json:"icmpcode"`
+			Icmptype          int    `json:"icmptype"`
+			Protocol          string `json:"protocol"`
+			Ruleid            string `json:"ruleid"`
+			Securitygroupname string `json:"securitygroupname"`
+			Startport         int    `json:"startport"`
+			Tags              []struct {
+				Account      string `json:"account"`
+				Customer     string `json:"customer"`
+				Domain       string `json:"domain"`
+				Domainid     string `json:"domainid"`
+				Key          string `json:"key"`
+				Project      string `json:"project"`
+				Projectid    string `json:"projectid"`
+				Resourceid   string `json:"resourceid"`
+				Resourcetype string `json:"resourcetype"`
+				Value        string `json:"value"`
+			} `json:"tags"`
+		} `json:"egressrule"`
+		Id          string `json:"id"`
+		Ingressrule []struct {
+			Account           string `json:"account"`
+			Cidr              string `json:"cidr"`
+			Endport           int    `json:"endport"`
+			Icmpcode          int    `json:"icmpcode"`
+			Icmptype          int    `json:"icmptype"`
+			Protocol          string `json:"protocol"`
+			Ruleid            string `json:"ruleid"`
+			Securitygroupname string `json:"securitygroupname"`
+			Startport         int    `json:"startport"`
+			Tags              []struct {
+				Account      string `json:"account"`
+				Customer     string `json:"customer"`
+				Domain       string `json:"domain"`
+				Domainid     string `json:"domainid"`
+				Key          string `json:"key"`
+				Project      string `json:"project"`
+				Projectid    string `json:"projectid"`
+				Resourceid   string `json:"resourceid"`
+				Resourcetype string `json:"resourcetype"`
+				Value        string `json:"value"`
+			} `json:"tags"`
+		} `json:"ingressrule"`
+		Name      string `json:"name"`
+		Project   string `json:"project"`
+		Projectid string `json:"projectid"`
+		Tags      []struct {
+			Account      string `json:"account"`
+			Customer     string `json:"customer"`
+			Domain       string `json:"domain"`
+			Domainid     string `json:"domainid"`
+			Key          string `json:"key"`
+			Project      string `json:"project"`
+			Projectid    string `json:"projectid"`
+			Resourceid   string `json:"resourceid"`
+			Resourcetype string `json:"resourcetype"`
+			Value        string `json:"value"`
+		} `json:"tags"`
+		Virtualmachinecount int           `json:"virtualmachinecount"`
+		Virtualmachineids   []interface{} `json:"virtualmachineids"`
+	} `json:"securitygroup"`
+	Serviceofferingid   string `json:"serviceofferingid"`
+	Serviceofferingname string `json:"serviceofferingname"`
+	Servicestate        string `json:"servicestate"`
+	State               string `json:"state"`
+	Templatedisplaytext string `json:"templatedisplaytext"`
+	Templateid          string `json:"templateid"`
+	Templatename        string `json:"templatename"`
+	Userid              string `json:"userid"`
+	Username            string `json:"username"`
+	Vgpu                string `json:"vgpu"`
+	Zoneid              string `json:"zoneid"`
+	Zonename            string `json:"zonename"`
+}
+
+type CopyIsoParams struct {
+	p map[string]interface{}
+}
+
+func (p *CopyIsoParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["destzoneid"]; found {
+		u.Set("destzoneid", v.(string))
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["sourcezoneid"]; found {
+		u.Set("sourcezoneid", v.(string))
+	}
+	return u
+}
+
+func (p *CopyIsoParams) SetDestzoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["destzoneid"] = v
+	return
+}
+
+func (p *CopyIsoParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *CopyIsoParams) SetSourcezoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["sourcezoneid"] = v
+	return
+}
+
+// You should always use this function to get a new CopyIsoParams instance,
+// as then you are sure you have configured all required params
+func (s *ISOService) NewCopyIsoParams(destzoneid string, id string) *CopyIsoParams {
+	p := &CopyIsoParams{}
+	p.p = make(map[string]interface{})
+	p.p["destzoneid"] = destzoneid
+	p.p["id"] = id
+	return p
+}
+
+// Copies an iso from one zone to another.
+func (s *ISOService) CopyIso(p *CopyIsoParams) (*CopyIsoResponse, error) {
+	resp, err := s.cs.newRequest("copyIso", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r CopyIsoResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type CopyIsoResponse struct {
+	JobID                 string            `json:"jobid"`
+	Account               string            `json:"account"`
+	Accountid             string            `json:"accountid"`
+	Bootable              bool              `json:"bootable"`
+	Checksum              string            `json:"checksum"`
+	Created               string            `json:"created"`
+	CrossZones            bool              `json:"crossZones"`
+	Details               map[string]string `json:"details"`
+	Displaytext           string            `json:"displaytext"`
+	Domain                string            `json:"domain"`
+	Domainid              string            `json:"domainid"`
+	Format                string            `json:"format"`
+	Hostid                string            `json:"hostid"`
+	Hostname              string            `json:"hostname"`
+	Hypervisor            string            `json:"hypervisor"`
+	Id                    string            `json:"id"`
+	Isdynamicallyscalable bool              `json:"isdynamicallyscalable"`
+	Isextractable         bool              `json:"isextractable"`
+	Isfeatured            bool              `json:"isfeatured"`
+	Ispublic              bool              `json:"ispublic"`
+	Isready               bool              `json:"isready"`
+	Name                  string            `json:"name"`
+	Ostypeid              string            `json:"ostypeid"`
+	Ostypename            string            `json:"ostypename"`
+	Passwordenabled       bool              `json:"passwordenabled"`
+	Project               string            `json:"project"`
+	Projectid             string            `json:"projectid"`
+	Removed               string            `json:"removed"`
+	Size                  int64             `json:"size"`
+	Sourcetemplateid      string            `json:"sourcetemplateid"`
+	Sshkeyenabled         bool              `json:"sshkeyenabled"`
+	Status                string            `json:"status"`
+	Templatetag           string            `json:"templatetag"`
+	Templatetype          string            `json:"templatetype"`
+	Zoneid                string            `json:"zoneid"`
+	Zonename              string            `json:"zonename"`
+}
+
+type DeleteIsoParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeleteIsoParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *DeleteIsoParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *DeleteIsoParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new DeleteIsoParams instance,
+// as then you are sure you have configured all required params
+func (s *ISOService) NewDeleteIsoParams(id string) *DeleteIsoParams {
+	p := &DeleteIsoParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Deletes an ISO file.
+func (s *ISOService) DeleteIso(p *DeleteIsoParams) (*DeleteIsoResponse, error) {
+	resp, err := s.cs.newRequest("deleteIso", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeleteIsoResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type DeleteIsoResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
+
+type DetachIsoParams struct {
+	p map[string]interface{}
+}
+
+func (p *DetachIsoParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["virtualmachineid"]; found {
+		u.Set("virtualmachineid", v.(string))
+	}
+	return u
+}
+
+func (p *DetachIsoParams) SetVirtualmachineid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["virtualmachineid"] = v
+	return
+}
+
+// You should always use this function to get a new DetachIsoParams instance,
+// as then you are sure you have configured all required params
+func (s *ISOService) NewDetachIsoParams(virtualmachineid string) *DetachIsoParams {
+	p := &DetachIsoParams{}
+	p.p = make(map[string]interface{})
+	p.p["virtualmachineid"] = virtualmachineid
+	return p
+}
+
+// Detaches any ISO file (if any) currently attached to a virtual machine.
+func (s *ISOService) DetachIso(p *DetachIsoParams) (*DetachIsoResponse, error) {
+	resp, err := s.cs.newRequest("detachIso", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DetachIsoResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type DetachIsoResponse struct {
+	JobID         string `json:"jobid"`
+	Account       string `json:"account"`
+	Affinitygroup []struct {
+		Account           string   `json:"account"`
+		Description       string   `json:"description"`
+		Domain            string   `json:"domain"`
+		Domainid          string   `json:"domainid"`
+		Id                string   `json:"id"`
+		Name              string   `json:"name"`
+		Project           string   `json:"project"`
+		Projectid         string   `json:"projectid"`
+		Type              string   `json:"type"`
+		VirtualmachineIds []string `json:"virtualmachineIds"`
+	} `json:"affinitygroup"`
+	Cpunumber             int               `json:"cpunumber"`
+	Cpuspeed              int               `json:"cpuspeed"`
+	Cpuused               string            `json:"cpuused"`
+	Created               string            `json:"created"`
+	Details               map[string]string `json:"details"`
+	Diskioread            int64             `json:"diskioread"`
+	Diskiowrite           int64             `json:"diskiowrite"`
+	Diskkbsread           int64             `json:"diskkbsread"`
+	Diskkbswrite          int64             `json:"diskkbswrite"`
+	Diskofferingid        string            `json:"diskofferingid"`
+	Diskofferingname      string            `json:"diskofferingname"`
+	Displayname           string            `json:"displayname"`
+	Displayvm             bool              `json:"displayvm"`
+	Domain                string            `json:"domain"`
+	Domainid              string            `json:"domainid"`
+	Forvirtualnetwork     bool              `json:"forvirtualnetwork"`
+	Group                 string            `json:"group"`
+	Groupid               string            `json:"groupid"`
+	Guestosid             string            `json:"guestosid"`
+	Haenable              bool              `json:"haenable"`
+	Hostid                string            `json:"hostid"`
+	Hostname              string            `json:"hostname"`
+	Hypervisor            string            `json:"hypervisor"`
+	Id                    string            `json:"id"`
+	Instancename          string            `json:"instancename"`
+	Isdynamicallyscalable bool              `json:"isdynamicallyscalable"`
+	Isodisplaytext        string            `json:"isodisplaytext"`
+	Isoid                 string            `json:"isoid"`
+	Isoname               string            `json:"isoname"`
+	Keypair               string            `json:"keypair"`
+	Memory                int               `json:"memory"`
+	Memoryintfreekbs      int64             `json:"memoryintfreekbs"`
+	Memorykbs             int64             `json:"memorykbs"`
+	Memorytargetkbs       int64             `json:"memorytargetkbs"`
+	Name                  string            `json:"name"`
+	Networkkbsread        int64             `json:"networkkbsread"`
+	Networkkbswrite       int64             `json:"networkkbswrite"`
+	Nic                   []struct {
+		Broadcasturi         string `json:"broadcasturi"`
+		Deviceid             string `json:"deviceid"`
+		Gateway              string `json:"gateway"`
+		Id                   string `json:"id"`
+		Ip6address           string `json:"ip6address"`
+		Ip6cidr              string `json:"ip6cidr"`
+		Ip6gateway           string `json:"ip6gateway"`
+		Ipaddress            string `json:"ipaddress"`
+		Isdefault            bool   `json:"isdefault"`
+		Isolationuri         string `json:"isolationuri"`
+		Macaddress           string `json:"macaddress"`
+		Netmask              string `json:"netmask"`
+		Networkid            string `json:"networkid"`
+		Networkname          string `json:"networkname"`
+		Nsxlogicalswitch     string `json:"nsxlogicalswitch"`
+		Nsxlogicalswitchport string `json:"nsxlogicalswitchport"`
+		Secondaryip          []struct {
+			Id        string `json:"id"`
+			Ipaddress string `json:"ipaddress"`
+		} `json:"secondaryip"`
+		Traffictype      string `json:"traffictype"`
+		Type             string `json:"type"`
+		Virtualmachineid string `json:"virtualmachineid"`
+	} `json:"nic"`
+	Ostypeid        int64  `json:"ostypeid"`
+	Password        string `json:"password"`
+	Passwordenabled bool   `json:"passwordenabled"`
+	Project         string `json:"project"`
+	Projectid       string `json:"projectid"`
+	Publicip        string `json:"publicip"`
+	Publicipid      string `json:"publicipid"`
+	Rootdeviceid    int64  `json:"rootdeviceid"`
+	Rootdevicetype  string `json:"rootdevicetype"`
+	Securitygroup   []struct {
+		Account     string `json:"account"`
+		Description string `json:"description"`
+		Domain      string `json:"domain"`
+		Domainid    string `json:"domainid"`
+		Egressrule  []struct {
+			Account           string `json:"account"`
+			Cidr              string `json:"cidr"`
+			Endport           int    `json:"endport"`
+			Icmpcode          int    `json:"icmpcode"`
+			Icmptype          int    `json:"icmptype"`
+			Protocol          string `json:"protocol"`
+			Ruleid            string `json:"ruleid"`
+			Securitygroupname string `json:"securitygroupname"`
+			Startport         int    `json:"startport"`
+			Tags              []struct {
+				Account      string `json:"account"`
+				Customer     string `json:"customer"`
+				Domain       string `json:"domain"`
+				Domainid     string `json:"domainid"`
+				Key          string `json:"key"`
+				Project      string `json:"project"`
+				Projectid    string `json:"projectid"`
+				Resourceid   string `json:"resourceid"`
+				Resourcetype string `json:"resourcetype"`
+				Value        string `json:"value"`
+			} `json:"tags"`
+		} `json:"egressrule"`
+		Id          string `json:"id"`
+		Ingressrule []struct {
+			Account           string `json:"account"`
+			Cidr              string `json:"cidr"`
+			Endport           int    `json:"endport"`
+			Icmpcode          int    `json:"icmpcode"`
+			Icmptype          int    `json:"icmptype"`
+			Protocol          string `json:"protocol"`
+			Ruleid            string `json:"ruleid"`
+			Securitygroupname string `json:"securitygroupname"`
+			Startport         int    `json:"startport"`
+			Tags              []struct {
+				Account      string `json:"account"`
+				Customer     string `json:"customer"`
+				Domain       string `json:"domain"`
+				Domainid     string `json:"domainid"`
+				Key          string `json:"key"`
+				Project      string `json:"project"`
+				Projectid    string `json:"projectid"`
+				Resourceid   string `json:"resourceid"`
+				Resourcetype string `json:"resourcetype"`
+				Value        string `json:"value"`
+			} `json:"tags"`
+		} `json:"ingressrule"`
+		Name      string `json:"name"`
+		Project   string `json:"project"`
+		Projectid string `json:"projectid"`
+		Tags      []struct {
+			Account      string `json:"account"`
+			Customer     string `json:"customer"`
+			Domain       string `json:"domain"`
+			Domainid     string `json:"domainid"`
+			Key          string `json:"key"`
+			Project      string `json:"project"`
+			Projectid    string `json:"projectid"`
+			Resourceid   string `json:"resourceid"`
+			Resourcetype string `json:"resourcetype"`
+			Value        string `json:"value"`
+		} `json:"tags"`
+		Virtualmachinecount int           `json:"virtualmachinecount"`
+		Virtualmachineids   []interface{} `json:"virtualmachineids"`
+	} `json:"securitygroup"`
+	Serviceofferingid   string `json:"serviceofferingid"`
+	Serviceofferingname string `json:"serviceofferingname"`
+	Servicestate        string `json:"servicestate"`
+	State               string `json:"state"`
+	Templatedisplaytext string `json:"templatedisplaytext"`
+	Templateid          string `json:"templateid"`
+	Templatename        string `json:"templatename"`
+	Userid              string `json:"userid"`
+	Username            string `json:"username"`
+	Vgpu                string `json:"vgpu"`
+	Zoneid              string `json:"zoneid"`
+	Zonename            string `json:"zonename"`
+}
+
+type ExtractIsoParams struct {
+	p map[string]interface{}
+}
+
+func (p *ExtractIsoParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["mode"]; found {
+		u.Set("mode", v.(string))
+	}
+	if v, found := p.p["url"]; found {
+		u.Set("url", v.(string))
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *ExtractIsoParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ExtractIsoParams) SetMode(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["mode"] = v
+	return
+}
+
+func (p *ExtractIsoParams) SetUrl(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["url"] = v
+	return
+}
+
+func (p *ExtractIsoParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new ExtractIsoParams instance,
+// as then you are sure you have configured all required params
+func (s *ISOService) NewExtractIsoParams(id string, mode string) *ExtractIsoParams {
+	p := &ExtractIsoParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	p.p["mode"] = mode
+	return p
+}
+
+// Extracts an ISO
+func (s *ISOService) ExtractIso(p *ExtractIsoParams) (*ExtractIsoResponse, error) {
+	resp, err := s.cs.newRequest("extractIso", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ExtractIsoResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type ExtractIsoResponse struct {
+	JobID            string `json:"jobid"`
+	Accountid        string `json:"accountid"`
+	Created          string `json:"created"`
+	ExtractId        string `json:"extractId"`
+	ExtractMode      string `json:"extractMode"`
+	Id               string `json:"id"`
+	Name             string `json:"name"`
+	Resultstring     string `json:"resultstring"`
+	State            string `json:"state"`
+	Status           string `json:"status"`
+	Storagetype      string `json:"storagetype"`
+	Uploadpercentage int    `json:"uploadpercentage"`
+	Url              string `json:"url"`
+	Zoneid           string `json:"zoneid"`
+	Zonename         string `json:"zonename"`
+}
+
+type ListIsoPermissionsParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListIsoPermissionsParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *ListIsoPermissionsParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new ListIsoPermissionsParams instance,
+// as then you are sure you have configured all required params
+func (s *ISOService) NewListIsoPermissionsParams(id string) *ListIsoPermissionsParams {
+	p := &ListIsoPermissionsParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *ISOService) GetIsoPermissionByID(id string, opts ...OptionFunc) (*IsoPermission, int, error) {
+	p := &ListIsoPermissionsParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["id"] = id
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return nil, -1, err
+		}
+	}
+
+	l, err := s.ListIsoPermissions(p)
+	if err != nil {
+		if strings.Contains(err.Error(), fmt.Sprintf(
+			"Invalid parameter id value=%s due to incorrect long value format, "+
+				"or entity does not exist", id)) {
+			return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
+		}
+		return nil, -1, err
+	}
+
+	if l.Count == 0 {
+		return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
+	}
+
+	if l.Count == 1 {
+		return l.IsoPermissions[0], l.Count, nil
+	}
+	return nil, l.Count, fmt.Errorf("There is more then one result for IsoPermission UUID: %s!", id)
+}
+
+// List ISO visibility and all accounts that have permissions to view this ISO.
+func (s *ISOService) ListIsoPermissions(p *ListIsoPermissionsParams) (*ListIsoPermissionsResponse, error) {
+	resp, err := s.cs.newRequest("listIsoPermissions", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListIsoPermissionsResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListIsoPermissionsResponse struct {
+	Count          int              `json:"count"`
+	IsoPermissions []*IsoPermission `json:"isopermission"`
+}
+
+type IsoPermission struct {
+	Account    []string `json:"account"`
+	Domainid   string   `json:"domainid"`
+	Id         string   `json:"id"`
+	Ispublic   bool     `json:"ispublic"`
+	Projectids []string `json:"projectids"`
+}
+
+type ListIsosParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListIsosParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["bootable"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("bootable", vv)
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["hypervisor"]; found {
+		u.Set("hypervisor", v.(string))
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["isofilter"]; found {
+		u.Set("isofilter", v.(string))
+	}
+	if v, found := p.p["ispublic"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("ispublic", vv)
+	}
+	if v, found := p.p["isready"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("isready", vv)
+	}
+	if v, found := p.p["isrecursive"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("isrecursive", vv)
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["listall"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("listall", vv)
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["projectid"]; found {
+		u.Set("projectid", v.(string))
+	}
+	if v, found := p.p["showremoved"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("showremoved", vv)
+	}
+	if v, found := p.p["tags"]; found {
+		i := 0
+		for k, vv := range v.(map[string]string) {
+			u.Set(fmt.Sprintf("tags[%d].key", i), k)
+			u.Set(fmt.Sprintf("tags[%d].value", i), vv)
+			i++
+		}
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *ListIsosParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *ListIsosParams) SetBootable(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["bootable"] = v
+	return
+}
+
+func (p *ListIsosParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *ListIsosParams) SetHypervisor(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["hypervisor"] = v
+	return
+}
+
+func (p *ListIsosParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ListIsosParams) SetIsofilter(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isofilter"] = v
+	return
+}
+
+func (p *ListIsosParams) SetIspublic(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["ispublic"] = v
+	return
+}
+
+func (p *ListIsosParams) SetIsready(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isready"] = v
+	return
+}
+
+func (p *ListIsosParams) SetIsrecursive(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isrecursive"] = v
+	return
+}
+
+func (p *ListIsosParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListIsosParams) SetListall(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["listall"] = v
+	return
+}
+
+func (p *ListIsosParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *ListIsosParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListIsosParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListIsosParams) SetProjectid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectid"] = v
+	return
+}
+
+func (p *ListIsosParams) SetShowremoved(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["showremoved"] = v
+	return
+}
+
+func (p *ListIsosParams) SetTags(v map[string]string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["tags"] = v
+	return
+}
+
+func (p *ListIsosParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new ListIsosParams instance,
+// as then you are sure you have configured all required params
+func (s *ISOService) NewListIsosParams() *ListIsosParams {
+	p := &ListIsosParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *ISOService) GetIsoID(name string, isofilter string, zoneid string, opts ...OptionFunc) (string, int, error) {
+	p := &ListIsosParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["name"] = name
+	p.p["isofilter"] = isofilter
+	p.p["zoneid"] = zoneid
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return "", -1, err
+		}
+	}
+
+	l, err := s.ListIsos(p)
+	if err != nil {
+		return "", -1, err
+	}
+
+	if l.Count == 0 {
+		return "", l.Count, fmt.Errorf("No match found for %s: %+v", name, l)
+	}
+
+	if l.Count == 1 {
+		return l.Isos[0].Id, l.Count, nil
+	}
+
+	if l.Count > 1 {
+		for _, v := range l.Isos {
+			if v.Name == name {
+				return v.Id, l.Count, nil
+			}
+		}
+	}
+	return "", l.Count, fmt.Errorf("Could not find an exact match for %s: %+v", name, l)
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *ISOService) GetIsoByName(name string, isofilter string, zoneid string, opts ...OptionFunc) (*Iso, int, error) {
+	id, count, err := s.GetIsoID(name, isofilter, zoneid, opts...)
+	if err != nil {
+		return nil, count, err
+	}
+
+	r, count, err := s.GetIsoByID(id, opts...)
+	if err != nil {
+		return nil, count, err
+	}
+	return r, count, nil
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *ISOService) GetIsoByID(id string, opts ...OptionFunc) (*Iso, int, error) {
+	p := &ListIsosParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["id"] = id
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return nil, -1, err
+		}
+	}
+
+	l, err := s.ListIsos(p)
+	if err != nil {
+		if strings.Contains(err.Error(), fmt.Sprintf(
+			"Invalid parameter id value=%s due to incorrect long value format, "+
+				"or entity does not exist", id)) {
+			return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
+		}
+		return nil, -1, err
+	}
+
+	if l.Count == 0 {
+		return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
+	}
+
+	if l.Count == 1 {
+		return l.Isos[0], l.Count, nil
+	}
+	return nil, l.Count, fmt.Errorf("There is more then one result for Iso UUID: %s!", id)
+}
+
+// Lists all available ISO files.
+func (s *ISOService) ListIsos(p *ListIsosParams) (*ListIsosResponse, error) {
+	resp, err := s.cs.newRequest("listIsos", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListIsosResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListIsosResponse struct {
+	Count int    `json:"count"`
+	Isos  []*Iso `json:"iso"`
+}
+
+type Iso struct {
+	Account               string            `json:"account"`
+	Accountid             string            `json:"accountid"`
+	Bootable              bool              `json:"bootable"`
+	Checksum              string            `json:"checksum"`
+	Created               string            `json:"created"`
+	CrossZones            bool              `json:"crossZones"`
+	Details               map[string]string `json:"details"`
+	Displaytext           string            `json:"displaytext"`
+	Domain                string            `json:"domain"`
+	Domainid              string            `json:"domainid"`
+	Format                string            `json:"format"`
+	Hostid                string            `json:"hostid"`
+	Hostname              string            `json:"hostname"`
+	Hypervisor            string            `json:"hypervisor"`
+	Id                    string            `json:"id"`
+	Isdynamicallyscalable bool              `json:"isdynamicallyscalable"`
+	Isextractable         bool              `json:"isextractable"`
+	Isfeatured            bool              `json:"isfeatured"`
+	Ispublic              bool              `json:"ispublic"`
+	Isready               bool              `json:"isready"`
+	Name                  string            `json:"name"`
+	Ostypeid              string            `json:"ostypeid"`
+	Ostypename            string            `json:"ostypename"`
+	Passwordenabled       bool              `json:"passwordenabled"`
+	Project               string            `json:"project"`
+	Projectid             string            `json:"projectid"`
+	Removed               string            `json:"removed"`
+	Size                  int64             `json:"size"`
+	Sourcetemplateid      string            `json:"sourcetemplateid"`
+	Sshkeyenabled         bool              `json:"sshkeyenabled"`
+	Status                string            `json:"status"`
+	Templatetag           string            `json:"templatetag"`
+	Templatetype          string            `json:"templatetype"`
+	Zoneid                string            `json:"zoneid"`
+	Zonename              string            `json:"zonename"`
+}
+
+type RegisterIsoParams struct {
+	p map[string]interface{}
+}
+
+func (p *RegisterIsoParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["bootable"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("bootable", vv)
+	}
+	if v, found := p.p["checksum"]; found {
+		u.Set("checksum", v.(string))
+	}
+	if v, found := p.p["displaytext"]; found {
+		u.Set("displaytext", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["imagestoreuuid"]; found {
+		u.Set("imagestoreuuid", v.(string))
+	}
+	if v, found := p.p["isdynamicallyscalable"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("isdynamicallyscalable", vv)
+	}
+	if v, found := p.p["isextractable"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("isextractable", vv)
+	}
+	if v, found := p.p["isfeatured"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("isfeatured", vv)
+	}
+	if v, found := p.p["ispublic"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("ispublic", vv)
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["ostypeid"]; found {
+		u.Set("ostypeid", v.(string))
+	}
+	if v, found := p.p["projectid"]; found {
+		u.Set("projectid", v.(string))
+	}
+	if v, found := p.p["url"]; found {
+		u.Set("url", v.(string))
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *RegisterIsoParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *RegisterIsoParams) SetBootable(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["bootable"] = v
+	return
+}
+
+func (p *RegisterIsoParams) SetChecksum(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["checksum"] = v
+	return
+}
+
+func (p *RegisterIsoParams) SetDisplaytext(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["displaytext"] = v
+	return
+}
+
+func (p *RegisterIsoParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *RegisterIsoParams) SetImagestoreuuid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["imagestoreuuid"] = v
+	return
+}
+
+func (p *RegisterIsoParams) SetIsdynamicallyscalable(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isdynamicallyscalable"] = v
+	return
+}
+
+func (p *RegisterIsoParams) SetIsextractable(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isextractable"] = v
+	return
+}
+
+func (p *RegisterIsoParams) SetIsfeatured(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isfeatured"] = v
+	return
+}
+
+func (p *RegisterIsoParams) SetIspublic(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["ispublic"] = v
+	return
+}
+
+func (p *RegisterIsoParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *RegisterIsoParams) SetOstypeid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["ostypeid"] = v
+	return
+}
+
+func (p *RegisterIsoParams) SetProjectid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectid"] = v
+	return
+}
+
+func (p *RegisterIsoParams) SetUrl(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["url"] = v
+	return
+}
+
+func (p *RegisterIsoParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new RegisterIsoParams instance,
+// as then you are sure you have configured all required params
+func (s *ISOService) NewRegisterIsoParams(displaytext string, name string, url string, zoneid string) *RegisterIsoParams {
+	p := &RegisterIsoParams{}
+	p.p = make(map[string]interface{})
+	p.p["displaytext"] = displaytext
+	p.p["name"] = name
+	p.p["url"] = url
+	p.p["zoneid"] = zoneid
+	return p
+}
+
+// Registers an existing ISO into the CloudStack Cloud.
+func (s *ISOService) RegisterIso(p *RegisterIsoParams) (*RegisterIsoResponse, error) {
+	resp, err := s.cs.newRequest("registerIso", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r RegisterIsoResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type RegisterIsoResponse struct {
+	Account               string            `json:"account"`
+	Accountid             string            `json:"accountid"`
+	Bootable              bool              `json:"bootable"`
+	Checksum              string            `json:"checksum"`
+	Created               string            `json:"created"`
+	CrossZones            bool              `json:"crossZones"`
+	Details               map[string]string `json:"details"`
+	Displaytext           string            `json:"displaytext"`
+	Domain                string            `json:"domain"`
+	Domainid              string            `json:"domainid"`
+	Format                string            `json:"format"`
+	Hostid                string            `json:"hostid"`
+	Hostname              string            `json:"hostname"`
+	Hypervisor            string            `json:"hypervisor"`
+	Id                    string            `json:"id"`
+	Isdynamicallyscalable bool              `json:"isdynamicallyscalable"`
+	Isextractable         bool              `json:"isextractable"`
+	Isfeatured            bool              `json:"isfeatured"`
+	Ispublic              bool              `json:"ispublic"`
+	Isready               bool              `json:"isready"`
+	Name                  string            `json:"name"`
+	Ostypeid              string            `json:"ostypeid"`
+	Ostypename            string            `json:"ostypename"`
+	Passwordenabled       bool              `json:"passwordenabled"`
+	Project               string            `json:"project"`
+	Projectid             string            `json:"projectid"`
+	Removed               string            `json:"removed"`
+	Size                  int64             `json:"size"`
+	Sourcetemplateid      string            `json:"sourcetemplateid"`
+	Sshkeyenabled         bool              `json:"sshkeyenabled"`
+	Status                string            `json:"status"`
+	Templatetag           string            `json:"templatetag"`
+	Templatetype          string            `json:"templatetype"`
+	Zoneid                string            `json:"zoneid"`
+	Zonename              string            `json:"zonename"`
+}
+
+type UpdateIsoParams struct {
+	p map[string]interface{}
+}
+
+func (p *UpdateIsoParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["bootable"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("bootable", vv)
+	}
+	if v, found := p.p["details"]; found {
+		i := 0
+		for k, vv := range v.(map[string]string) {
+			u.Set(fmt.Sprintf("details[%d].%s", i, k), vv)
+			i++
+		}
+	}
+	if v, found := p.p["displaytext"]; found {
+		u.Set("displaytext", v.(string))
+	}
+	if v, found := p.p["format"]; found {
+		u.Set("format", v.(string))
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["isdynamicallyscalable"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("isdynamicallyscalable", vv)
+	}
+	if v, found := p.p["isrouting"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("isrouting", vv)
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["ostypeid"]; found {
+		u.Set("ostypeid", v.(string))
+	}
+	if v, found := p.p["passwordenabled"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("passwordenabled", vv)
+	}
+	if v, found := p.p["requireshvm"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("requireshvm", vv)
+	}
+	if v, found := p.p["sortkey"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("sortkey", vv)
+	}
+	return u
+}
+
+func (p *UpdateIsoParams) SetBootable(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["bootable"] = v
+	return
+}
+
+func (p *UpdateIsoParams) SetDetails(v map[string]string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["details"] = v
+	return
+}
+
+func (p *UpdateIsoParams) SetDisplaytext(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["displaytext"] = v
+	return
+}
+
+func (p *UpdateIsoParams) SetFormat(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["format"] = v
+	return
+}
+
+func (p *UpdateIsoParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *UpdateIsoParams) SetIsdynamicallyscalable(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isdynamicallyscalable"] = v
+	return
+}
+
+func (p *UpdateIsoParams) SetIsrouting(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isrouting"] = v
+	return
+}
+
+func (p *UpdateIsoParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *UpdateIsoParams) SetOstypeid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["ostypeid"] = v
+	return
+}
+
+func (p *UpdateIsoParams) SetPasswordenabled(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["passwordenabled"] = v
+	return
+}
+
+func (p *UpdateIsoParams) SetRequireshvm(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["requireshvm"] = v
+	return
+}
+
+func (p *UpdateIsoParams) SetSortkey(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["sortkey"] = v
+	return
+}
+
+// You should always use this function to get a new UpdateIsoParams instance,
+// as then you are sure you have configured all required params
+func (s *ISOService) NewUpdateIsoParams(id string) *UpdateIsoParams {
+	p := &UpdateIsoParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Updates an ISO file.
+func (s *ISOService) UpdateIso(p *UpdateIsoParams) (*UpdateIsoResponse, error) {
+	resp, err := s.cs.newRequest("updateIso", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r UpdateIsoResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type UpdateIsoResponse struct {
+	Account               string            `json:"account"`
+	Accountid             string            `json:"accountid"`
+	Bootable              bool              `json:"bootable"`
+	Checksum              string            `json:"checksum"`
+	Created               string            `json:"created"`
+	CrossZones            bool              `json:"crossZones"`
+	Details               map[string]string `json:"details"`
+	Displaytext           string            `json:"displaytext"`
+	Domain                string            `json:"domain"`
+	Domainid              string            `json:"domainid"`
+	Format                string            `json:"format"`
+	Hostid                string            `json:"hostid"`
+	Hostname              string            `json:"hostname"`
+	Hypervisor            string            `json:"hypervisor"`
+	Id                    string            `json:"id"`
+	Isdynamicallyscalable bool              `json:"isdynamicallyscalable"`
+	Isextractable         bool              `json:"isextractable"`
+	Isfeatured            bool              `json:"isfeatured"`
+	Ispublic              bool              `json:"ispublic"`
+	Isready               bool              `json:"isready"`
+	Name                  string            `json:"name"`
+	Ostypeid              string            `json:"ostypeid"`
+	Ostypename            string            `json:"ostypename"`
+	Passwordenabled       bool              `json:"passwordenabled"`
+	Project               string            `json:"project"`
+	Projectid             string            `json:"projectid"`
+	Removed               string            `json:"removed"`
+	Size                  int64             `json:"size"`
+	Sourcetemplateid      string            `json:"sourcetemplateid"`
+	Sshkeyenabled         bool              `json:"sshkeyenabled"`
+	Status                string            `json:"status"`
+	Templatetag           string            `json:"templatetag"`
+	Templatetype          string            `json:"templatetype"`
+	Zoneid                string            `json:"zoneid"`
+	Zonename              string            `json:"zonename"`
+}
+
+type UpdateIsoPermissionsParams struct {
+	p map[string]interface{}
+}
+
+func (p *UpdateIsoPermissionsParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["accounts"]; found {
+		vv := strings.Join(v.([]string), ",")
+		u.Set("accounts", vv)
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["isextractable"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("isextractable", vv)
+	}
+	if v, found := p.p["isfeatured"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("isfeatured", vv)
+	}
+	if v, found := p.p["ispublic"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("ispublic", vv)
+	}
+	if v, found := p.p["op"]; found {
+		u.Set("op", v.(string))
+	}
+	if v, found := p.p["projectids"]; found {
+		vv := strings.Join(v.([]string), ",")
+		u.Set("projectids", vv)
+	}
+	return u
+}
+
+func (p *UpdateIsoPermissionsParams) SetAccounts(v []string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["accounts"] = v
+	return
+}
+
+func (p *UpdateIsoPermissionsParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *UpdateIsoPermissionsParams) SetIsextractable(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isextractable"] = v
+	return
+}
+
+func (p *UpdateIsoPermissionsParams) SetIsfeatured(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isfeatured"] = v
+	return
+}
+
+func (p *UpdateIsoPermissionsParams) SetIspublic(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["ispublic"] = v
+	return
+}
+
+func (p *UpdateIsoPermissionsParams) SetOp(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["op"] = v
+	return
+}
+
+func (p *UpdateIsoPermissionsParams) SetProjectids(v []string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectids"] = v
+	return
+}
+
+// You should always use this function to get a new UpdateIsoPermissionsParams instance,
+// as then you are sure you have configured all required params
+func (s *ISOService) NewUpdateIsoPermissionsParams(id string) *UpdateIsoPermissionsParams {
+	p := &UpdateIsoPermissionsParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Updates ISO permissions
+func (s *ISOService) UpdateIsoPermissions(p *UpdateIsoPermissionsParams) (*UpdateIsoPermissionsResponse, error) {
+	resp, err := s.cs.newRequest("updateIsoPermissions", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r UpdateIsoPermissionsResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type UpdateIsoPermissionsResponse struct {
+	Displaytext string `json:"displaytext"`
+	Success     string `json:"success"`
+}
diff --git a/vendor/github.com/xanzy/go-cloudstack/cloudstack/ImageStoreService.go b/vendor/github.com/xanzy/go-cloudstack/cloudstack/ImageStoreService.go
new file mode 100644
index 0000000..41dc41f
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/cloudstack/ImageStoreService.go
@@ -0,0 +1,1067 @@
+//
+// Copyright 2018, Sander van Harmelen
+//
+// Licensed 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 cloudstack
+
+import (
+	"encoding/json"
+	"fmt"
+	"net/url"
+	"strconv"
+	"strings"
+)
+
+type AddImageStoreParams struct {
+	p map[string]interface{}
+}
+
+func (p *AddImageStoreParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["details"]; found {
+		i := 0
+		for k, vv := range v.(map[string]string) {
+			u.Set(fmt.Sprintf("details[%d].%s", i, k), vv)
+			i++
+		}
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["provider"]; found {
+		u.Set("provider", v.(string))
+	}
+	if v, found := p.p["url"]; found {
+		u.Set("url", v.(string))
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *AddImageStoreParams) SetDetails(v map[string]string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["details"] = v
+	return
+}
+
+func (p *AddImageStoreParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *AddImageStoreParams) SetProvider(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["provider"] = v
+	return
+}
+
+func (p *AddImageStoreParams) SetUrl(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["url"] = v
+	return
+}
+
+func (p *AddImageStoreParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new AddImageStoreParams instance,
+// as then you are sure you have configured all required params
+func (s *ImageStoreService) NewAddImageStoreParams(provider string) *AddImageStoreParams {
+	p := &AddImageStoreParams{}
+	p.p = make(map[string]interface{})
+	p.p["provider"] = provider
+	return p
+}
+
+// Adds backup image store.
+func (s *ImageStoreService) AddImageStore(p *AddImageStoreParams) (*AddImageStoreResponse, error) {
+	resp, err := s.cs.newRequest("addImageStore", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r AddImageStoreResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type AddImageStoreResponse struct {
+	Details      []interface{} `json:"details"`
+	Id           string        `json:"id"`
+	Name         string        `json:"name"`
+	Protocol     string        `json:"protocol"`
+	Providername string        `json:"providername"`
+	Scope        string        `json:"scope"`
+	Url          string        `json:"url"`
+	Zoneid       string        `json:"zoneid"`
+	Zonename     string        `json:"zonename"`
+}
+
+type AddImageStoreS3Params struct {
+	p map[string]interface{}
+}
+
+func (p *AddImageStoreS3Params) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["accesskey"]; found {
+		u.Set("accesskey", v.(string))
+	}
+	if v, found := p.p["bucket"]; found {
+		u.Set("bucket", v.(string))
+	}
+	if v, found := p.p["connectiontimeout"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("connectiontimeout", vv)
+	}
+	if v, found := p.p["connectionttl"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("connectionttl", vv)
+	}
+	if v, found := p.p["endpoint"]; found {
+		u.Set("endpoint", v.(string))
+	}
+	if v, found := p.p["maxerrorretry"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("maxerrorretry", vv)
+	}
+	if v, found := p.p["s3signer"]; found {
+		u.Set("s3signer", v.(string))
+	}
+	if v, found := p.p["secretkey"]; found {
+		u.Set("secretkey", v.(string))
+	}
+	if v, found := p.p["sockettimeout"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("sockettimeout", vv)
+	}
+	if v, found := p.p["usehttps"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("usehttps", vv)
+	}
+	if v, found := p.p["usetcpkeepalive"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("usetcpkeepalive", vv)
+	}
+	return u
+}
+
+func (p *AddImageStoreS3Params) SetAccesskey(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["accesskey"] = v
+	return
+}
+
+func (p *AddImageStoreS3Params) SetBucket(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["bucket"] = v
+	return
+}
+
+func (p *AddImageStoreS3Params) SetConnectiontimeout(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["connectiontimeout"] = v
+	return
+}
+
+func (p *AddImageStoreS3Params) SetConnectionttl(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["connectionttl"] = v
+	return
+}
+
+func (p *AddImageStoreS3Params) SetEndpoint(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["endpoint"] = v
+	return
+}
+
+func (p *AddImageStoreS3Params) SetMaxerrorretry(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["maxerrorretry"] = v
+	return
+}
+
+func (p *AddImageStoreS3Params) SetS3signer(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["s3signer"] = v
+	return
+}
+
+func (p *AddImageStoreS3Params) SetSecretkey(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["secretkey"] = v
+	return
+}
+
+func (p *AddImageStoreS3Params) SetSockettimeout(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["sockettimeout"] = v
+	return
+}
+
+func (p *AddImageStoreS3Params) SetUsehttps(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["usehttps"] = v
+	return
+}
+
+func (p *AddImageStoreS3Params) SetUsetcpkeepalive(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["usetcpkeepalive"] = v
+	return
+}
+
+// You should always use this function to get a new AddImageStoreS3Params instance,
+// as then you are sure you have configured all required params
+func (s *ImageStoreService) NewAddImageStoreS3Params(accesskey string, bucket string, endpoint string, secretkey string) *AddImageStoreS3Params {
+	p := &AddImageStoreS3Params{}
+	p.p = make(map[string]interface{})
+	p.p["accesskey"] = accesskey
+	p.p["bucket"] = bucket
+	p.p["endpoint"] = endpoint
+	p.p["secretkey"] = secretkey
+	return p
+}
+
+// Adds S3 Image Store
+func (s *ImageStoreService) AddImageStoreS3(p *AddImageStoreS3Params) (*AddImageStoreS3Response, error) {
+	resp, err := s.cs.newRequest("addImageStoreS3", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r AddImageStoreS3Response
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type AddImageStoreS3Response struct {
+	Details      []interface{} `json:"details"`
+	Id           string        `json:"id"`
+	Name         string        `json:"name"`
+	Protocol     string        `json:"protocol"`
+	Providername string        `json:"providername"`
+	Scope        string        `json:"scope"`
+	Url          string        `json:"url"`
+	Zoneid       string        `json:"zoneid"`
+	Zonename     string        `json:"zonename"`
+}
+
+type CreateSecondaryStagingStoreParams struct {
+	p map[string]interface{}
+}
+
+func (p *CreateSecondaryStagingStoreParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["details"]; found {
+		i := 0
+		for k, vv := range v.(map[string]string) {
+			u.Set(fmt.Sprintf("details[%d].%s", i, k), vv)
+			i++
+		}
+	}
+	if v, found := p.p["provider"]; found {
+		u.Set("provider", v.(string))
+	}
+	if v, found := p.p["scope"]; found {
+		u.Set("scope", v.(string))
+	}
+	if v, found := p.p["url"]; found {
+		u.Set("url", v.(string))
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *CreateSecondaryStagingStoreParams) SetDetails(v map[string]string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["details"] = v
+	return
+}
+
+func (p *CreateSecondaryStagingStoreParams) SetProvider(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["provider"] = v
+	return
+}
+
+func (p *CreateSecondaryStagingStoreParams) SetScope(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["scope"] = v
+	return
+}
+
+func (p *CreateSecondaryStagingStoreParams) SetUrl(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["url"] = v
+	return
+}
+
+func (p *CreateSecondaryStagingStoreParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new CreateSecondaryStagingStoreParams instance,
+// as then you are sure you have configured all required params
+func (s *ImageStoreService) NewCreateSecondaryStagingStoreParams(url string) *CreateSecondaryStagingStoreParams {
+	p := &CreateSecondaryStagingStoreParams{}
+	p.p = make(map[string]interface{})
+	p.p["url"] = url
+	return p
+}
+
+// create secondary staging store.
+func (s *ImageStoreService) CreateSecondaryStagingStore(p *CreateSecondaryStagingStoreParams) (*CreateSecondaryStagingStoreResponse, error) {
+	resp, err := s.cs.newRequest("createSecondaryStagingStore", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r CreateSecondaryStagingStoreResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type CreateSecondaryStagingStoreResponse struct {
+	Details      []interface{} `json:"details"`
+	Id           string        `json:"id"`
+	Name         string        `json:"name"`
+	Protocol     string        `json:"protocol"`
+	Providername string        `json:"providername"`
+	Scope        string        `json:"scope"`
+	Url          string        `json:"url"`
+	Zoneid       string        `json:"zoneid"`
+	Zonename     string        `json:"zonename"`
+}
+
+type DeleteImageStoreParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeleteImageStoreParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *DeleteImageStoreParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new DeleteImageStoreParams instance,
+// as then you are sure you have configured all required params
+func (s *ImageStoreService) NewDeleteImageStoreParams(id string) *DeleteImageStoreParams {
+	p := &DeleteImageStoreParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Deletes an image store or Secondary Storage.
+func (s *ImageStoreService) DeleteImageStore(p *DeleteImageStoreParams) (*DeleteImageStoreResponse, error) {
+	resp, err := s.cs.newRequest("deleteImageStore", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeleteImageStoreResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type DeleteImageStoreResponse struct {
+	Displaytext string `json:"displaytext"`
+	Success     string `json:"success"`
+}
+
+type DeleteSecondaryStagingStoreParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeleteSecondaryStagingStoreParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *DeleteSecondaryStagingStoreParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new DeleteSecondaryStagingStoreParams instance,
+// as then you are sure you have configured all required params
+func (s *ImageStoreService) NewDeleteSecondaryStagingStoreParams(id string) *DeleteSecondaryStagingStoreParams {
+	p := &DeleteSecondaryStagingStoreParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Deletes a secondary staging store .
+func (s *ImageStoreService) DeleteSecondaryStagingStore(p *DeleteSecondaryStagingStoreParams) (*DeleteSecondaryStagingStoreResponse, error) {
+	resp, err := s.cs.newRequest("deleteSecondaryStagingStore", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeleteSecondaryStagingStoreResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type DeleteSecondaryStagingStoreResponse struct {
+	Displaytext string `json:"displaytext"`
+	Success     string `json:"success"`
+}
+
+type ListImageStoresParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListImageStoresParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["protocol"]; found {
+		u.Set("protocol", v.(string))
+	}
+	if v, found := p.p["provider"]; found {
+		u.Set("provider", v.(string))
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *ListImageStoresParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ListImageStoresParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListImageStoresParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *ListImageStoresParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListImageStoresParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListImageStoresParams) SetProtocol(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["protocol"] = v
+	return
+}
+
+func (p *ListImageStoresParams) SetProvider(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["provider"] = v
+	return
+}
+
+func (p *ListImageStoresParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new ListImageStoresParams instance,
+// as then you are sure you have configured all required params
+func (s *ImageStoreService) NewListImageStoresParams() *ListImageStoresParams {
+	p := &ListImageStoresParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *ImageStoreService) GetImageStoreID(name string, opts ...OptionFunc) (string, int, error) {
+	p := &ListImageStoresParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["name"] = name
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return "", -1, err
+		}
+	}
+
+	l, err := s.ListImageStores(p)
+	if err != nil {
+		return "", -1, err
+	}
+
+	if l.Count == 0 {
+		return "", l.Count, fmt.Errorf("No match found for %s: %+v", name, l)
+	}
+
+	if l.Count == 1 {
+		return l.ImageStores[0].Id, l.Count, nil
+	}
+
+	if l.Count > 1 {
+		for _, v := range l.ImageStores {
+			if v.Name == name {
+				return v.Id, l.Count, nil
+			}
+		}
+	}
+	return "", l.Count, fmt.Errorf("Could not find an exact match for %s: %+v", name, l)
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *ImageStoreService) GetImageStoreByName(name string, opts ...OptionFunc) (*ImageStore, int, error) {
+	id, count, err := s.GetImageStoreID(name, opts...)
+	if err != nil {
+		return nil, count, err
+	}
+
+	r, count, err := s.GetImageStoreByID(id, opts...)
+	if err != nil {
+		return nil, count, err
+	}
+	return r, count, nil
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *ImageStoreService) GetImageStoreByID(id string, opts ...OptionFunc) (*ImageStore, int, error) {
+	p := &ListImageStoresParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["id"] = id
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return nil, -1, err
+		}
+	}
+
+	l, err := s.ListImageStores(p)
+	if err != nil {
+		if strings.Contains(err.Error(), fmt.Sprintf(
+			"Invalid parameter id value=%s due to incorrect long value format, "+
+				"or entity does not exist", id)) {
+			return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
+		}
+		return nil, -1, err
+	}
+
+	if l.Count == 0 {
+		return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
+	}
+
+	if l.Count == 1 {
+		return l.ImageStores[0], l.Count, nil
+	}
+	return nil, l.Count, fmt.Errorf("There is more then one result for ImageStore UUID: %s!", id)
+}
+
+// Lists image stores.
+func (s *ImageStoreService) ListImageStores(p *ListImageStoresParams) (*ListImageStoresResponse, error) {
+	resp, err := s.cs.newRequest("listImageStores", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListImageStoresResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListImageStoresResponse struct {
+	Count       int           `json:"count"`
+	ImageStores []*ImageStore `json:"imagestore"`
+}
+
+type ImageStore struct {
+	Details      []interface{} `json:"details"`
+	Id           string        `json:"id"`
+	Name         string        `json:"name"`
+	Protocol     string        `json:"protocol"`
+	Providername string        `json:"providername"`
+	Scope        string        `json:"scope"`
+	Url          string        `json:"url"`
+	Zoneid       string        `json:"zoneid"`
+	Zonename     string        `json:"zonename"`
+}
+
+type ListSecondaryStagingStoresParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListSecondaryStagingStoresParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["protocol"]; found {
+		u.Set("protocol", v.(string))
+	}
+	if v, found := p.p["provider"]; found {
+		u.Set("provider", v.(string))
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *ListSecondaryStagingStoresParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ListSecondaryStagingStoresParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListSecondaryStagingStoresParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *ListSecondaryStagingStoresParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListSecondaryStagingStoresParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListSecondaryStagingStoresParams) SetProtocol(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["protocol"] = v
+	return
+}
+
+func (p *ListSecondaryStagingStoresParams) SetProvider(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["provider"] = v
+	return
+}
+
+func (p *ListSecondaryStagingStoresParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new ListSecondaryStagingStoresParams instance,
+// as then you are sure you have configured all required params
+func (s *ImageStoreService) NewListSecondaryStagingStoresParams() *ListSecondaryStagingStoresParams {
+	p := &ListSecondaryStagingStoresParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *ImageStoreService) GetSecondaryStagingStoreID(name string, opts ...OptionFunc) (string, int, error) {
+	p := &ListSecondaryStagingStoresParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["name"] = name
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return "", -1, err
+		}
+	}
+
+	l, err := s.ListSecondaryStagingStores(p)
+	if err != nil {
+		return "", -1, err
+	}
+
+	if l.Count == 0 {
+		return "", l.Count, fmt.Errorf("No match found for %s: %+v", name, l)
+	}
+
+	if l.Count == 1 {
+		return l.SecondaryStagingStores[0].Id, l.Count, nil
+	}
+
+	if l.Count > 1 {
+		for _, v := range l.SecondaryStagingStores {
+			if v.Name == name {
+				return v.Id, l.Count, nil
+			}
+		}
+	}
+	return "", l.Count, fmt.Errorf("Could not find an exact match for %s: %+v", name, l)
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *ImageStoreService) GetSecondaryStagingStoreByName(name string, opts ...OptionFunc) (*SecondaryStagingStore, int, error) {
+	id, count, err := s.GetSecondaryStagingStoreID(name, opts...)
+	if err != nil {
+		return nil, count, err
+	}
+
+	r, count, err := s.GetSecondaryStagingStoreByID(id, opts...)
+	if err != nil {
+		return nil, count, err
+	}
+	return r, count, nil
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *ImageStoreService) GetSecondaryStagingStoreByID(id string, opts ...OptionFunc) (*SecondaryStagingStore, int, error) {
+	p := &ListSecondaryStagingStoresParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["id"] = id
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return nil, -1, err
+		}
+	}
+
+	l, err := s.ListSecondaryStagingStores(p)
+	if err != nil {
+		if strings.Contains(err.Error(), fmt.Sprintf(
+			"Invalid parameter id value=%s due to incorrect long value format, "+
+				"or entity does not exist", id)) {
+			return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
+		}
+		return nil, -1, err
+	}
+
+	if l.Count == 0 {
+		return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
+	}
+
+	if l.Count == 1 {
+		return l.SecondaryStagingStores[0], l.Count, nil
+	}
+	return nil, l.Count, fmt.Errorf("There is more then one result for SecondaryStagingStore UUID: %s!", id)
+}
+
+// Lists secondary staging stores.
+func (s *ImageStoreService) ListSecondaryStagingStores(p *ListSecondaryStagingStoresParams) (*ListSecondaryStagingStoresResponse, error) {
+	resp, err := s.cs.newRequest("listSecondaryStagingStores", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListSecondaryStagingStoresResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListSecondaryStagingStoresResponse struct {
+	Count                  int                      `json:"count"`
+	SecondaryStagingStores []*SecondaryStagingStore `json:"secondarystagingstore"`
+}
+
+type SecondaryStagingStore struct {
+	Details      []interface{} `json:"details"`
+	Id           string        `json:"id"`
+	Name         string        `json:"name"`
+	Protocol     string        `json:"protocol"`
+	Providername string        `json:"providername"`
+	Scope        string        `json:"scope"`
+	Url          string        `json:"url"`
+	Zoneid       string        `json:"zoneid"`
+	Zonename     string        `json:"zonename"`
+}
+
+type UpdateCloudToUseObjectStoreParams struct {
+	p map[string]interface{}
+}
+
+func (p *UpdateCloudToUseObjectStoreParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["details"]; found {
+		i := 0
+		for k, vv := range v.(map[string]string) {
+			u.Set(fmt.Sprintf("details[%d].%s", i, k), vv)
+			i++
+		}
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["provider"]; found {
+		u.Set("provider", v.(string))
+	}
+	if v, found := p.p["url"]; found {
+		u.Set("url", v.(string))
+	}
+	return u
+}
+
+func (p *UpdateCloudToUseObjectStoreParams) SetDetails(v map[string]string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["details"] = v
+	return
+}
+
+func (p *UpdateCloudToUseObjectStoreParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *UpdateCloudToUseObjectStoreParams) SetProvider(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["provider"] = v
+	return
+}
+
+func (p *UpdateCloudToUseObjectStoreParams) SetUrl(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["url"] = v
+	return
+}
+
+// You should always use this function to get a new UpdateCloudToUseObjectStoreParams instance,
+// as then you are sure you have configured all required params
+func (s *ImageStoreService) NewUpdateCloudToUseObjectStoreParams(provider string) *UpdateCloudToUseObjectStoreParams {
+	p := &UpdateCloudToUseObjectStoreParams{}
+	p.p = make(map[string]interface{})
+	p.p["provider"] = provider
+	return p
+}
+
+// Migrate current NFS secondary storages to use object store.
+func (s *ImageStoreService) UpdateCloudToUseObjectStore(p *UpdateCloudToUseObjectStoreParams) (*UpdateCloudToUseObjectStoreResponse, error) {
+	resp, err := s.cs.newRequest("updateCloudToUseObjectStore", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r UpdateCloudToUseObjectStoreResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type UpdateCloudToUseObjectStoreResponse struct {
+	Details      []interface{} `json:"details"`
+	Id           string        `json:"id"`
+	Name         string        `json:"name"`
+	Protocol     string        `json:"protocol"`
+	Providername string        `json:"providername"`
+	Scope        string        `json:"scope"`
+	Url          string        `json:"url"`
+	Zoneid       string        `json:"zoneid"`
+	Zonename     string        `json:"zonename"`
+}
diff --git a/vendor/github.com/xanzy/go-cloudstack/cloudstack/InternalLBService.go b/vendor/github.com/xanzy/go-cloudstack/cloudstack/InternalLBService.go
new file mode 100644
index 0000000..00a7e0e
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/cloudstack/InternalLBService.go
@@ -0,0 +1,1016 @@
+//
+// Copyright 2018, Sander van Harmelen
+//
+// Licensed 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 cloudstack
+
+import (
+	"encoding/json"
+	"fmt"
+	"net/url"
+	"strconv"
+	"strings"
+)
+
+type ConfigureInternalLoadBalancerElementParams struct {
+	p map[string]interface{}
+}
+
+func (p *ConfigureInternalLoadBalancerElementParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["enabled"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("enabled", vv)
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *ConfigureInternalLoadBalancerElementParams) SetEnabled(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["enabled"] = v
+	return
+}
+
+func (p *ConfigureInternalLoadBalancerElementParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new ConfigureInternalLoadBalancerElementParams instance,
+// as then you are sure you have configured all required params
+func (s *InternalLBService) NewConfigureInternalLoadBalancerElementParams(enabled bool, id string) *ConfigureInternalLoadBalancerElementParams {
+	p := &ConfigureInternalLoadBalancerElementParams{}
+	p.p = make(map[string]interface{})
+	p.p["enabled"] = enabled
+	p.p["id"] = id
+	return p
+}
+
+// Configures an Internal Load Balancer element.
+func (s *InternalLBService) ConfigureInternalLoadBalancerElement(p *ConfigureInternalLoadBalancerElementParams) (*InternalLoadBalancerElementResponse, error) {
+	resp, err := s.cs.newRequest("configureInternalLoadBalancerElement", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r InternalLoadBalancerElementResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type InternalLoadBalancerElementResponse struct {
+	JobID   string `json:"jobid"`
+	Enabled bool   `json:"enabled"`
+	Id      string `json:"id"`
+	Nspid   string `json:"nspid"`
+}
+
+type CreateInternalLoadBalancerElementParams struct {
+	p map[string]interface{}
+}
+
+func (p *CreateInternalLoadBalancerElementParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["nspid"]; found {
+		u.Set("nspid", v.(string))
+	}
+	return u
+}
+
+func (p *CreateInternalLoadBalancerElementParams) SetNspid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["nspid"] = v
+	return
+}
+
+// You should always use this function to get a new CreateInternalLoadBalancerElementParams instance,
+// as then you are sure you have configured all required params
+func (s *InternalLBService) NewCreateInternalLoadBalancerElementParams(nspid string) *CreateInternalLoadBalancerElementParams {
+	p := &CreateInternalLoadBalancerElementParams{}
+	p.p = make(map[string]interface{})
+	p.p["nspid"] = nspid
+	return p
+}
+
+// Create an Internal Load Balancer element.
+func (s *InternalLBService) CreateInternalLoadBalancerElement(p *CreateInternalLoadBalancerElementParams) (*CreateInternalLoadBalancerElementResponse, error) {
+	resp, err := s.cs.newRequest("createInternalLoadBalancerElement", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r CreateInternalLoadBalancerElementResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type CreateInternalLoadBalancerElementResponse struct {
+	JobID   string `json:"jobid"`
+	Enabled bool   `json:"enabled"`
+	Id      string `json:"id"`
+	Nspid   string `json:"nspid"`
+}
+
+type ListInternalLoadBalancerElementsParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListInternalLoadBalancerElementsParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["enabled"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("enabled", vv)
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["nspid"]; found {
+		u.Set("nspid", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	return u
+}
+
+func (p *ListInternalLoadBalancerElementsParams) SetEnabled(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["enabled"] = v
+	return
+}
+
+func (p *ListInternalLoadBalancerElementsParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ListInternalLoadBalancerElementsParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListInternalLoadBalancerElementsParams) SetNspid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["nspid"] = v
+	return
+}
+
+func (p *ListInternalLoadBalancerElementsParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListInternalLoadBalancerElementsParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+// You should always use this function to get a new ListInternalLoadBalancerElementsParams instance,
+// as then you are sure you have configured all required params
+func (s *InternalLBService) NewListInternalLoadBalancerElementsParams() *ListInternalLoadBalancerElementsParams {
+	p := &ListInternalLoadBalancerElementsParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *InternalLBService) GetInternalLoadBalancerElementByID(id string, opts ...OptionFunc) (*InternalLoadBalancerElement, int, error) {
+	p := &ListInternalLoadBalancerElementsParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["id"] = id
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return nil, -1, err
+		}
+	}
+
+	l, err := s.ListInternalLoadBalancerElements(p)
+	if err != nil {
+		if strings.Contains(err.Error(), fmt.Sprintf(
+			"Invalid parameter id value=%s due to incorrect long value format, "+
+				"or entity does not exist", id)) {
+			return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
+		}
+		return nil, -1, err
+	}
+
+	if l.Count == 0 {
+		return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
+	}
+
+	if l.Count == 1 {
+		return l.InternalLoadBalancerElements[0], l.Count, nil
+	}
+	return nil, l.Count, fmt.Errorf("There is more then one result for InternalLoadBalancerElement UUID: %s!", id)
+}
+
+// Lists all available Internal Load Balancer elements.
+func (s *InternalLBService) ListInternalLoadBalancerElements(p *ListInternalLoadBalancerElementsParams) (*ListInternalLoadBalancerElementsResponse, error) {
+	resp, err := s.cs.newRequest("listInternalLoadBalancerElements", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListInternalLoadBalancerElementsResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListInternalLoadBalancerElementsResponse struct {
+	Count                        int                            `json:"count"`
+	InternalLoadBalancerElements []*InternalLoadBalancerElement `json:"internalloadbalancerelement"`
+}
+
+type InternalLoadBalancerElement struct {
+	Enabled bool   `json:"enabled"`
+	Id      string `json:"id"`
+	Nspid   string `json:"nspid"`
+}
+
+type ListInternalLoadBalancerVMsParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListInternalLoadBalancerVMsParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["forvpc"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("forvpc", vv)
+	}
+	if v, found := p.p["hostid"]; found {
+		u.Set("hostid", v.(string))
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["isrecursive"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("isrecursive", vv)
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["listall"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("listall", vv)
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["networkid"]; found {
+		u.Set("networkid", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["podid"]; found {
+		u.Set("podid", v.(string))
+	}
+	if v, found := p.p["projectid"]; found {
+		u.Set("projectid", v.(string))
+	}
+	if v, found := p.p["state"]; found {
+		u.Set("state", v.(string))
+	}
+	if v, found := p.p["vpcid"]; found {
+		u.Set("vpcid", v.(string))
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *ListInternalLoadBalancerVMsParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *ListInternalLoadBalancerVMsParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *ListInternalLoadBalancerVMsParams) SetForvpc(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["forvpc"] = v
+	return
+}
+
+func (p *ListInternalLoadBalancerVMsParams) SetHostid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["hostid"] = v
+	return
+}
+
+func (p *ListInternalLoadBalancerVMsParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ListInternalLoadBalancerVMsParams) SetIsrecursive(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isrecursive"] = v
+	return
+}
+
+func (p *ListInternalLoadBalancerVMsParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListInternalLoadBalancerVMsParams) SetListall(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["listall"] = v
+	return
+}
+
+func (p *ListInternalLoadBalancerVMsParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *ListInternalLoadBalancerVMsParams) SetNetworkid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["networkid"] = v
+	return
+}
+
+func (p *ListInternalLoadBalancerVMsParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListInternalLoadBalancerVMsParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListInternalLoadBalancerVMsParams) SetPodid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["podid"] = v
+	return
+}
+
+func (p *ListInternalLoadBalancerVMsParams) SetProjectid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectid"] = v
+	return
+}
+
+func (p *ListInternalLoadBalancerVMsParams) SetState(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["state"] = v
+	return
+}
+
+func (p *ListInternalLoadBalancerVMsParams) SetVpcid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["vpcid"] = v
+	return
+}
+
+func (p *ListInternalLoadBalancerVMsParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new ListInternalLoadBalancerVMsParams instance,
+// as then you are sure you have configured all required params
+func (s *InternalLBService) NewListInternalLoadBalancerVMsParams() *ListInternalLoadBalancerVMsParams {
+	p := &ListInternalLoadBalancerVMsParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *InternalLBService) GetInternalLoadBalancerVMID(name string, opts ...OptionFunc) (string, int, error) {
+	p := &ListInternalLoadBalancerVMsParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["name"] = name
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return "", -1, err
+		}
+	}
+
+	l, err := s.ListInternalLoadBalancerVMs(p)
+	if err != nil {
+		return "", -1, err
+	}
+
+	if l.Count == 0 {
+		return "", l.Count, fmt.Errorf("No match found for %s: %+v", name, l)
+	}
+
+	if l.Count == 1 {
+		return l.InternalLoadBalancerVMs[0].Id, l.Count, nil
+	}
+
+	if l.Count > 1 {
+		for _, v := range l.InternalLoadBalancerVMs {
+			if v.Name == name {
+				return v.Id, l.Count, nil
+			}
+		}
+	}
+	return "", l.Count, fmt.Errorf("Could not find an exact match for %s: %+v", name, l)
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *InternalLBService) GetInternalLoadBalancerVMByName(name string, opts ...OptionFunc) (*InternalLoadBalancerVM, int, error) {
+	id, count, err := s.GetInternalLoadBalancerVMID(name, opts...)
+	if err != nil {
+		return nil, count, err
+	}
+
+	r, count, err := s.GetInternalLoadBalancerVMByID(id, opts...)
+	if err != nil {
+		return nil, count, err
+	}
+	return r, count, nil
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *InternalLBService) GetInternalLoadBalancerVMByID(id string, opts ...OptionFunc) (*InternalLoadBalancerVM, int, error) {
+	p := &ListInternalLoadBalancerVMsParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["id"] = id
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return nil, -1, err
+		}
+	}
+
+	l, err := s.ListInternalLoadBalancerVMs(p)
+	if err != nil {
+		if strings.Contains(err.Error(), fmt.Sprintf(
+			"Invalid parameter id value=%s due to incorrect long value format, "+
+				"or entity does not exist", id)) {
+			return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
+		}
+		return nil, -1, err
+	}
+
+	if l.Count == 0 {
+		return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
+	}
+
+	if l.Count == 1 {
+		return l.InternalLoadBalancerVMs[0], l.Count, nil
+	}
+	return nil, l.Count, fmt.Errorf("There is more then one result for InternalLoadBalancerVM UUID: %s!", id)
+}
+
+// List internal LB VMs.
+func (s *InternalLBService) ListInternalLoadBalancerVMs(p *ListInternalLoadBalancerVMsParams) (*ListInternalLoadBalancerVMsResponse, error) {
+	resp, err := s.cs.newRequest("listInternalLoadBalancerVMs", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListInternalLoadBalancerVMsResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListInternalLoadBalancerVMsResponse struct {
+	Count                   int                       `json:"count"`
+	InternalLoadBalancerVMs []*InternalLoadBalancerVM `json:"internalloadbalancervm"`
+}
+
+type InternalLoadBalancerVM struct {
+	Account             string `json:"account"`
+	Created             string `json:"created"`
+	Dns1                string `json:"dns1"`
+	Dns2                string `json:"dns2"`
+	Domain              string `json:"domain"`
+	Domainid            string `json:"domainid"`
+	Gateway             string `json:"gateway"`
+	Guestipaddress      string `json:"guestipaddress"`
+	Guestmacaddress     string `json:"guestmacaddress"`
+	Guestnetmask        string `json:"guestnetmask"`
+	Guestnetworkid      string `json:"guestnetworkid"`
+	Guestnetworkname    string `json:"guestnetworkname"`
+	Hostid              string `json:"hostid"`
+	Hostname            string `json:"hostname"`
+	Hypervisor          string `json:"hypervisor"`
+	Id                  string `json:"id"`
+	Ip6dns1             string `json:"ip6dns1"`
+	Ip6dns2             string `json:"ip6dns2"`
+	Isredundantrouter   bool   `json:"isredundantrouter"`
+	Linklocalip         string `json:"linklocalip"`
+	Linklocalmacaddress string `json:"linklocalmacaddress"`
+	Linklocalnetmask    string `json:"linklocalnetmask"`
+	Linklocalnetworkid  string `json:"linklocalnetworkid"`
+	Name                string `json:"name"`
+	Networkdomain       string `json:"networkdomain"`
+	Nic                 []struct {
+		Broadcasturi         string `json:"broadcasturi"`
+		Deviceid             string `json:"deviceid"`
+		Gateway              string `json:"gateway"`
+		Id                   string `json:"id"`
+		Ip6address           string `json:"ip6address"`
+		Ip6cidr              string `json:"ip6cidr"`
+		Ip6gateway           string `json:"ip6gateway"`
+		Ipaddress            string `json:"ipaddress"`
+		Isdefault            bool   `json:"isdefault"`
+		Isolationuri         string `json:"isolationuri"`
+		Macaddress           string `json:"macaddress"`
+		Netmask              string `json:"netmask"`
+		Networkid            string `json:"networkid"`
+		Networkname          string `json:"networkname"`
+		Nsxlogicalswitch     string `json:"nsxlogicalswitch"`
+		Nsxlogicalswitchport string `json:"nsxlogicalswitchport"`
+		Secondaryip          []struct {
+			Id        string `json:"id"`
+			Ipaddress string `json:"ipaddress"`
+		} `json:"secondaryip"`
+		Traffictype      string `json:"traffictype"`
+		Type             string `json:"type"`
+		Virtualmachineid string `json:"virtualmachineid"`
+	} `json:"nic"`
+	Podid               string `json:"podid"`
+	Project             string `json:"project"`
+	Projectid           string `json:"projectid"`
+	Publicip            string `json:"publicip"`
+	Publicmacaddress    string `json:"publicmacaddress"`
+	Publicnetmask       string `json:"publicnetmask"`
+	Publicnetworkid     string `json:"publicnetworkid"`
+	Redundantstate      string `json:"redundantstate"`
+	Requiresupgrade     bool   `json:"requiresupgrade"`
+	Role                string `json:"role"`
+	Scriptsversion      string `json:"scriptsversion"`
+	Serviceofferingid   string `json:"serviceofferingid"`
+	Serviceofferingname string `json:"serviceofferingname"`
+	State               string `json:"state"`
+	Templateid          string `json:"templateid"`
+	Version             string `json:"version"`
+	Vpcid               string `json:"vpcid"`
+	Vpcname             string `json:"vpcname"`
+	Zoneid              string `json:"zoneid"`
+	Zonename            string `json:"zonename"`
+}
+
+type StartInternalLoadBalancerVMParams struct {
+	p map[string]interface{}
+}
+
+func (p *StartInternalLoadBalancerVMParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *StartInternalLoadBalancerVMParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new StartInternalLoadBalancerVMParams instance,
+// as then you are sure you have configured all required params
+func (s *InternalLBService) NewStartInternalLoadBalancerVMParams(id string) *StartInternalLoadBalancerVMParams {
+	p := &StartInternalLoadBalancerVMParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Starts an existing internal lb vm.
+func (s *InternalLBService) StartInternalLoadBalancerVM(p *StartInternalLoadBalancerVMParams) (*StartInternalLoadBalancerVMResponse, error) {
+	resp, err := s.cs.newRequest("startInternalLoadBalancerVM", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r StartInternalLoadBalancerVMResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type StartInternalLoadBalancerVMResponse struct {
+	JobID               string `json:"jobid"`
+	Account             string `json:"account"`
+	Created             string `json:"created"`
+	Dns1                string `json:"dns1"`
+	Dns2                string `json:"dns2"`
+	Domain              string `json:"domain"`
+	Domainid            string `json:"domainid"`
+	Gateway             string `json:"gateway"`
+	Guestipaddress      string `json:"guestipaddress"`
+	Guestmacaddress     string `json:"guestmacaddress"`
+	Guestnetmask        string `json:"guestnetmask"`
+	Guestnetworkid      string `json:"guestnetworkid"`
+	Guestnetworkname    string `json:"guestnetworkname"`
+	Hostid              string `json:"hostid"`
+	Hostname            string `json:"hostname"`
+	Hypervisor          string `json:"hypervisor"`
+	Id                  string `json:"id"`
+	Ip6dns1             string `json:"ip6dns1"`
+	Ip6dns2             string `json:"ip6dns2"`
+	Isredundantrouter   bool   `json:"isredundantrouter"`
+	Linklocalip         string `json:"linklocalip"`
+	Linklocalmacaddress string `json:"linklocalmacaddress"`
+	Linklocalnetmask    string `json:"linklocalnetmask"`
+	Linklocalnetworkid  string `json:"linklocalnetworkid"`
+	Name                string `json:"name"`
+	Networkdomain       string `json:"networkdomain"`
+	Nic                 []struct {
+		Broadcasturi         string `json:"broadcasturi"`
+		Deviceid             string `json:"deviceid"`
+		Gateway              string `json:"gateway"`
+		Id                   string `json:"id"`
+		Ip6address           string `json:"ip6address"`
+		Ip6cidr              string `json:"ip6cidr"`
+		Ip6gateway           string `json:"ip6gateway"`
+		Ipaddress            string `json:"ipaddress"`
+		Isdefault            bool   `json:"isdefault"`
+		Isolationuri         string `json:"isolationuri"`
+		Macaddress           string `json:"macaddress"`
+		Netmask              string `json:"netmask"`
+		Networkid            string `json:"networkid"`
+		Networkname          string `json:"networkname"`
+		Nsxlogicalswitch     string `json:"nsxlogicalswitch"`
+		Nsxlogicalswitchport string `json:"nsxlogicalswitchport"`
+		Secondaryip          []struct {
+			Id        string `json:"id"`
+			Ipaddress string `json:"ipaddress"`
+		} `json:"secondaryip"`
+		Traffictype      string `json:"traffictype"`
+		Type             string `json:"type"`
+		Virtualmachineid string `json:"virtualmachineid"`
+	} `json:"nic"`
+	Podid               string `json:"podid"`
+	Project             string `json:"project"`
+	Projectid           string `json:"projectid"`
+	Publicip            string `json:"publicip"`
+	Publicmacaddress    string `json:"publicmacaddress"`
+	Publicnetmask       string `json:"publicnetmask"`
+	Publicnetworkid     string `json:"publicnetworkid"`
+	Redundantstate      string `json:"redundantstate"`
+	Requiresupgrade     bool   `json:"requiresupgrade"`
+	Role                string `json:"role"`
+	Scriptsversion      string `json:"scriptsversion"`
+	Serviceofferingid   string `json:"serviceofferingid"`
+	Serviceofferingname string `json:"serviceofferingname"`
+	State               string `json:"state"`
+	Templateid          string `json:"templateid"`
+	Version             string `json:"version"`
+	Vpcid               string `json:"vpcid"`
+	Vpcname             string `json:"vpcname"`
+	Zoneid              string `json:"zoneid"`
+	Zonename            string `json:"zonename"`
+}
+
+type StopInternalLoadBalancerVMParams struct {
+	p map[string]interface{}
+}
+
+func (p *StopInternalLoadBalancerVMParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["forced"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("forced", vv)
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *StopInternalLoadBalancerVMParams) SetForced(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["forced"] = v
+	return
+}
+
+func (p *StopInternalLoadBalancerVMParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new StopInternalLoadBalancerVMParams instance,
+// as then you are sure you have configured all required params
+func (s *InternalLBService) NewStopInternalLoadBalancerVMParams(id string) *StopInternalLoadBalancerVMParams {
+	p := &StopInternalLoadBalancerVMParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Stops an Internal LB vm.
+func (s *InternalLBService) StopInternalLoadBalancerVM(p *StopInternalLoadBalancerVMParams) (*StopInternalLoadBalancerVMResponse, error) {
+	resp, err := s.cs.newRequest("stopInternalLoadBalancerVM", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r StopInternalLoadBalancerVMResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type StopInternalLoadBalancerVMResponse struct {
+	JobID               string `json:"jobid"`
+	Account             string `json:"account"`
+	Created             string `json:"created"`
+	Dns1                string `json:"dns1"`
+	Dns2                string `json:"dns2"`
+	Domain              string `json:"domain"`
+	Domainid            string `json:"domainid"`
+	Gateway             string `json:"gateway"`
+	Guestipaddress      string `json:"guestipaddress"`
+	Guestmacaddress     string `json:"guestmacaddress"`
+	Guestnetmask        string `json:"guestnetmask"`
+	Guestnetworkid      string `json:"guestnetworkid"`
+	Guestnetworkname    string `json:"guestnetworkname"`
+	Hostid              string `json:"hostid"`
+	Hostname            string `json:"hostname"`
+	Hypervisor          string `json:"hypervisor"`
+	Id                  string `json:"id"`
+	Ip6dns1             string `json:"ip6dns1"`
+	Ip6dns2             string `json:"ip6dns2"`
+	Isredundantrouter   bool   `json:"isredundantrouter"`
+	Linklocalip         string `json:"linklocalip"`
+	Linklocalmacaddress string `json:"linklocalmacaddress"`
+	Linklocalnetmask    string `json:"linklocalnetmask"`
+	Linklocalnetworkid  string `json:"linklocalnetworkid"`
+	Name                string `json:"name"`
+	Networkdomain       string `json:"networkdomain"`
+	Nic                 []struct {
+		Broadcasturi         string `json:"broadcasturi"`
+		Deviceid             string `json:"deviceid"`
+		Gateway              string `json:"gateway"`
+		Id                   string `json:"id"`
+		Ip6address           string `json:"ip6address"`
+		Ip6cidr              string `json:"ip6cidr"`
+		Ip6gateway           string `json:"ip6gateway"`
+		Ipaddress            string `json:"ipaddress"`
+		Isdefault            bool   `json:"isdefault"`
+		Isolationuri         string `json:"isolationuri"`
+		Macaddress           string `json:"macaddress"`
+		Netmask              string `json:"netmask"`
+		Networkid            string `json:"networkid"`
+		Networkname          string `json:"networkname"`
+		Nsxlogicalswitch     string `json:"nsxlogicalswitch"`
+		Nsxlogicalswitchport string `json:"nsxlogicalswitchport"`
+		Secondaryip          []struct {
+			Id        string `json:"id"`
+			Ipaddress string `json:"ipaddress"`
+		} `json:"secondaryip"`
+		Traffictype      string `json:"traffictype"`
+		Type             string `json:"type"`
+		Virtualmachineid string `json:"virtualmachineid"`
+	} `json:"nic"`
+	Podid               string `json:"podid"`
+	Project             string `json:"project"`
+	Projectid           string `json:"projectid"`
+	Publicip            string `json:"publicip"`
+	Publicmacaddress    string `json:"publicmacaddress"`
+	Publicnetmask       string `json:"publicnetmask"`
+	Publicnetworkid     string `json:"publicnetworkid"`
+	Redundantstate      string `json:"redundantstate"`
+	Requiresupgrade     bool   `json:"requiresupgrade"`
+	Role                string `json:"role"`
+	Scriptsversion      string `json:"scriptsversion"`
+	Serviceofferingid   string `json:"serviceofferingid"`
+	Serviceofferingname string `json:"serviceofferingname"`
+	State               string `json:"state"`
+	Templateid          string `json:"templateid"`
+	Version             string `json:"version"`
+	Vpcid               string `json:"vpcid"`
+	Vpcname             string `json:"vpcname"`
+	Zoneid              string `json:"zoneid"`
+	Zonename            string `json:"zonename"`
+}
diff --git a/vendor/github.com/xanzy/go-cloudstack/cloudstack/LDAPService.go b/vendor/github.com/xanzy/go-cloudstack/cloudstack/LDAPService.go
new file mode 100644
index 0000000..1188d20
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/cloudstack/LDAPService.go
@@ -0,0 +1,1130 @@
+//
+// Copyright 2018, Sander van Harmelen
+//
+// Licensed 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 cloudstack
+
+import (
+	"encoding/json"
+	"fmt"
+	"net/url"
+	"strconv"
+)
+
+type AddLdapConfigurationParams struct {
+	p map[string]interface{}
+}
+
+func (p *AddLdapConfigurationParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["hostname"]; found {
+		u.Set("hostname", v.(string))
+	}
+	if v, found := p.p["port"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("port", vv)
+	}
+	return u
+}
+
+func (p *AddLdapConfigurationParams) SetHostname(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["hostname"] = v
+	return
+}
+
+func (p *AddLdapConfigurationParams) SetPort(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["port"] = v
+	return
+}
+
+// You should always use this function to get a new AddLdapConfigurationParams instance,
+// as then you are sure you have configured all required params
+func (s *LDAPService) NewAddLdapConfigurationParams(hostname string, port int) *AddLdapConfigurationParams {
+	p := &AddLdapConfigurationParams{}
+	p.p = make(map[string]interface{})
+	p.p["hostname"] = hostname
+	p.p["port"] = port
+	return p
+}
+
+// Add a new Ldap Configuration
+func (s *LDAPService) AddLdapConfiguration(p *AddLdapConfigurationParams) (*AddLdapConfigurationResponse, error) {
+	resp, err := s.cs.newRequest("addLdapConfiguration", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r AddLdapConfigurationResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type AddLdapConfigurationResponse struct {
+	Hostname string `json:"hostname"`
+	Port     int    `json:"port"`
+}
+
+type DeleteLdapConfigurationParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeleteLdapConfigurationParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["hostname"]; found {
+		u.Set("hostname", v.(string))
+	}
+	return u
+}
+
+func (p *DeleteLdapConfigurationParams) SetHostname(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["hostname"] = v
+	return
+}
+
+// You should always use this function to get a new DeleteLdapConfigurationParams instance,
+// as then you are sure you have configured all required params
+func (s *LDAPService) NewDeleteLdapConfigurationParams(hostname string) *DeleteLdapConfigurationParams {
+	p := &DeleteLdapConfigurationParams{}
+	p.p = make(map[string]interface{})
+	p.p["hostname"] = hostname
+	return p
+}
+
+// Remove an Ldap Configuration
+func (s *LDAPService) DeleteLdapConfiguration(p *DeleteLdapConfigurationParams) (*DeleteLdapConfigurationResponse, error) {
+	resp, err := s.cs.newRequest("deleteLdapConfiguration", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeleteLdapConfigurationResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type DeleteLdapConfigurationResponse struct {
+	Hostname string `json:"hostname"`
+	Port     int    `json:"port"`
+}
+
+type ImportLdapUsersParams struct {
+	p map[string]interface{}
+}
+
+func (p *ImportLdapUsersParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["accountdetails"]; found {
+		i := 0
+		for k, vv := range v.(map[string]string) {
+			u.Set(fmt.Sprintf("accountdetails[%d].key", i), k)
+			u.Set(fmt.Sprintf("accountdetails[%d].value", i), vv)
+			i++
+		}
+	}
+	if v, found := p.p["accounttype"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("accounttype", vv)
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["group"]; found {
+		u.Set("group", v.(string))
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["roleid"]; found {
+		u.Set("roleid", v.(string))
+	}
+	if v, found := p.p["timezone"]; found {
+		u.Set("timezone", v.(string))
+	}
+	return u
+}
+
+func (p *ImportLdapUsersParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *ImportLdapUsersParams) SetAccountdetails(v map[string]string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["accountdetails"] = v
+	return
+}
+
+func (p *ImportLdapUsersParams) SetAccounttype(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["accounttype"] = v
+	return
+}
+
+func (p *ImportLdapUsersParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *ImportLdapUsersParams) SetGroup(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["group"] = v
+	return
+}
+
+func (p *ImportLdapUsersParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ImportLdapUsersParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ImportLdapUsersParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ImportLdapUsersParams) SetRoleid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["roleid"] = v
+	return
+}
+
+func (p *ImportLdapUsersParams) SetTimezone(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["timezone"] = v
+	return
+}
+
+// You should always use this function to get a new ImportLdapUsersParams instance,
+// as then you are sure you have configured all required params
+func (s *LDAPService) NewImportLdapUsersParams() *ImportLdapUsersParams {
+	p := &ImportLdapUsersParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// Import LDAP users
+func (s *LDAPService) ImportLdapUsers(p *ImportLdapUsersParams) (*ImportLdapUsersResponse, error) {
+	resp, err := s.cs.newRequest("importLdapUsers", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ImportLdapUsersResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ImportLdapUsersResponse struct {
+	Domain    string `json:"domain"`
+	Email     string `json:"email"`
+	Firstname string `json:"firstname"`
+	Lastname  string `json:"lastname"`
+	Principal string `json:"principal"`
+	Username  string `json:"username"`
+}
+
+type LdapConfigParams struct {
+	p map[string]interface{}
+}
+
+func (p *LdapConfigParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["binddn"]; found {
+		u.Set("binddn", v.(string))
+	}
+	if v, found := p.p["bindpass"]; found {
+		u.Set("bindpass", v.(string))
+	}
+	if v, found := p.p["hostname"]; found {
+		u.Set("hostname", v.(string))
+	}
+	if v, found := p.p["listall"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("listall", vv)
+	}
+	if v, found := p.p["port"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("port", vv)
+	}
+	if v, found := p.p["queryfilter"]; found {
+		u.Set("queryfilter", v.(string))
+	}
+	if v, found := p.p["searchbase"]; found {
+		u.Set("searchbase", v.(string))
+	}
+	if v, found := p.p["ssl"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("ssl", vv)
+	}
+	if v, found := p.p["truststore"]; found {
+		u.Set("truststore", v.(string))
+	}
+	if v, found := p.p["truststorepass"]; found {
+		u.Set("truststorepass", v.(string))
+	}
+	return u
+}
+
+func (p *LdapConfigParams) SetBinddn(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["binddn"] = v
+	return
+}
+
+func (p *LdapConfigParams) SetBindpass(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["bindpass"] = v
+	return
+}
+
+func (p *LdapConfigParams) SetHostname(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["hostname"] = v
+	return
+}
+
+func (p *LdapConfigParams) SetListall(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["listall"] = v
+	return
+}
+
+func (p *LdapConfigParams) SetPort(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["port"] = v
+	return
+}
+
+func (p *LdapConfigParams) SetQueryfilter(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["queryfilter"] = v
+	return
+}
+
+func (p *LdapConfigParams) SetSearchbase(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["searchbase"] = v
+	return
+}
+
+func (p *LdapConfigParams) SetSsl(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["ssl"] = v
+	return
+}
+
+func (p *LdapConfigParams) SetTruststore(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["truststore"] = v
+	return
+}
+
+func (p *LdapConfigParams) SetTruststorepass(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["truststorepass"] = v
+	return
+}
+
+// You should always use this function to get a new LdapConfigParams instance,
+// as then you are sure you have configured all required params
+func (s *LDAPService) NewLdapConfigParams() *LdapConfigParams {
+	p := &LdapConfigParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// Configure the LDAP context for this site.
+func (s *LDAPService) LdapConfig(p *LdapConfigParams) (*LdapConfigResponse, error) {
+	resp, err := s.cs.newRequest("ldapConfig", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r LdapConfigResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type LdapConfigResponse struct {
+	Binddn      string `json:"binddn"`
+	Bindpass    string `json:"bindpass"`
+	Hostname    string `json:"hostname"`
+	Port        string `json:"port"`
+	Queryfilter string `json:"queryfilter"`
+	Searchbase  string `json:"searchbase"`
+	Ssl         string `json:"ssl"`
+}
+
+type LdapCreateAccountParams struct {
+	p map[string]interface{}
+}
+
+func (p *LdapCreateAccountParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["accountdetails"]; found {
+		i := 0
+		for k, vv := range v.(map[string]string) {
+			u.Set(fmt.Sprintf("accountdetails[%d].key", i), k)
+			u.Set(fmt.Sprintf("accountdetails[%d].value", i), vv)
+			i++
+		}
+	}
+	if v, found := p.p["accountid"]; found {
+		u.Set("accountid", v.(string))
+	}
+	if v, found := p.p["accounttype"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("accounttype", vv)
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["networkdomain"]; found {
+		u.Set("networkdomain", v.(string))
+	}
+	if v, found := p.p["roleid"]; found {
+		u.Set("roleid", v.(string))
+	}
+	if v, found := p.p["timezone"]; found {
+		u.Set("timezone", v.(string))
+	}
+	if v, found := p.p["userid"]; found {
+		u.Set("userid", v.(string))
+	}
+	if v, found := p.p["username"]; found {
+		u.Set("username", v.(string))
+	}
+	return u
+}
+
+func (p *LdapCreateAccountParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *LdapCreateAccountParams) SetAccountdetails(v map[string]string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["accountdetails"] = v
+	return
+}
+
+func (p *LdapCreateAccountParams) SetAccountid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["accountid"] = v
+	return
+}
+
+func (p *LdapCreateAccountParams) SetAccounttype(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["accounttype"] = v
+	return
+}
+
+func (p *LdapCreateAccountParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *LdapCreateAccountParams) SetNetworkdomain(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["networkdomain"] = v
+	return
+}
+
+func (p *LdapCreateAccountParams) SetRoleid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["roleid"] = v
+	return
+}
+
+func (p *LdapCreateAccountParams) SetTimezone(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["timezone"] = v
+	return
+}
+
+func (p *LdapCreateAccountParams) SetUserid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["userid"] = v
+	return
+}
+
+func (p *LdapCreateAccountParams) SetUsername(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["username"] = v
+	return
+}
+
+// You should always use this function to get a new LdapCreateAccountParams instance,
+// as then you are sure you have configured all required params
+func (s *LDAPService) NewLdapCreateAccountParams(username string) *LdapCreateAccountParams {
+	p := &LdapCreateAccountParams{}
+	p.p = make(map[string]interface{})
+	p.p["username"] = username
+	return p
+}
+
+// Creates an account from an LDAP user
+func (s *LDAPService) LdapCreateAccount(p *LdapCreateAccountParams) (*LdapCreateAccountResponse, error) {
+	resp, err := s.cs.newRequest("ldapCreateAccount", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r LdapCreateAccountResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type LdapCreateAccountResponse struct {
+	Accountdetails            map[string]string `json:"accountdetails"`
+	Accounttype               int               `json:"accounttype"`
+	Cpuavailable              string            `json:"cpuavailable"`
+	Cpulimit                  string            `json:"cpulimit"`
+	Cputotal                  int64             `json:"cputotal"`
+	Defaultzoneid             string            `json:"defaultzoneid"`
+	Domain                    string            `json:"domain"`
+	Domainid                  string            `json:"domainid"`
+	Groups                    []string          `json:"groups"`
+	Id                        string            `json:"id"`
+	Ipavailable               string            `json:"ipavailable"`
+	Iplimit                   string            `json:"iplimit"`
+	Iptotal                   int64             `json:"iptotal"`
+	Iscleanuprequired         bool              `json:"iscleanuprequired"`
+	Isdefault                 bool              `json:"isdefault"`
+	Memoryavailable           string            `json:"memoryavailable"`
+	Memorylimit               string            `json:"memorylimit"`
+	Memorytotal               int64             `json:"memorytotal"`
+	Name                      string            `json:"name"`
+	Networkavailable          string            `json:"networkavailable"`
+	Networkdomain             string            `json:"networkdomain"`
+	Networklimit              string            `json:"networklimit"`
+	Networktotal              int64             `json:"networktotal"`
+	Primarystorageavailable   string            `json:"primarystorageavailable"`
+	Primarystoragelimit       string            `json:"primarystoragelimit"`
+	Primarystoragetotal       int64             `json:"primarystoragetotal"`
+	Projectavailable          string            `json:"projectavailable"`
+	Projectlimit              string            `json:"projectlimit"`
+	Projecttotal              int64             `json:"projecttotal"`
+	Receivedbytes             int64             `json:"receivedbytes"`
+	Roleid                    string            `json:"roleid"`
+	Rolename                  string            `json:"rolename"`
+	Roletype                  string            `json:"roletype"`
+	Secondarystorageavailable string            `json:"secondarystorageavailable"`
+	Secondarystoragelimit     string            `json:"secondarystoragelimit"`
+	Secondarystoragetotal     int64             `json:"secondarystoragetotal"`
+	Sentbytes                 int64             `json:"sentbytes"`
+	Snapshotavailable         string            `json:"snapshotavailable"`
+	Snapshotlimit             string            `json:"snapshotlimit"`
+	Snapshottotal             int64             `json:"snapshottotal"`
+	State                     string            `json:"state"`
+	Templateavailable         string            `json:"templateavailable"`
+	Templatelimit             string            `json:"templatelimit"`
+	Templatetotal             int64             `json:"templatetotal"`
+	User                      []struct {
+		Account             string `json:"account"`
+		Accountid           string `json:"accountid"`
+		Accounttype         int    `json:"accounttype"`
+		Apikey              string `json:"apikey"`
+		Created             string `json:"created"`
+		Domain              string `json:"domain"`
+		Domainid            string `json:"domainid"`
+		Email               string `json:"email"`
+		Firstname           string `json:"firstname"`
+		Id                  string `json:"id"`
+		Iscallerchilddomain bool   `json:"iscallerchilddomain"`
+		Isdefault           bool   `json:"isdefault"`
+		Lastname            string `json:"lastname"`
+		Roleid              string `json:"roleid"`
+		Rolename            string `json:"rolename"`
+		Roletype            string `json:"roletype"`
+		Secretkey           string `json:"secretkey"`
+		State               string `json:"state"`
+		Timezone            string `json:"timezone"`
+		Username            string `json:"username"`
+	} `json:"user"`
+	Vmavailable     string `json:"vmavailable"`
+	Vmlimit         string `json:"vmlimit"`
+	Vmrunning       int    `json:"vmrunning"`
+	Vmstopped       int    `json:"vmstopped"`
+	Vmtotal         int64  `json:"vmtotal"`
+	Volumeavailable string `json:"volumeavailable"`
+	Volumelimit     string `json:"volumelimit"`
+	Volumetotal     int64  `json:"volumetotal"`
+	Vpcavailable    string `json:"vpcavailable"`
+	Vpclimit        string `json:"vpclimit"`
+	Vpctotal        int64  `json:"vpctotal"`
+}
+
+type LdapRemoveParams struct {
+	p map[string]interface{}
+}
+
+func (p *LdapRemoveParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	return u
+}
+
+// You should always use this function to get a new LdapRemoveParams instance,
+// as then you are sure you have configured all required params
+func (s *LDAPService) NewLdapRemoveParams() *LdapRemoveParams {
+	p := &LdapRemoveParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// Remove the LDAP context for this site.
+func (s *LDAPService) LdapRemove(p *LdapRemoveParams) (*LdapRemoveResponse, error) {
+	resp, err := s.cs.newRequest("ldapRemove", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r LdapRemoveResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type LdapRemoveResponse struct {
+	Binddn      string `json:"binddn"`
+	Bindpass    string `json:"bindpass"`
+	Hostname    string `json:"hostname"`
+	Port        string `json:"port"`
+	Queryfilter string `json:"queryfilter"`
+	Searchbase  string `json:"searchbase"`
+	Ssl         string `json:"ssl"`
+}
+
+type LinkDomainToLdapParams struct {
+	p map[string]interface{}
+}
+
+func (p *LinkDomainToLdapParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["accounttype"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("accounttype", vv)
+	}
+	if v, found := p.p["admin"]; found {
+		u.Set("admin", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["type"]; found {
+		u.Set("type", v.(string))
+	}
+	return u
+}
+
+func (p *LinkDomainToLdapParams) SetAccounttype(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["accounttype"] = v
+	return
+}
+
+func (p *LinkDomainToLdapParams) SetAdmin(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["admin"] = v
+	return
+}
+
+func (p *LinkDomainToLdapParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *LinkDomainToLdapParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *LinkDomainToLdapParams) SetType(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["type"] = v
+	return
+}
+
+// You should always use this function to get a new LinkDomainToLdapParams instance,
+// as then you are sure you have configured all required params
+func (s *LDAPService) NewLinkDomainToLdapParams(accounttype int, domainid string, name string, lDAPType string) *LinkDomainToLdapParams {
+	p := &LinkDomainToLdapParams{}
+	p.p = make(map[string]interface{})
+	p.p["accounttype"] = accounttype
+	p.p["domainid"] = domainid
+	p.p["name"] = name
+	p.p["type"] = lDAPType
+	return p
+}
+
+// link an existing cloudstack domain to group or OU in ldap
+func (s *LDAPService) LinkDomainToLdap(p *LinkDomainToLdapParams) (*LinkDomainToLdapResponse, error) {
+	resp, err := s.cs.newRequest("linkDomainToLdap", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r LinkDomainToLdapResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type LinkDomainToLdapResponse struct {
+	Accountid   string `json:"accountid"`
+	Accounttype int    `json:"accounttype"`
+	Domainid    int64  `json:"domainid"`
+	Name        string `json:"name"`
+	Type        string `json:"type"`
+}
+
+type ListLdapConfigurationsParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListLdapConfigurationsParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["hostname"]; found {
+		u.Set("hostname", v.(string))
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["port"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("port", vv)
+	}
+	return u
+}
+
+func (p *ListLdapConfigurationsParams) SetHostname(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["hostname"] = v
+	return
+}
+
+func (p *ListLdapConfigurationsParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListLdapConfigurationsParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListLdapConfigurationsParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListLdapConfigurationsParams) SetPort(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["port"] = v
+	return
+}
+
+// You should always use this function to get a new ListLdapConfigurationsParams instance,
+// as then you are sure you have configured all required params
+func (s *LDAPService) NewListLdapConfigurationsParams() *ListLdapConfigurationsParams {
+	p := &ListLdapConfigurationsParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// Lists all LDAP configurations
+func (s *LDAPService) ListLdapConfigurations(p *ListLdapConfigurationsParams) (*ListLdapConfigurationsResponse, error) {
+	resp, err := s.cs.newRequest("listLdapConfigurations", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListLdapConfigurationsResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListLdapConfigurationsResponse struct {
+	Count              int                  `json:"count"`
+	LdapConfigurations []*LdapConfiguration `json:"ldapconfiguration"`
+}
+
+type LdapConfiguration struct {
+	Hostname string `json:"hostname"`
+	Port     int    `json:"port"`
+}
+
+type ListLdapUsersParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListLdapUsersParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["listtype"]; found {
+		u.Set("listtype", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	return u
+}
+
+func (p *ListLdapUsersParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListLdapUsersParams) SetListtype(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["listtype"] = v
+	return
+}
+
+func (p *ListLdapUsersParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListLdapUsersParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+// You should always use this function to get a new ListLdapUsersParams instance,
+// as then you are sure you have configured all required params
+func (s *LDAPService) NewListLdapUsersParams() *ListLdapUsersParams {
+	p := &ListLdapUsersParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// Lists all LDAP Users
+func (s *LDAPService) ListLdapUsers(p *ListLdapUsersParams) (*ListLdapUsersResponse, error) {
+	resp, err := s.cs.newRequest("listLdapUsers", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListLdapUsersResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListLdapUsersResponse struct {
+	Count     int         `json:"count"`
+	LdapUsers []*LdapUser `json:"ldapuser"`
+}
+
+type LdapUser struct {
+	Domain    string `json:"domain"`
+	Email     string `json:"email"`
+	Firstname string `json:"firstname"`
+	Lastname  string `json:"lastname"`
+	Principal string `json:"principal"`
+	Username  string `json:"username"`
+}
+
+type SearchLdapParams struct {
+	p map[string]interface{}
+}
+
+func (p *SearchLdapParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["query"]; found {
+		u.Set("query", v.(string))
+	}
+	return u
+}
+
+func (p *SearchLdapParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *SearchLdapParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *SearchLdapParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *SearchLdapParams) SetQuery(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["query"] = v
+	return
+}
+
+// You should always use this function to get a new SearchLdapParams instance,
+// as then you are sure you have configured all required params
+func (s *LDAPService) NewSearchLdapParams(query string) *SearchLdapParams {
+	p := &SearchLdapParams{}
+	p.p = make(map[string]interface{})
+	p.p["query"] = query
+	return p
+}
+
+// Searches LDAP based on the username attribute
+func (s *LDAPService) SearchLdap(p *SearchLdapParams) (*SearchLdapResponse, error) {
+	resp, err := s.cs.newRequest("searchLdap", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r SearchLdapResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type SearchLdapResponse struct {
+	Domain    string `json:"domain"`
+	Email     string `json:"email"`
+	Firstname string `json:"firstname"`
+	Lastname  string `json:"lastname"`
+	Principal string `json:"principal"`
+	Username  string `json:"username"`
+}
diff --git a/vendor/github.com/xanzy/go-cloudstack/cloudstack/LimitService.go b/vendor/github.com/xanzy/go-cloudstack/cloudstack/LimitService.go
new file mode 100644
index 0000000..79deffe
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/cloudstack/LimitService.go
@@ -0,0 +1,480 @@
+//
+// Copyright 2018, Sander van Harmelen
+//
+// Licensed 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 cloudstack
+
+import (
+	"encoding/json"
+	"net/url"
+	"strconv"
+)
+
+type GetApiLimitParams struct {
+	p map[string]interface{}
+}
+
+func (p *GetApiLimitParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	return u
+}
+
+// You should always use this function to get a new GetApiLimitParams instance,
+// as then you are sure you have configured all required params
+func (s *LimitService) NewGetApiLimitParams() *GetApiLimitParams {
+	p := &GetApiLimitParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// Get API limit count for the caller
+func (s *LimitService) GetApiLimit(p *GetApiLimitParams) (*GetApiLimitResponse, error) {
+	resp, err := s.cs.newRequest("getApiLimit", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r GetApiLimitResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type GetApiLimitResponse struct {
+	Account     string `json:"account"`
+	Accountid   string `json:"accountid"`
+	ApiAllowed  int    `json:"apiAllowed"`
+	ApiIssued   int    `json:"apiIssued"`
+	ExpireAfter int64  `json:"expireAfter"`
+}
+
+type ListResourceLimitsParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListResourceLimitsParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["id"]; found {
+		vv := strconv.FormatInt(v.(int64), 10)
+		u.Set("id", vv)
+	}
+	if v, found := p.p["isrecursive"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("isrecursive", vv)
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["listall"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("listall", vv)
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["projectid"]; found {
+		u.Set("projectid", v.(string))
+	}
+	if v, found := p.p["resourcetype"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("resourcetype", vv)
+	}
+	return u
+}
+
+func (p *ListResourceLimitsParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *ListResourceLimitsParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *ListResourceLimitsParams) SetId(v int64) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ListResourceLimitsParams) SetIsrecursive(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isrecursive"] = v
+	return
+}
+
+func (p *ListResourceLimitsParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListResourceLimitsParams) SetListall(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["listall"] = v
+	return
+}
+
+func (p *ListResourceLimitsParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListResourceLimitsParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListResourceLimitsParams) SetProjectid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectid"] = v
+	return
+}
+
+func (p *ListResourceLimitsParams) SetResourcetype(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["resourcetype"] = v
+	return
+}
+
+// You should always use this function to get a new ListResourceLimitsParams instance,
+// as then you are sure you have configured all required params
+func (s *LimitService) NewListResourceLimitsParams() *ListResourceLimitsParams {
+	p := &ListResourceLimitsParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// Lists resource limits.
+func (s *LimitService) ListResourceLimits(p *ListResourceLimitsParams) (*ListResourceLimitsResponse, error) {
+	resp, err := s.cs.newRequest("listResourceLimits", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListResourceLimitsResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListResourceLimitsResponse struct {
+	Count          int              `json:"count"`
+	ResourceLimits []*ResourceLimit `json:"resourcelimit"`
+}
+
+type ResourceLimit struct {
+	Account      string `json:"account"`
+	Domain       string `json:"domain"`
+	Domainid     string `json:"domainid"`
+	Max          int64  `json:"max"`
+	Project      string `json:"project"`
+	Projectid    string `json:"projectid"`
+	Resourcetype string `json:"resourcetype"`
+}
+
+type ResetApiLimitParams struct {
+	p map[string]interface{}
+}
+
+func (p *ResetApiLimitParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	return u
+}
+
+func (p *ResetApiLimitParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+// You should always use this function to get a new ResetApiLimitParams instance,
+// as then you are sure you have configured all required params
+func (s *LimitService) NewResetApiLimitParams() *ResetApiLimitParams {
+	p := &ResetApiLimitParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// Reset api count
+func (s *LimitService) ResetApiLimit(p *ResetApiLimitParams) (*ResetApiLimitResponse, error) {
+	resp, err := s.cs.newRequest("resetApiLimit", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ResetApiLimitResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ResetApiLimitResponse struct {
+	Account     string `json:"account"`
+	Accountid   string `json:"accountid"`
+	ApiAllowed  int    `json:"apiAllowed"`
+	ApiIssued   int    `json:"apiIssued"`
+	ExpireAfter int64  `json:"expireAfter"`
+}
+
+type UpdateResourceCountParams struct {
+	p map[string]interface{}
+}
+
+func (p *UpdateResourceCountParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["projectid"]; found {
+		u.Set("projectid", v.(string))
+	}
+	if v, found := p.p["resourcetype"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("resourcetype", vv)
+	}
+	return u
+}
+
+func (p *UpdateResourceCountParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *UpdateResourceCountParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *UpdateResourceCountParams) SetProjectid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectid"] = v
+	return
+}
+
+func (p *UpdateResourceCountParams) SetResourcetype(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["resourcetype"] = v
+	return
+}
+
+// You should always use this function to get a new UpdateResourceCountParams instance,
+// as then you are sure you have configured all required params
+func (s *LimitService) NewUpdateResourceCountParams(domainid string) *UpdateResourceCountParams {
+	p := &UpdateResourceCountParams{}
+	p.p = make(map[string]interface{})
+	p.p["domainid"] = domainid
+	return p
+}
+
+// Recalculate and update resource count for an account or domain.
+func (s *LimitService) UpdateResourceCount(p *UpdateResourceCountParams) (*UpdateResourceCountResponse, error) {
+	resp, err := s.cs.newRequest("updateResourceCount", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r UpdateResourceCountResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type UpdateResourceCountResponse struct {
+	Account       string `json:"account"`
+	Domain        string `json:"domain"`
+	Domainid      string `json:"domainid"`
+	Project       string `json:"project"`
+	Projectid     string `json:"projectid"`
+	Resourcecount int64  `json:"resourcecount"`
+	Resourcetype  string `json:"resourcetype"`
+}
+
+type UpdateResourceLimitParams struct {
+	p map[string]interface{}
+}
+
+func (p *UpdateResourceLimitParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["max"]; found {
+		vv := strconv.FormatInt(v.(int64), 10)
+		u.Set("max", vv)
+	}
+	if v, found := p.p["projectid"]; found {
+		u.Set("projectid", v.(string))
+	}
+	if v, found := p.p["resourcetype"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("resourcetype", vv)
+	}
+	return u
+}
+
+func (p *UpdateResourceLimitParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *UpdateResourceLimitParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *UpdateResourceLimitParams) SetMax(v int64) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["max"] = v
+	return
+}
+
+func (p *UpdateResourceLimitParams) SetProjectid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectid"] = v
+	return
+}
+
+func (p *UpdateResourceLimitParams) SetResourcetype(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["resourcetype"] = v
+	return
+}
+
+// You should always use this function to get a new UpdateResourceLimitParams instance,
+// as then you are sure you have configured all required params
+func (s *LimitService) NewUpdateResourceLimitParams(resourcetype int) *UpdateResourceLimitParams {
+	p := &UpdateResourceLimitParams{}
+	p.p = make(map[string]interface{})
+	p.p["resourcetype"] = resourcetype
+	return p
+}
+
+// Updates resource limits for an account or domain.
+func (s *LimitService) UpdateResourceLimit(p *UpdateResourceLimitParams) (*UpdateResourceLimitResponse, error) {
+	resp, err := s.cs.newRequest("updateResourceLimit", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r UpdateResourceLimitResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type UpdateResourceLimitResponse struct {
+	Account      string `json:"account"`
+	Domain       string `json:"domain"`
+	Domainid     string `json:"domainid"`
+	Max          int64  `json:"max"`
+	Project      string `json:"project"`
+	Projectid    string `json:"projectid"`
+	Resourcetype string `json:"resourcetype"`
+}
diff --git a/vendor/github.com/xanzy/go-cloudstack/cloudstack/LoadBalancerService.go b/vendor/github.com/xanzy/go-cloudstack/cloudstack/LoadBalancerService.go
new file mode 100644
index 0000000..6d95967
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/cloudstack/LoadBalancerService.go
@@ -0,0 +1,5179 @@
+//
+// Copyright 2018, Sander van Harmelen
+//
+// Licensed 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 cloudstack
+
+import (
+	"encoding/json"
+	"fmt"
+	"net/url"
+	"strconv"
+	"strings"
+)
+
+type AddF5LoadBalancerParams struct {
+	p map[string]interface{}
+}
+
+func (p *AddF5LoadBalancerParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["networkdevicetype"]; found {
+		u.Set("networkdevicetype", v.(string))
+	}
+	if v, found := p.p["password"]; found {
+		u.Set("password", v.(string))
+	}
+	if v, found := p.p["physicalnetworkid"]; found {
+		u.Set("physicalnetworkid", v.(string))
+	}
+	if v, found := p.p["url"]; found {
+		u.Set("url", v.(string))
+	}
+	if v, found := p.p["username"]; found {
+		u.Set("username", v.(string))
+	}
+	return u
+}
+
+func (p *AddF5LoadBalancerParams) SetNetworkdevicetype(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["networkdevicetype"] = v
+	return
+}
+
+func (p *AddF5LoadBalancerParams) SetPassword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["password"] = v
+	return
+}
+
+func (p *AddF5LoadBalancerParams) SetPhysicalnetworkid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["physicalnetworkid"] = v
+	return
+}
+
+func (p *AddF5LoadBalancerParams) SetUrl(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["url"] = v
+	return
+}
+
+func (p *AddF5LoadBalancerParams) SetUsername(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["username"] = v
+	return
+}
+
+// You should always use this function to get a new AddF5LoadBalancerParams instance,
+// as then you are sure you have configured all required params
+func (s *LoadBalancerService) NewAddF5LoadBalancerParams(networkdevicetype string, password string, physicalnetworkid string, url string, username string) *AddF5LoadBalancerParams {
+	p := &AddF5LoadBalancerParams{}
+	p.p = make(map[string]interface{})
+	p.p["networkdevicetype"] = networkdevicetype
+	p.p["password"] = password
+	p.p["physicalnetworkid"] = physicalnetworkid
+	p.p["url"] = url
+	p.p["username"] = username
+	return p
+}
+
+// Adds a F5 BigIP load balancer device
+func (s *LoadBalancerService) AddF5LoadBalancer(p *AddF5LoadBalancerParams) (*AddF5LoadBalancerResponse, error) {
+	resp, err := s.cs.newRequest("addF5LoadBalancer", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r AddF5LoadBalancerResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type AddF5LoadBalancerResponse struct {
+	JobID             string `json:"jobid"`
+	Ipaddress         string `json:"ipaddress"`
+	Lbdevicecapacity  int64  `json:"lbdevicecapacity"`
+	Lbdevicededicated bool   `json:"lbdevicededicated"`
+	Lbdeviceid        string `json:"lbdeviceid"`
+	Lbdevicename      string `json:"lbdevicename"`
+	Lbdevicestate     string `json:"lbdevicestate"`
+	Physicalnetworkid string `json:"physicalnetworkid"`
+	Privateinterface  string `json:"privateinterface"`
+	Provider          string `json:"provider"`
+	Publicinterface   string `json:"publicinterface"`
+}
+
+type AddNetscalerLoadBalancerParams struct {
+	p map[string]interface{}
+}
+
+func (p *AddNetscalerLoadBalancerParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["gslbprovider"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("gslbprovider", vv)
+	}
+	if v, found := p.p["gslbproviderprivateip"]; found {
+		u.Set("gslbproviderprivateip", v.(string))
+	}
+	if v, found := p.p["gslbproviderpublicip"]; found {
+		u.Set("gslbproviderpublicip", v.(string))
+	}
+	if v, found := p.p["isexclusivegslbprovider"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("isexclusivegslbprovider", vv)
+	}
+	if v, found := p.p["networkdevicetype"]; found {
+		u.Set("networkdevicetype", v.(string))
+	}
+	if v, found := p.p["password"]; found {
+		u.Set("password", v.(string))
+	}
+	if v, found := p.p["physicalnetworkid"]; found {
+		u.Set("physicalnetworkid", v.(string))
+	}
+	if v, found := p.p["url"]; found {
+		u.Set("url", v.(string))
+	}
+	if v, found := p.p["username"]; found {
+		u.Set("username", v.(string))
+	}
+	return u
+}
+
+func (p *AddNetscalerLoadBalancerParams) SetGslbprovider(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["gslbprovider"] = v
+	return
+}
+
+func (p *AddNetscalerLoadBalancerParams) SetGslbproviderprivateip(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["gslbproviderprivateip"] = v
+	return
+}
+
+func (p *AddNetscalerLoadBalancerParams) SetGslbproviderpublicip(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["gslbproviderpublicip"] = v
+	return
+}
+
+func (p *AddNetscalerLoadBalancerParams) SetIsexclusivegslbprovider(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isexclusivegslbprovider"] = v
+	return
+}
+
+func (p *AddNetscalerLoadBalancerParams) SetNetworkdevicetype(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["networkdevicetype"] = v
+	return
+}
+
+func (p *AddNetscalerLoadBalancerParams) SetPassword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["password"] = v
+	return
+}
+
+func (p *AddNetscalerLoadBalancerParams) SetPhysicalnetworkid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["physicalnetworkid"] = v
+	return
+}
+
+func (p *AddNetscalerLoadBalancerParams) SetUrl(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["url"] = v
+	return
+}
+
+func (p *AddNetscalerLoadBalancerParams) SetUsername(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["username"] = v
+	return
+}
+
+// You should always use this function to get a new AddNetscalerLoadBalancerParams instance,
+// as then you are sure you have configured all required params
+func (s *LoadBalancerService) NewAddNetscalerLoadBalancerParams(networkdevicetype string, password string, physicalnetworkid string, url string, username string) *AddNetscalerLoadBalancerParams {
+	p := &AddNetscalerLoadBalancerParams{}
+	p.p = make(map[string]interface{})
+	p.p["networkdevicetype"] = networkdevicetype
+	p.p["password"] = password
+	p.p["physicalnetworkid"] = physicalnetworkid
+	p.p["url"] = url
+	p.p["username"] = username
+	return p
+}
+
+// Adds a netscaler load balancer device
+func (s *LoadBalancerService) AddNetscalerLoadBalancer(p *AddNetscalerLoadBalancerParams) (*AddNetscalerLoadBalancerResponse, error) {
+	resp, err := s.cs.newRequest("addNetscalerLoadBalancer", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r AddNetscalerLoadBalancerResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type AddNetscalerLoadBalancerResponse struct {
+	JobID                   string   `json:"jobid"`
+	Gslbprovider            bool     `json:"gslbprovider"`
+	Gslbproviderprivateip   string   `json:"gslbproviderprivateip"`
+	Gslbproviderpublicip    string   `json:"gslbproviderpublicip"`
+	Ipaddress               string   `json:"ipaddress"`
+	Isexclusivegslbprovider bool     `json:"isexclusivegslbprovider"`
+	Lbdevicecapacity        int64    `json:"lbdevicecapacity"`
+	Lbdevicededicated       bool     `json:"lbdevicededicated"`
+	Lbdeviceid              string   `json:"lbdeviceid"`
+	Lbdevicename            string   `json:"lbdevicename"`
+	Lbdevicestate           string   `json:"lbdevicestate"`
+	Physicalnetworkid       string   `json:"physicalnetworkid"`
+	Podids                  []string `json:"podids"`
+	Privateinterface        string   `json:"privateinterface"`
+	Provider                string   `json:"provider"`
+	Publicinterface         string   `json:"publicinterface"`
+}
+
+type AssignCertToLoadBalancerParams struct {
+	p map[string]interface{}
+}
+
+func (p *AssignCertToLoadBalancerParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["certid"]; found {
+		u.Set("certid", v.(string))
+	}
+	if v, found := p.p["lbruleid"]; found {
+		u.Set("lbruleid", v.(string))
+	}
+	return u
+}
+
+func (p *AssignCertToLoadBalancerParams) SetCertid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["certid"] = v
+	return
+}
+
+func (p *AssignCertToLoadBalancerParams) SetLbruleid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["lbruleid"] = v
+	return
+}
+
+// You should always use this function to get a new AssignCertToLoadBalancerParams instance,
+// as then you are sure you have configured all required params
+func (s *LoadBalancerService) NewAssignCertToLoadBalancerParams(certid string, lbruleid string) *AssignCertToLoadBalancerParams {
+	p := &AssignCertToLoadBalancerParams{}
+	p.p = make(map[string]interface{})
+	p.p["certid"] = certid
+	p.p["lbruleid"] = lbruleid
+	return p
+}
+
+// Assigns a certificate to a load balancer rule
+func (s *LoadBalancerService) AssignCertToLoadBalancer(p *AssignCertToLoadBalancerParams) (*AssignCertToLoadBalancerResponse, error) {
+	resp, err := s.cs.newRequest("assignCertToLoadBalancer", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r AssignCertToLoadBalancerResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type AssignCertToLoadBalancerResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
+
+type AssignToGlobalLoadBalancerRuleParams struct {
+	p map[string]interface{}
+}
+
+func (p *AssignToGlobalLoadBalancerRuleParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["gslblbruleweightsmap"]; found {
+		i := 0
+		for k, vv := range v.(map[string]string) {
+			u.Set(fmt.Sprintf("gslblbruleweightsmap[%d].key", i), k)
+			u.Set(fmt.Sprintf("gslblbruleweightsmap[%d].value", i), vv)
+			i++
+		}
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["loadbalancerrulelist"]; found {
+		vv := strings.Join(v.([]string), ",")
+		u.Set("loadbalancerrulelist", vv)
+	}
+	return u
+}
+
+func (p *AssignToGlobalLoadBalancerRuleParams) SetGslblbruleweightsmap(v map[string]string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["gslblbruleweightsmap"] = v
+	return
+}
+
+func (p *AssignToGlobalLoadBalancerRuleParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *AssignToGlobalLoadBalancerRuleParams) SetLoadbalancerrulelist(v []string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["loadbalancerrulelist"] = v
+	return
+}
+
+// You should always use this function to get a new AssignToGlobalLoadBalancerRuleParams instance,
+// as then you are sure you have configured all required params
+func (s *LoadBalancerService) NewAssignToGlobalLoadBalancerRuleParams(id string, loadbalancerrulelist []string) *AssignToGlobalLoadBalancerRuleParams {
+	p := &AssignToGlobalLoadBalancerRuleParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	p.p["loadbalancerrulelist"] = loadbalancerrulelist
+	return p
+}
+
+// Assign load balancer rule or list of load balancer rules to a global load balancer rules.
+func (s *LoadBalancerService) AssignToGlobalLoadBalancerRule(p *AssignToGlobalLoadBalancerRuleParams) (*AssignToGlobalLoadBalancerRuleResponse, error) {
+	resp, err := s.cs.newRequest("assignToGlobalLoadBalancerRule", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r AssignToGlobalLoadBalancerRuleResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type AssignToGlobalLoadBalancerRuleResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
+
+type AssignToLoadBalancerRuleParams struct {
+	p map[string]interface{}
+}
+
+func (p *AssignToLoadBalancerRuleParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["virtualmachineids"]; found {
+		vv := strings.Join(v.([]string), ",")
+		u.Set("virtualmachineids", vv)
+	}
+	if v, found := p.p["vmidipmap"]; found {
+		i := 0
+		for k, vv := range v.(map[string]string) {
+			u.Set(fmt.Sprintf("vmidipmap[%d].key", i), k)
+			u.Set(fmt.Sprintf("vmidipmap[%d].value", i), vv)
+			i++
+		}
+	}
+	return u
+}
+
+func (p *AssignToLoadBalancerRuleParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *AssignToLoadBalancerRuleParams) SetVirtualmachineids(v []string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["virtualmachineids"] = v
+	return
+}
+
+func (p *AssignToLoadBalancerRuleParams) SetVmidipmap(v map[string]string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["vmidipmap"] = v
+	return
+}
+
+// You should always use this function to get a new AssignToLoadBalancerRuleParams instance,
+// as then you are sure you have configured all required params
+func (s *LoadBalancerService) NewAssignToLoadBalancerRuleParams(id string) *AssignToLoadBalancerRuleParams {
+	p := &AssignToLoadBalancerRuleParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Assigns virtual machine or a list of virtual machines to a load balancer rule.
+func (s *LoadBalancerService) AssignToLoadBalancerRule(p *AssignToLoadBalancerRuleParams) (*AssignToLoadBalancerRuleResponse, error) {
+	resp, err := s.cs.newRequest("assignToLoadBalancerRule", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r AssignToLoadBalancerRuleResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type AssignToLoadBalancerRuleResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
+
+type ConfigureF5LoadBalancerParams struct {
+	p map[string]interface{}
+}
+
+func (p *ConfigureF5LoadBalancerParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["lbdevicecapacity"]; found {
+		vv := strconv.FormatInt(v.(int64), 10)
+		u.Set("lbdevicecapacity", vv)
+	}
+	if v, found := p.p["lbdeviceid"]; found {
+		u.Set("lbdeviceid", v.(string))
+	}
+	return u
+}
+
+func (p *ConfigureF5LoadBalancerParams) SetLbdevicecapacity(v int64) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["lbdevicecapacity"] = v
+	return
+}
+
+func (p *ConfigureF5LoadBalancerParams) SetLbdeviceid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["lbdeviceid"] = v
+	return
+}
+
+// You should always use this function to get a new ConfigureF5LoadBalancerParams instance,
+// as then you are sure you have configured all required params
+func (s *LoadBalancerService) NewConfigureF5LoadBalancerParams(lbdeviceid string) *ConfigureF5LoadBalancerParams {
+	p := &ConfigureF5LoadBalancerParams{}
+	p.p = make(map[string]interface{})
+	p.p["lbdeviceid"] = lbdeviceid
+	return p
+}
+
+// configures a F5 load balancer device
+func (s *LoadBalancerService) ConfigureF5LoadBalancer(p *ConfigureF5LoadBalancerParams) (*F5LoadBalancerResponse, error) {
+	resp, err := s.cs.newRequest("configureF5LoadBalancer", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r F5LoadBalancerResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type F5LoadBalancerResponse struct {
+	JobID             string `json:"jobid"`
+	Ipaddress         string `json:"ipaddress"`
+	Lbdevicecapacity  int64  `json:"lbdevicecapacity"`
+	Lbdevicededicated bool   `json:"lbdevicededicated"`
+	Lbdeviceid        string `json:"lbdeviceid"`
+	Lbdevicename      string `json:"lbdevicename"`
+	Lbdevicestate     string `json:"lbdevicestate"`
+	Physicalnetworkid string `json:"physicalnetworkid"`
+	Privateinterface  string `json:"privateinterface"`
+	Provider          string `json:"provider"`
+	Publicinterface   string `json:"publicinterface"`
+}
+
+type ConfigureNetscalerLoadBalancerParams struct {
+	p map[string]interface{}
+}
+
+func (p *ConfigureNetscalerLoadBalancerParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["inline"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("inline", vv)
+	}
+	if v, found := p.p["lbdevicecapacity"]; found {
+		vv := strconv.FormatInt(v.(int64), 10)
+		u.Set("lbdevicecapacity", vv)
+	}
+	if v, found := p.p["lbdevicededicated"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("lbdevicededicated", vv)
+	}
+	if v, found := p.p["lbdeviceid"]; found {
+		u.Set("lbdeviceid", v.(string))
+	}
+	if v, found := p.p["podids"]; found {
+		vv := strings.Join(v.([]string), ",")
+		u.Set("podids", vv)
+	}
+	return u
+}
+
+func (p *ConfigureNetscalerLoadBalancerParams) SetInline(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["inline"] = v
+	return
+}
+
+func (p *ConfigureNetscalerLoadBalancerParams) SetLbdevicecapacity(v int64) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["lbdevicecapacity"] = v
+	return
+}
+
+func (p *ConfigureNetscalerLoadBalancerParams) SetLbdevicededicated(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["lbdevicededicated"] = v
+	return
+}
+
+func (p *ConfigureNetscalerLoadBalancerParams) SetLbdeviceid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["lbdeviceid"] = v
+	return
+}
+
+func (p *ConfigureNetscalerLoadBalancerParams) SetPodids(v []string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["podids"] = v
+	return
+}
+
+// You should always use this function to get a new ConfigureNetscalerLoadBalancerParams instance,
+// as then you are sure you have configured all required params
+func (s *LoadBalancerService) NewConfigureNetscalerLoadBalancerParams(lbdeviceid string) *ConfigureNetscalerLoadBalancerParams {
+	p := &ConfigureNetscalerLoadBalancerParams{}
+	p.p = make(map[string]interface{})
+	p.p["lbdeviceid"] = lbdeviceid
+	return p
+}
+
+// configures a netscaler load balancer device
+func (s *LoadBalancerService) ConfigureNetscalerLoadBalancer(p *ConfigureNetscalerLoadBalancerParams) (*NetscalerLoadBalancerResponse, error) {
+	resp, err := s.cs.newRequest("configureNetscalerLoadBalancer", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r NetscalerLoadBalancerResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type NetscalerLoadBalancerResponse struct {
+	JobID                   string   `json:"jobid"`
+	Gslbprovider            bool     `json:"gslbprovider"`
+	Gslbproviderprivateip   string   `json:"gslbproviderprivateip"`
+	Gslbproviderpublicip    string   `json:"gslbproviderpublicip"`
+	Ipaddress               string   `json:"ipaddress"`
+	Isexclusivegslbprovider bool     `json:"isexclusivegslbprovider"`
+	Lbdevicecapacity        int64    `json:"lbdevicecapacity"`
+	Lbdevicededicated       bool     `json:"lbdevicededicated"`
+	Lbdeviceid              string   `json:"lbdeviceid"`
+	Lbdevicename            string   `json:"lbdevicename"`
+	Lbdevicestate           string   `json:"lbdevicestate"`
+	Physicalnetworkid       string   `json:"physicalnetworkid"`
+	Podids                  []string `json:"podids"`
+	Privateinterface        string   `json:"privateinterface"`
+	Provider                string   `json:"provider"`
+	Publicinterface         string   `json:"publicinterface"`
+}
+
+type CreateGlobalLoadBalancerRuleParams struct {
+	p map[string]interface{}
+}
+
+func (p *CreateGlobalLoadBalancerRuleParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["description"]; found {
+		u.Set("description", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["gslbdomainname"]; found {
+		u.Set("gslbdomainname", v.(string))
+	}
+	if v, found := p.p["gslblbmethod"]; found {
+		u.Set("gslblbmethod", v.(string))
+	}
+	if v, found := p.p["gslbservicetype"]; found {
+		u.Set("gslbservicetype", v.(string))
+	}
+	if v, found := p.p["gslbstickysessionmethodname"]; found {
+		u.Set("gslbstickysessionmethodname", v.(string))
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["regionid"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("regionid", vv)
+	}
+	return u
+}
+
+func (p *CreateGlobalLoadBalancerRuleParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *CreateGlobalLoadBalancerRuleParams) SetDescription(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["description"] = v
+	return
+}
+
+func (p *CreateGlobalLoadBalancerRuleParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *CreateGlobalLoadBalancerRuleParams) SetGslbdomainname(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["gslbdomainname"] = v
+	return
+}
+
+func (p *CreateGlobalLoadBalancerRuleParams) SetGslblbmethod(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["gslblbmethod"] = v
+	return
+}
+
+func (p *CreateGlobalLoadBalancerRuleParams) SetGslbservicetype(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["gslbservicetype"] = v
+	return
+}
+
+func (p *CreateGlobalLoadBalancerRuleParams) SetGslbstickysessionmethodname(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["gslbstickysessionmethodname"] = v
+	return
+}
+
+func (p *CreateGlobalLoadBalancerRuleParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *CreateGlobalLoadBalancerRuleParams) SetRegionid(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["regionid"] = v
+	return
+}
+
+// You should always use this function to get a new CreateGlobalLoadBalancerRuleParams instance,
+// as then you are sure you have configured all required params
+func (s *LoadBalancerService) NewCreateGlobalLoadBalancerRuleParams(gslbdomainname string, gslbservicetype string, name string, regionid int) *CreateGlobalLoadBalancerRuleParams {
+	p := &CreateGlobalLoadBalancerRuleParams{}
+	p.p = make(map[string]interface{})
+	p.p["gslbdomainname"] = gslbdomainname
+	p.p["gslbservicetype"] = gslbservicetype
+	p.p["name"] = name
+	p.p["regionid"] = regionid
+	return p
+}
+
+// Creates a global load balancer rule
+func (s *LoadBalancerService) CreateGlobalLoadBalancerRule(p *CreateGlobalLoadBalancerRuleParams) (*CreateGlobalLoadBalancerRuleResponse, error) {
+	resp, err := s.cs.newRequest("createGlobalLoadBalancerRule", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r CreateGlobalLoadBalancerRuleResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type CreateGlobalLoadBalancerRuleResponse struct {
+	JobID                       string `json:"jobid"`
+	Account                     string `json:"account"`
+	Description                 string `json:"description"`
+	Domain                      string `json:"domain"`
+	Domainid                    string `json:"domainid"`
+	Gslbdomainname              string `json:"gslbdomainname"`
+	Gslblbmethod                string `json:"gslblbmethod"`
+	Gslbservicetype             string `json:"gslbservicetype"`
+	Gslbstickysessionmethodname string `json:"gslbstickysessionmethodname"`
+	Id                          string `json:"id"`
+	Loadbalancerrule            []struct {
+		Account     string `json:"account"`
+		Algorithm   string `json:"algorithm"`
+		Cidrlist    string `json:"cidrlist"`
+		Description string `json:"description"`
+		Domain      string `json:"domain"`
+		Domainid    string `json:"domainid"`
+		Fordisplay  bool   `json:"fordisplay"`
+		Id          string `json:"id"`
+		Name        string `json:"name"`
+		Networkid   string `json:"networkid"`
+		Privateport string `json:"privateport"`
+		Project     string `json:"project"`
+		Projectid   string `json:"projectid"`
+		Protocol    string `json:"protocol"`
+		Publicip    string `json:"publicip"`
+		Publicipid  string `json:"publicipid"`
+		Publicport  string `json:"publicport"`
+		State       string `json:"state"`
+		Tags        []struct {
+			Account      string `json:"account"`
+			Customer     string `json:"customer"`
+			Domain       string `json:"domain"`
+			Domainid     string `json:"domainid"`
+			Key          string `json:"key"`
+			Project      string `json:"project"`
+			Projectid    string `json:"projectid"`
+			Resourceid   string `json:"resourceid"`
+			Resourcetype string `json:"resourcetype"`
+			Value        string `json:"value"`
+		} `json:"tags"`
+		Zoneid string `json:"zoneid"`
+	} `json:"loadbalancerrule"`
+	Name      string `json:"name"`
+	Project   string `json:"project"`
+	Projectid string `json:"projectid"`
+	Regionid  int    `json:"regionid"`
+}
+
+type CreateLBHealthCheckPolicyParams struct {
+	p map[string]interface{}
+}
+
+func (p *CreateLBHealthCheckPolicyParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["description"]; found {
+		u.Set("description", v.(string))
+	}
+	if v, found := p.p["fordisplay"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("fordisplay", vv)
+	}
+	if v, found := p.p["healthythreshold"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("healthythreshold", vv)
+	}
+	if v, found := p.p["intervaltime"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("intervaltime", vv)
+	}
+	if v, found := p.p["lbruleid"]; found {
+		u.Set("lbruleid", v.(string))
+	}
+	if v, found := p.p["pingpath"]; found {
+		u.Set("pingpath", v.(string))
+	}
+	if v, found := p.p["responsetimeout"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("responsetimeout", vv)
+	}
+	if v, found := p.p["unhealthythreshold"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("unhealthythreshold", vv)
+	}
+	return u
+}
+
+func (p *CreateLBHealthCheckPolicyParams) SetDescription(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["description"] = v
+	return
+}
+
+func (p *CreateLBHealthCheckPolicyParams) SetFordisplay(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["fordisplay"] = v
+	return
+}
+
+func (p *CreateLBHealthCheckPolicyParams) SetHealthythreshold(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["healthythreshold"] = v
+	return
+}
+
+func (p *CreateLBHealthCheckPolicyParams) SetIntervaltime(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["intervaltime"] = v
+	return
+}
+
+func (p *CreateLBHealthCheckPolicyParams) SetLbruleid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["lbruleid"] = v
+	return
+}
+
+func (p *CreateLBHealthCheckPolicyParams) SetPingpath(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pingpath"] = v
+	return
+}
+
+func (p *CreateLBHealthCheckPolicyParams) SetResponsetimeout(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["responsetimeout"] = v
+	return
+}
+
+func (p *CreateLBHealthCheckPolicyParams) SetUnhealthythreshold(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["unhealthythreshold"] = v
+	return
+}
+
+// You should always use this function to get a new CreateLBHealthCheckPolicyParams instance,
+// as then you are sure you have configured all required params
+func (s *LoadBalancerService) NewCreateLBHealthCheckPolicyParams(lbruleid string) *CreateLBHealthCheckPolicyParams {
+	p := &CreateLBHealthCheckPolicyParams{}
+	p.p = make(map[string]interface{})
+	p.p["lbruleid"] = lbruleid
+	return p
+}
+
+// Creates a load balancer health check policy
+func (s *LoadBalancerService) CreateLBHealthCheckPolicy(p *CreateLBHealthCheckPolicyParams) (*CreateLBHealthCheckPolicyResponse, error) {
+	resp, err := s.cs.newRequest("createLBHealthCheckPolicy", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r CreateLBHealthCheckPolicyResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type CreateLBHealthCheckPolicyResponse struct {
+	JobID             string `json:"jobid"`
+	Account           string `json:"account"`
+	Domain            string `json:"domain"`
+	Domainid          string `json:"domainid"`
+	Healthcheckpolicy []struct {
+		Description             string `json:"description"`
+		Fordisplay              bool   `json:"fordisplay"`
+		Healthcheckinterval     int    `json:"healthcheckinterval"`
+		Healthcheckthresshold   int    `json:"healthcheckthresshold"`
+		Id                      string `json:"id"`
+		Pingpath                string `json:"pingpath"`
+		Responsetime            int    `json:"responsetime"`
+		State                   string `json:"state"`
+		Unhealthcheckthresshold int    `json:"unhealthcheckthresshold"`
+	} `json:"healthcheckpolicy"`
+	Lbruleid string `json:"lbruleid"`
+	Zoneid   string `json:"zoneid"`
+}
+
+type CreateLBStickinessPolicyParams struct {
+	p map[string]interface{}
+}
+
+func (p *CreateLBStickinessPolicyParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["description"]; found {
+		u.Set("description", v.(string))
+	}
+	if v, found := p.p["fordisplay"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("fordisplay", vv)
+	}
+	if v, found := p.p["lbruleid"]; found {
+		u.Set("lbruleid", v.(string))
+	}
+	if v, found := p.p["methodname"]; found {
+		u.Set("methodname", v.(string))
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["param"]; found {
+		i := 0
+		for k, vv := range v.(map[string]string) {
+			u.Set(fmt.Sprintf("param[%d].key", i), k)
+			u.Set(fmt.Sprintf("param[%d].value", i), vv)
+			i++
+		}
+	}
+	return u
+}
+
+func (p *CreateLBStickinessPolicyParams) SetDescription(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["description"] = v
+	return
+}
+
+func (p *CreateLBStickinessPolicyParams) SetFordisplay(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["fordisplay"] = v
+	return
+}
+
+func (p *CreateLBStickinessPolicyParams) SetLbruleid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["lbruleid"] = v
+	return
+}
+
+func (p *CreateLBStickinessPolicyParams) SetMethodname(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["methodname"] = v
+	return
+}
+
+func (p *CreateLBStickinessPolicyParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *CreateLBStickinessPolicyParams) SetParam(v map[string]string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["param"] = v
+	return
+}
+
+// You should always use this function to get a new CreateLBStickinessPolicyParams instance,
+// as then you are sure you have configured all required params
+func (s *LoadBalancerService) NewCreateLBStickinessPolicyParams(lbruleid string, methodname string, name string) *CreateLBStickinessPolicyParams {
+	p := &CreateLBStickinessPolicyParams{}
+	p.p = make(map[string]interface{})
+	p.p["lbruleid"] = lbruleid
+	p.p["methodname"] = methodname
+	p.p["name"] = name
+	return p
+}
+
+// Creates a load balancer stickiness policy
+func (s *LoadBalancerService) CreateLBStickinessPolicy(p *CreateLBStickinessPolicyParams) (*CreateLBStickinessPolicyResponse, error) {
+	resp, err := s.cs.newRequest("createLBStickinessPolicy", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r CreateLBStickinessPolicyResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type CreateLBStickinessPolicyResponse struct {
+	JobID            string `json:"jobid"`
+	Account          string `json:"account"`
+	Description      string `json:"description"`
+	Domain           string `json:"domain"`
+	Domainid         string `json:"domainid"`
+	Lbruleid         string `json:"lbruleid"`
+	Name             string `json:"name"`
+	State            string `json:"state"`
+	Stickinesspolicy []struct {
+		Description string            `json:"description"`
+		Fordisplay  bool              `json:"fordisplay"`
+		Id          string            `json:"id"`
+		Methodname  string            `json:"methodname"`
+		Name        string            `json:"name"`
+		Params      map[string]string `json:"params"`
+		State       string            `json:"state"`
+	} `json:"stickinesspolicy"`
+	Zoneid string `json:"zoneid"`
+}
+
+type CreateLoadBalancerParams struct {
+	p map[string]interface{}
+}
+
+func (p *CreateLoadBalancerParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["algorithm"]; found {
+		u.Set("algorithm", v.(string))
+	}
+	if v, found := p.p["description"]; found {
+		u.Set("description", v.(string))
+	}
+	if v, found := p.p["fordisplay"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("fordisplay", vv)
+	}
+	if v, found := p.p["instanceport"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("instanceport", vv)
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["networkid"]; found {
+		u.Set("networkid", v.(string))
+	}
+	if v, found := p.p["scheme"]; found {
+		u.Set("scheme", v.(string))
+	}
+	if v, found := p.p["sourceipaddress"]; found {
+		u.Set("sourceipaddress", v.(string))
+	}
+	if v, found := p.p["sourceipaddressnetworkid"]; found {
+		u.Set("sourceipaddressnetworkid", v.(string))
+	}
+	if v, found := p.p["sourceport"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("sourceport", vv)
+	}
+	return u
+}
+
+func (p *CreateLoadBalancerParams) SetAlgorithm(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["algorithm"] = v
+	return
+}
+
+func (p *CreateLoadBalancerParams) SetDescription(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["description"] = v
+	return
+}
+
+func (p *CreateLoadBalancerParams) SetFordisplay(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["fordisplay"] = v
+	return
+}
+
+func (p *CreateLoadBalancerParams) SetInstanceport(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["instanceport"] = v
+	return
+}
+
+func (p *CreateLoadBalancerParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *CreateLoadBalancerParams) SetNetworkid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["networkid"] = v
+	return
+}
+
+func (p *CreateLoadBalancerParams) SetScheme(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["scheme"] = v
+	return
+}
+
+func (p *CreateLoadBalancerParams) SetSourceipaddress(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["sourceipaddress"] = v
+	return
+}
+
+func (p *CreateLoadBalancerParams) SetSourceipaddressnetworkid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["sourceipaddressnetworkid"] = v
+	return
+}
+
+func (p *CreateLoadBalancerParams) SetSourceport(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["sourceport"] = v
+	return
+}
+
+// You should always use this function to get a new CreateLoadBalancerParams instance,
+// as then you are sure you have configured all required params
+func (s *LoadBalancerService) NewCreateLoadBalancerParams(algorithm string, instanceport int, name string, networkid string, scheme string, sourceipaddressnetworkid string, sourceport int) *CreateLoadBalancerParams {
+	p := &CreateLoadBalancerParams{}
+	p.p = make(map[string]interface{})
+	p.p["algorithm"] = algorithm
+	p.p["instanceport"] = instanceport
+	p.p["name"] = name
+	p.p["networkid"] = networkid
+	p.p["scheme"] = scheme
+	p.p["sourceipaddressnetworkid"] = sourceipaddressnetworkid
+	p.p["sourceport"] = sourceport
+	return p
+}
+
+// Creates a load balancer
+func (s *LoadBalancerService) CreateLoadBalancer(p *CreateLoadBalancerParams) (*CreateLoadBalancerResponse, error) {
+	resp, err := s.cs.newRequest("createLoadBalancer", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r CreateLoadBalancerResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type CreateLoadBalancerResponse struct {
+	JobID                string `json:"jobid"`
+	Account              string `json:"account"`
+	Algorithm            string `json:"algorithm"`
+	Description          string `json:"description"`
+	Domain               string `json:"domain"`
+	Domainid             string `json:"domainid"`
+	Fordisplay           bool   `json:"fordisplay"`
+	Id                   string `json:"id"`
+	Loadbalancerinstance []struct {
+		Id        string `json:"id"`
+		Ipaddress string `json:"ipaddress"`
+		Name      string `json:"name"`
+		State     string `json:"state"`
+	} `json:"loadbalancerinstance"`
+	Loadbalancerrule []struct {
+		Instanceport int    `json:"instanceport"`
+		Sourceport   int    `json:"sourceport"`
+		State        string `json:"state"`
+	} `json:"loadbalancerrule"`
+	Name                     string `json:"name"`
+	Networkid                string `json:"networkid"`
+	Project                  string `json:"project"`
+	Projectid                string `json:"projectid"`
+	Sourceipaddress          string `json:"sourceipaddress"`
+	Sourceipaddressnetworkid string `json:"sourceipaddressnetworkid"`
+	Tags                     []struct {
+		Account      string `json:"account"`
+		Customer     string `json:"customer"`
+		Domain       string `json:"domain"`
+		Domainid     string `json:"domainid"`
+		Key          string `json:"key"`
+		Project      string `json:"project"`
+		Projectid    string `json:"projectid"`
+		Resourceid   string `json:"resourceid"`
+		Resourcetype string `json:"resourcetype"`
+		Value        string `json:"value"`
+	} `json:"tags"`
+}
+
+type CreateLoadBalancerRuleParams struct {
+	p map[string]interface{}
+}
+
+func (p *CreateLoadBalancerRuleParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["algorithm"]; found {
+		u.Set("algorithm", v.(string))
+	}
+	if v, found := p.p["cidrlist"]; found {
+		vv := strings.Join(v.([]string), ",")
+		u.Set("cidrlist", vv)
+	}
+	if v, found := p.p["description"]; found {
+		u.Set("description", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["fordisplay"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("fordisplay", vv)
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["networkid"]; found {
+		u.Set("networkid", v.(string))
+	}
+	if v, found := p.p["openfirewall"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("openfirewall", vv)
+	}
+	if v, found := p.p["privateport"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("privateport", vv)
+	}
+	if v, found := p.p["protocol"]; found {
+		u.Set("protocol", v.(string))
+	}
+	if v, found := p.p["publicipid"]; found {
+		u.Set("publicipid", v.(string))
+	}
+	if v, found := p.p["publicport"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("publicport", vv)
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *CreateLoadBalancerRuleParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *CreateLoadBalancerRuleParams) SetAlgorithm(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["algorithm"] = v
+	return
+}
+
+func (p *CreateLoadBalancerRuleParams) SetCidrlist(v []string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["cidrlist"] = v
+	return
+}
+
+func (p *CreateLoadBalancerRuleParams) SetDescription(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["description"] = v
+	return
+}
+
+func (p *CreateLoadBalancerRuleParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *CreateLoadBalancerRuleParams) SetFordisplay(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["fordisplay"] = v
+	return
+}
+
+func (p *CreateLoadBalancerRuleParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *CreateLoadBalancerRuleParams) SetNetworkid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["networkid"] = v
+	return
+}
+
+func (p *CreateLoadBalancerRuleParams) SetOpenfirewall(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["openfirewall"] = v
+	return
+}
+
+func (p *CreateLoadBalancerRuleParams) SetPrivateport(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["privateport"] = v
+	return
+}
+
+func (p *CreateLoadBalancerRuleParams) SetProtocol(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["protocol"] = v
+	return
+}
+
+func (p *CreateLoadBalancerRuleParams) SetPublicipid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["publicipid"] = v
+	return
+}
+
+func (p *CreateLoadBalancerRuleParams) SetPublicport(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["publicport"] = v
+	return
+}
+
+func (p *CreateLoadBalancerRuleParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new CreateLoadBalancerRuleParams instance,
+// as then you are sure you have configured all required params
+func (s *LoadBalancerService) NewCreateLoadBalancerRuleParams(algorithm string, name string, privateport int, publicport int) *CreateLoadBalancerRuleParams {
+	p := &CreateLoadBalancerRuleParams{}
+	p.p = make(map[string]interface{})
+	p.p["algorithm"] = algorithm
+	p.p["name"] = name
+	p.p["privateport"] = privateport
+	p.p["publicport"] = publicport
+	return p
+}
+
+// Creates a load balancer rule
+func (s *LoadBalancerService) CreateLoadBalancerRule(p *CreateLoadBalancerRuleParams) (*CreateLoadBalancerRuleResponse, error) {
+	resp, err := s.cs.newRequest("createLoadBalancerRule", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r CreateLoadBalancerRuleResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type CreateLoadBalancerRuleResponse struct {
+	JobID       string `json:"jobid"`
+	Account     string `json:"account"`
+	Algorithm   string `json:"algorithm"`
+	Cidrlist    string `json:"cidrlist"`
+	Description string `json:"description"`
+	Domain      string `json:"domain"`
+	Domainid    string `json:"domainid"`
+	Fordisplay  bool   `json:"fordisplay"`
+	Id          string `json:"id"`
+	Name        string `json:"name"`
+	Networkid   string `json:"networkid"`
+	Privateport string `json:"privateport"`
+	Project     string `json:"project"`
+	Projectid   string `json:"projectid"`
+	Protocol    string `json:"protocol"`
+	Publicip    string `json:"publicip"`
+	Publicipid  string `json:"publicipid"`
+	Publicport  string `json:"publicport"`
+	State       string `json:"state"`
+	Tags        []struct {
+		Account      string `json:"account"`
+		Customer     string `json:"customer"`
+		Domain       string `json:"domain"`
+		Domainid     string `json:"domainid"`
+		Key          string `json:"key"`
+		Project      string `json:"project"`
+		Projectid    string `json:"projectid"`
+		Resourceid   string `json:"resourceid"`
+		Resourcetype string `json:"resourcetype"`
+		Value        string `json:"value"`
+	} `json:"tags"`
+	Zoneid string `json:"zoneid"`
+}
+
+type DeleteF5LoadBalancerParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeleteF5LoadBalancerParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["lbdeviceid"]; found {
+		u.Set("lbdeviceid", v.(string))
+	}
+	return u
+}
+
+func (p *DeleteF5LoadBalancerParams) SetLbdeviceid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["lbdeviceid"] = v
+	return
+}
+
+// You should always use this function to get a new DeleteF5LoadBalancerParams instance,
+// as then you are sure you have configured all required params
+func (s *LoadBalancerService) NewDeleteF5LoadBalancerParams(lbdeviceid string) *DeleteF5LoadBalancerParams {
+	p := &DeleteF5LoadBalancerParams{}
+	p.p = make(map[string]interface{})
+	p.p["lbdeviceid"] = lbdeviceid
+	return p
+}
+
+//  delete a F5 load balancer device
+func (s *LoadBalancerService) DeleteF5LoadBalancer(p *DeleteF5LoadBalancerParams) (*DeleteF5LoadBalancerResponse, error) {
+	resp, err := s.cs.newRequest("deleteF5LoadBalancer", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeleteF5LoadBalancerResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type DeleteF5LoadBalancerResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
+
+type DeleteGlobalLoadBalancerRuleParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeleteGlobalLoadBalancerRuleParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *DeleteGlobalLoadBalancerRuleParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new DeleteGlobalLoadBalancerRuleParams instance,
+// as then you are sure you have configured all required params
+func (s *LoadBalancerService) NewDeleteGlobalLoadBalancerRuleParams(id string) *DeleteGlobalLoadBalancerRuleParams {
+	p := &DeleteGlobalLoadBalancerRuleParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Deletes a global load balancer rule.
+func (s *LoadBalancerService) DeleteGlobalLoadBalancerRule(p *DeleteGlobalLoadBalancerRuleParams) (*DeleteGlobalLoadBalancerRuleResponse, error) {
+	resp, err := s.cs.newRequest("deleteGlobalLoadBalancerRule", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeleteGlobalLoadBalancerRuleResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type DeleteGlobalLoadBalancerRuleResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
+
+type DeleteLBHealthCheckPolicyParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeleteLBHealthCheckPolicyParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *DeleteLBHealthCheckPolicyParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new DeleteLBHealthCheckPolicyParams instance,
+// as then you are sure you have configured all required params
+func (s *LoadBalancerService) NewDeleteLBHealthCheckPolicyParams(id string) *DeleteLBHealthCheckPolicyParams {
+	p := &DeleteLBHealthCheckPolicyParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Deletes a load balancer health check policy.
+func (s *LoadBalancerService) DeleteLBHealthCheckPolicy(p *DeleteLBHealthCheckPolicyParams) (*DeleteLBHealthCheckPolicyResponse, error) {
+	resp, err := s.cs.newRequest("deleteLBHealthCheckPolicy", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeleteLBHealthCheckPolicyResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type DeleteLBHealthCheckPolicyResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
+
+type DeleteLBStickinessPolicyParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeleteLBStickinessPolicyParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *DeleteLBStickinessPolicyParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new DeleteLBStickinessPolicyParams instance,
+// as then you are sure you have configured all required params
+func (s *LoadBalancerService) NewDeleteLBStickinessPolicyParams(id string) *DeleteLBStickinessPolicyParams {
+	p := &DeleteLBStickinessPolicyParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Deletes a load balancer stickiness policy.
+func (s *LoadBalancerService) DeleteLBStickinessPolicy(p *DeleteLBStickinessPolicyParams) (*DeleteLBStickinessPolicyResponse, error) {
+	resp, err := s.cs.newRequest("deleteLBStickinessPolicy", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeleteLBStickinessPolicyResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type DeleteLBStickinessPolicyResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
+
+type DeleteLoadBalancerParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeleteLoadBalancerParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *DeleteLoadBalancerParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new DeleteLoadBalancerParams instance,
+// as then you are sure you have configured all required params
+func (s *LoadBalancerService) NewDeleteLoadBalancerParams(id string) *DeleteLoadBalancerParams {
+	p := &DeleteLoadBalancerParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Deletes a load balancer
+func (s *LoadBalancerService) DeleteLoadBalancer(p *DeleteLoadBalancerParams) (*DeleteLoadBalancerResponse, error) {
+	resp, err := s.cs.newRequest("deleteLoadBalancer", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeleteLoadBalancerResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type DeleteLoadBalancerResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
+
+type DeleteLoadBalancerRuleParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeleteLoadBalancerRuleParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *DeleteLoadBalancerRuleParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new DeleteLoadBalancerRuleParams instance,
+// as then you are sure you have configured all required params
+func (s *LoadBalancerService) NewDeleteLoadBalancerRuleParams(id string) *DeleteLoadBalancerRuleParams {
+	p := &DeleteLoadBalancerRuleParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Deletes a load balancer rule.
+func (s *LoadBalancerService) DeleteLoadBalancerRule(p *DeleteLoadBalancerRuleParams) (*DeleteLoadBalancerRuleResponse, error) {
+	resp, err := s.cs.newRequest("deleteLoadBalancerRule", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeleteLoadBalancerRuleResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type DeleteLoadBalancerRuleResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
+
+type DeleteNetscalerLoadBalancerParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeleteNetscalerLoadBalancerParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["lbdeviceid"]; found {
+		u.Set("lbdeviceid", v.(string))
+	}
+	return u
+}
+
+func (p *DeleteNetscalerLoadBalancerParams) SetLbdeviceid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["lbdeviceid"] = v
+	return
+}
+
+// You should always use this function to get a new DeleteNetscalerLoadBalancerParams instance,
+// as then you are sure you have configured all required params
+func (s *LoadBalancerService) NewDeleteNetscalerLoadBalancerParams(lbdeviceid string) *DeleteNetscalerLoadBalancerParams {
+	p := &DeleteNetscalerLoadBalancerParams{}
+	p.p = make(map[string]interface{})
+	p.p["lbdeviceid"] = lbdeviceid
+	return p
+}
+
+//  delete a netscaler load balancer device
+func (s *LoadBalancerService) DeleteNetscalerLoadBalancer(p *DeleteNetscalerLoadBalancerParams) (*DeleteNetscalerLoadBalancerResponse, error) {
+	resp, err := s.cs.newRequest("deleteNetscalerLoadBalancer", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeleteNetscalerLoadBalancerResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type DeleteNetscalerLoadBalancerResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
+
+type DeleteSslCertParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeleteSslCertParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *DeleteSslCertParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new DeleteSslCertParams instance,
+// as then you are sure you have configured all required params
+func (s *LoadBalancerService) NewDeleteSslCertParams(id string) *DeleteSslCertParams {
+	p := &DeleteSslCertParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Delete a certificate to CloudStack
+func (s *LoadBalancerService) DeleteSslCert(p *DeleteSslCertParams) (*DeleteSslCertResponse, error) {
+	resp, err := s.cs.newRequest("deleteSslCert", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeleteSslCertResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type DeleteSslCertResponse struct {
+	Displaytext string `json:"displaytext"`
+	Success     string `json:"success"`
+}
+
+type ListF5LoadBalancersParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListF5LoadBalancersParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["lbdeviceid"]; found {
+		u.Set("lbdeviceid", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["physicalnetworkid"]; found {
+		u.Set("physicalnetworkid", v.(string))
+	}
+	return u
+}
+
+func (p *ListF5LoadBalancersParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListF5LoadBalancersParams) SetLbdeviceid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["lbdeviceid"] = v
+	return
+}
+
+func (p *ListF5LoadBalancersParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListF5LoadBalancersParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListF5LoadBalancersParams) SetPhysicalnetworkid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["physicalnetworkid"] = v
+	return
+}
+
+// You should always use this function to get a new ListF5LoadBalancersParams instance,
+// as then you are sure you have configured all required params
+func (s *LoadBalancerService) NewListF5LoadBalancersParams() *ListF5LoadBalancersParams {
+	p := &ListF5LoadBalancersParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// lists F5 load balancer devices
+func (s *LoadBalancerService) ListF5LoadBalancers(p *ListF5LoadBalancersParams) (*ListF5LoadBalancersResponse, error) {
+	resp, err := s.cs.newRequest("listF5LoadBalancers", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListF5LoadBalancersResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListF5LoadBalancersResponse struct {
+	Count           int               `json:"count"`
+	F5LoadBalancers []*F5LoadBalancer `json:"f5loadbalancer"`
+}
+
+type F5LoadBalancer struct {
+	Ipaddress         string `json:"ipaddress"`
+	Lbdevicecapacity  int64  `json:"lbdevicecapacity"`
+	Lbdevicededicated bool   `json:"lbdevicededicated"`
+	Lbdeviceid        string `json:"lbdeviceid"`
+	Lbdevicename      string `json:"lbdevicename"`
+	Lbdevicestate     string `json:"lbdevicestate"`
+	Physicalnetworkid string `json:"physicalnetworkid"`
+	Privateinterface  string `json:"privateinterface"`
+	Provider          string `json:"provider"`
+	Publicinterface   string `json:"publicinterface"`
+}
+
+type ListGlobalLoadBalancerRulesParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListGlobalLoadBalancerRulesParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["isrecursive"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("isrecursive", vv)
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["listall"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("listall", vv)
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["projectid"]; found {
+		u.Set("projectid", v.(string))
+	}
+	if v, found := p.p["regionid"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("regionid", vv)
+	}
+	if v, found := p.p["tags"]; found {
+		i := 0
+		for k, vv := range v.(map[string]string) {
+			u.Set(fmt.Sprintf("tags[%d].key", i), k)
+			u.Set(fmt.Sprintf("tags[%d].value", i), vv)
+			i++
+		}
+	}
+	return u
+}
+
+func (p *ListGlobalLoadBalancerRulesParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *ListGlobalLoadBalancerRulesParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *ListGlobalLoadBalancerRulesParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ListGlobalLoadBalancerRulesParams) SetIsrecursive(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isrecursive"] = v
+	return
+}
+
+func (p *ListGlobalLoadBalancerRulesParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListGlobalLoadBalancerRulesParams) SetListall(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["listall"] = v
+	return
+}
+
+func (p *ListGlobalLoadBalancerRulesParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListGlobalLoadBalancerRulesParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListGlobalLoadBalancerRulesParams) SetProjectid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectid"] = v
+	return
+}
+
+func (p *ListGlobalLoadBalancerRulesParams) SetRegionid(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["regionid"] = v
+	return
+}
+
+func (p *ListGlobalLoadBalancerRulesParams) SetTags(v map[string]string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["tags"] = v
+	return
+}
+
+// You should always use this function to get a new ListGlobalLoadBalancerRulesParams instance,
+// as then you are sure you have configured all required params
+func (s *LoadBalancerService) NewListGlobalLoadBalancerRulesParams() *ListGlobalLoadBalancerRulesParams {
+	p := &ListGlobalLoadBalancerRulesParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *LoadBalancerService) GetGlobalLoadBalancerRuleID(keyword string, opts ...OptionFunc) (string, int, error) {
+	p := &ListGlobalLoadBalancerRulesParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["keyword"] = keyword
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return "", -1, err
+		}
+	}
+
+	l, err := s.ListGlobalLoadBalancerRules(p)
+	if err != nil {
+		return "", -1, err
+	}
+
+	if l.Count == 0 {
+		return "", l.Count, fmt.Errorf("No match found for %s: %+v", keyword, l)
+	}
+
+	if l.Count == 1 {
+		return l.GlobalLoadBalancerRules[0].Id, l.Count, nil
+	}
+
+	if l.Count > 1 {
+		for _, v := range l.GlobalLoadBalancerRules {
+			if v.Name == keyword {
+				return v.Id, l.Count, nil
+			}
+		}
+	}
+	return "", l.Count, fmt.Errorf("Could not find an exact match for %s: %+v", keyword, l)
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *LoadBalancerService) GetGlobalLoadBalancerRuleByName(name string, opts ...OptionFunc) (*GlobalLoadBalancerRule, int, error) {
+	id, count, err := s.GetGlobalLoadBalancerRuleID(name, opts...)
+	if err != nil {
+		return nil, count, err
+	}
+
+	r, count, err := s.GetGlobalLoadBalancerRuleByID(id, opts...)
+	if err != nil {
+		return nil, count, err
+	}
+	return r, count, nil
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *LoadBalancerService) GetGlobalLoadBalancerRuleByID(id string, opts ...OptionFunc) (*GlobalLoadBalancerRule, int, error) {
+	p := &ListGlobalLoadBalancerRulesParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["id"] = id
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return nil, -1, err
+		}
+	}
+
+	l, err := s.ListGlobalLoadBalancerRules(p)
+	if err != nil {
+		if strings.Contains(err.Error(), fmt.Sprintf(
+			"Invalid parameter id value=%s due to incorrect long value format, "+
+				"or entity does not exist", id)) {
+			return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
+		}
+		return nil, -1, err
+	}
+
+	if l.Count == 0 {
+		return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
+	}
+
+	if l.Count == 1 {
+		return l.GlobalLoadBalancerRules[0], l.Count, nil
+	}
+	return nil, l.Count, fmt.Errorf("There is more then one result for GlobalLoadBalancerRule UUID: %s!", id)
+}
+
+// Lists load balancer rules.
+func (s *LoadBalancerService) ListGlobalLoadBalancerRules(p *ListGlobalLoadBalancerRulesParams) (*ListGlobalLoadBalancerRulesResponse, error) {
+	resp, err := s.cs.newRequest("listGlobalLoadBalancerRules", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListGlobalLoadBalancerRulesResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListGlobalLoadBalancerRulesResponse struct {
+	Count                   int                       `json:"count"`
+	GlobalLoadBalancerRules []*GlobalLoadBalancerRule `json:"globalloadbalancerrule"`
+}
+
+type GlobalLoadBalancerRule struct {
+	Account                     string `json:"account"`
+	Description                 string `json:"description"`
+	Domain                      string `json:"domain"`
+	Domainid                    string `json:"domainid"`
+	Gslbdomainname              string `json:"gslbdomainname"`
+	Gslblbmethod                string `json:"gslblbmethod"`
+	Gslbservicetype             string `json:"gslbservicetype"`
+	Gslbstickysessionmethodname string `json:"gslbstickysessionmethodname"`
+	Id                          string `json:"id"`
+	Loadbalancerrule            []struct {
+		Account     string `json:"account"`
+		Algorithm   string `json:"algorithm"`
+		Cidrlist    string `json:"cidrlist"`
+		Description string `json:"description"`
+		Domain      string `json:"domain"`
+		Domainid    string `json:"domainid"`
+		Fordisplay  bool   `json:"fordisplay"`
+		Id          string `json:"id"`
+		Name        string `json:"name"`
+		Networkid   string `json:"networkid"`
+		Privateport string `json:"privateport"`
+		Project     string `json:"project"`
+		Projectid   string `json:"projectid"`
+		Protocol    string `json:"protocol"`
+		Publicip    string `json:"publicip"`
+		Publicipid  string `json:"publicipid"`
+		Publicport  string `json:"publicport"`
+		State       string `json:"state"`
+		Tags        []struct {
+			Account      string `json:"account"`
+			Customer     string `json:"customer"`
+			Domain       string `json:"domain"`
+			Domainid     string `json:"domainid"`
+			Key          string `json:"key"`
+			Project      string `json:"project"`
+			Projectid    string `json:"projectid"`
+			Resourceid   string `json:"resourceid"`
+			Resourcetype string `json:"resourcetype"`
+			Value        string `json:"value"`
+		} `json:"tags"`
+		Zoneid string `json:"zoneid"`
+	} `json:"loadbalancerrule"`
+	Name      string `json:"name"`
+	Project   string `json:"project"`
+	Projectid string `json:"projectid"`
+	Regionid  int    `json:"regionid"`
+}
+
+type ListLBHealthCheckPoliciesParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListLBHealthCheckPoliciesParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["fordisplay"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("fordisplay", vv)
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["lbruleid"]; found {
+		u.Set("lbruleid", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	return u
+}
+
+func (p *ListLBHealthCheckPoliciesParams) SetFordisplay(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["fordisplay"] = v
+	return
+}
+
+func (p *ListLBHealthCheckPoliciesParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ListLBHealthCheckPoliciesParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListLBHealthCheckPoliciesParams) SetLbruleid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["lbruleid"] = v
+	return
+}
+
+func (p *ListLBHealthCheckPoliciesParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListLBHealthCheckPoliciesParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+// You should always use this function to get a new ListLBHealthCheckPoliciesParams instance,
+// as then you are sure you have configured all required params
+func (s *LoadBalancerService) NewListLBHealthCheckPoliciesParams() *ListLBHealthCheckPoliciesParams {
+	p := &ListLBHealthCheckPoliciesParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *LoadBalancerService) GetLBHealthCheckPolicyByID(id string, opts ...OptionFunc) (*LBHealthCheckPolicy, int, error) {
+	p := &ListLBHealthCheckPoliciesParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["id"] = id
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return nil, -1, err
+		}
+	}
+
+	l, err := s.ListLBHealthCheckPolicies(p)
+	if err != nil {
+		if strings.Contains(err.Error(), fmt.Sprintf(
+			"Invalid parameter id value=%s due to incorrect long value format, "+
+				"or entity does not exist", id)) {
+			return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
+		}
+		return nil, -1, err
+	}
+
+	if l.Count == 0 {
+		return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
+	}
+
+	if l.Count == 1 {
+		return l.LBHealthCheckPolicies[0], l.Count, nil
+	}
+	return nil, l.Count, fmt.Errorf("There is more then one result for LBHealthCheckPolicy UUID: %s!", id)
+}
+
+// Lists load balancer health check policies.
+func (s *LoadBalancerService) ListLBHealthCheckPolicies(p *ListLBHealthCheckPoliciesParams) (*ListLBHealthCheckPoliciesResponse, error) {
+	resp, err := s.cs.newRequest("listLBHealthCheckPolicies", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListLBHealthCheckPoliciesResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListLBHealthCheckPoliciesResponse struct {
+	Count                 int                    `json:"count"`
+	LBHealthCheckPolicies []*LBHealthCheckPolicy `json:"lbhealthcheckpolicy"`
+}
+
+type LBHealthCheckPolicy struct {
+	Account           string `json:"account"`
+	Domain            string `json:"domain"`
+	Domainid          string `json:"domainid"`
+	Healthcheckpolicy []struct {
+		Description             string `json:"description"`
+		Fordisplay              bool   `json:"fordisplay"`
+		Healthcheckinterval     int    `json:"healthcheckinterval"`
+		Healthcheckthresshold   int    `json:"healthcheckthresshold"`
+		Id                      string `json:"id"`
+		Pingpath                string `json:"pingpath"`
+		Responsetime            int    `json:"responsetime"`
+		State                   string `json:"state"`
+		Unhealthcheckthresshold int    `json:"unhealthcheckthresshold"`
+	} `json:"healthcheckpolicy"`
+	Lbruleid string `json:"lbruleid"`
+	Zoneid   string `json:"zoneid"`
+}
+
+type ListLBStickinessPoliciesParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListLBStickinessPoliciesParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["fordisplay"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("fordisplay", vv)
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["lbruleid"]; found {
+		u.Set("lbruleid", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	return u
+}
+
+func (p *ListLBStickinessPoliciesParams) SetFordisplay(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["fordisplay"] = v
+	return
+}
+
+func (p *ListLBStickinessPoliciesParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ListLBStickinessPoliciesParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListLBStickinessPoliciesParams) SetLbruleid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["lbruleid"] = v
+	return
+}
+
+func (p *ListLBStickinessPoliciesParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListLBStickinessPoliciesParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+// You should always use this function to get a new ListLBStickinessPoliciesParams instance,
+// as then you are sure you have configured all required params
+func (s *LoadBalancerService) NewListLBStickinessPoliciesParams() *ListLBStickinessPoliciesParams {
+	p := &ListLBStickinessPoliciesParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *LoadBalancerService) GetLBStickinessPolicyByID(id string, opts ...OptionFunc) (*LBStickinessPolicy, int, error) {
+	p := &ListLBStickinessPoliciesParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["id"] = id
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return nil, -1, err
+		}
+	}
+
+	l, err := s.ListLBStickinessPolicies(p)
+	if err != nil {
+		if strings.Contains(err.Error(), fmt.Sprintf(
+			"Invalid parameter id value=%s due to incorrect long value format, "+
+				"or entity does not exist", id)) {
+			return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
+		}
+		return nil, -1, err
+	}
+
+	if l.Count == 0 {
+		return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
+	}
+
+	if l.Count == 1 {
+		return l.LBStickinessPolicies[0], l.Count, nil
+	}
+	return nil, l.Count, fmt.Errorf("There is more then one result for LBStickinessPolicy UUID: %s!", id)
+}
+
+// Lists load balancer stickiness policies.
+func (s *LoadBalancerService) ListLBStickinessPolicies(p *ListLBStickinessPoliciesParams) (*ListLBStickinessPoliciesResponse, error) {
+	resp, err := s.cs.newRequest("listLBStickinessPolicies", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListLBStickinessPoliciesResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListLBStickinessPoliciesResponse struct {
+	Count                int                   `json:"count"`
+	LBStickinessPolicies []*LBStickinessPolicy `json:"lbstickinesspolicy"`
+}
+
+type LBStickinessPolicy struct {
+	Account          string `json:"account"`
+	Description      string `json:"description"`
+	Domain           string `json:"domain"`
+	Domainid         string `json:"domainid"`
+	Lbruleid         string `json:"lbruleid"`
+	Name             string `json:"name"`
+	State            string `json:"state"`
+	Stickinesspolicy []struct {
+		Description string            `json:"description"`
+		Fordisplay  bool              `json:"fordisplay"`
+		Id          string            `json:"id"`
+		Methodname  string            `json:"methodname"`
+		Name        string            `json:"name"`
+		Params      map[string]string `json:"params"`
+		State       string            `json:"state"`
+	} `json:"stickinesspolicy"`
+	Zoneid string `json:"zoneid"`
+}
+
+type ListLoadBalancerRuleInstancesParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListLoadBalancerRuleInstancesParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["applied"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("applied", vv)
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["lbvmips"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("lbvmips", vv)
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	return u
+}
+
+func (p *ListLoadBalancerRuleInstancesParams) SetApplied(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["applied"] = v
+	return
+}
+
+func (p *ListLoadBalancerRuleInstancesParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ListLoadBalancerRuleInstancesParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListLoadBalancerRuleInstancesParams) SetLbvmips(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["lbvmips"] = v
+	return
+}
+
+func (p *ListLoadBalancerRuleInstancesParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListLoadBalancerRuleInstancesParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+// You should always use this function to get a new ListLoadBalancerRuleInstancesParams instance,
+// as then you are sure you have configured all required params
+func (s *LoadBalancerService) NewListLoadBalancerRuleInstancesParams(id string) *ListLoadBalancerRuleInstancesParams {
+	p := &ListLoadBalancerRuleInstancesParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *LoadBalancerService) GetLoadBalancerRuleInstanceByID(id string, opts ...OptionFunc) (*VirtualMachine, int, error) {
+	p := &ListLoadBalancerRuleInstancesParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["id"] = id
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return nil, -1, err
+		}
+	}
+
+	l, err := s.ListLoadBalancerRuleInstances(p)
+	if err != nil {
+		if strings.Contains(err.Error(), fmt.Sprintf(
+			"Invalid parameter id value=%s due to incorrect long value format, "+
+				"or entity does not exist", id)) {
+			return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
+		}
+		return nil, -1, err
+	}
+
+	if l.Count == 0 {
+		return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
+	}
+
+	if l.Count == 1 {
+		return l.LoadBalancerRuleInstances[0], l.Count, nil
+	}
+	return nil, l.Count, fmt.Errorf("There is more then one result for LoadBalancerRuleInstance UUID: %s!", id)
+}
+
+// List all virtual machine instances that are assigned to a load balancer rule.
+func (s *LoadBalancerService) ListLoadBalancerRuleInstances(p *ListLoadBalancerRuleInstancesParams) (*ListLoadBalancerRuleInstancesResponse, error) {
+	resp, err := s.cs.newRequest("listLoadBalancerRuleInstances", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListLoadBalancerRuleInstancesResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListLoadBalancerRuleInstancesResponse struct {
+	Count                     int                         `json:"count"`
+	LBRuleVMIDIPs             []*LoadBalancerRuleInstance `json:"lbrulevmidip"`
+	LoadBalancerRuleInstances []*VirtualMachine           `json:"loadbalancerruleinstance"`
+}
+
+type LoadBalancerRuleInstance struct {
+	Lbvmipaddresses          []string        `json:"lbvmipaddresses"`
+	Loadbalancerruleinstance *VirtualMachine `json:"loadbalancerruleinstance"`
+}
+
+type ListLoadBalancerRulesParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListLoadBalancerRulesParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["fordisplay"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("fordisplay", vv)
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["isrecursive"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("isrecursive", vv)
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["listall"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("listall", vv)
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["networkid"]; found {
+		u.Set("networkid", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["projectid"]; found {
+		u.Set("projectid", v.(string))
+	}
+	if v, found := p.p["publicipid"]; found {
+		u.Set("publicipid", v.(string))
+	}
+	if v, found := p.p["tags"]; found {
+		i := 0
+		for k, vv := range v.(map[string]string) {
+			u.Set(fmt.Sprintf("tags[%d].key", i), k)
+			u.Set(fmt.Sprintf("tags[%d].value", i), vv)
+			i++
+		}
+	}
+	if v, found := p.p["virtualmachineid"]; found {
+		u.Set("virtualmachineid", v.(string))
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *ListLoadBalancerRulesParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *ListLoadBalancerRulesParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *ListLoadBalancerRulesParams) SetFordisplay(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["fordisplay"] = v
+	return
+}
+
+func (p *ListLoadBalancerRulesParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ListLoadBalancerRulesParams) SetIsrecursive(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isrecursive"] = v
+	return
+}
+
+func (p *ListLoadBalancerRulesParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListLoadBalancerRulesParams) SetListall(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["listall"] = v
+	return
+}
+
+func (p *ListLoadBalancerRulesParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *ListLoadBalancerRulesParams) SetNetworkid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["networkid"] = v
+	return
+}
+
+func (p *ListLoadBalancerRulesParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListLoadBalancerRulesParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListLoadBalancerRulesParams) SetProjectid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectid"] = v
+	return
+}
+
+func (p *ListLoadBalancerRulesParams) SetPublicipid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["publicipid"] = v
+	return
+}
+
+func (p *ListLoadBalancerRulesParams) SetTags(v map[string]string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["tags"] = v
+	return
+}
+
+func (p *ListLoadBalancerRulesParams) SetVirtualmachineid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["virtualmachineid"] = v
+	return
+}
+
+func (p *ListLoadBalancerRulesParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new ListLoadBalancerRulesParams instance,
+// as then you are sure you have configured all required params
+func (s *LoadBalancerService) NewListLoadBalancerRulesParams() *ListLoadBalancerRulesParams {
+	p := &ListLoadBalancerRulesParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *LoadBalancerService) GetLoadBalancerRuleID(name string, opts ...OptionFunc) (string, int, error) {
+	p := &ListLoadBalancerRulesParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["name"] = name
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return "", -1, err
+		}
+	}
+
+	l, err := s.ListLoadBalancerRules(p)
+	if err != nil {
+		return "", -1, err
+	}
+
+	if l.Count == 0 {
+		return "", l.Count, fmt.Errorf("No match found for %s: %+v", name, l)
+	}
+
+	if l.Count == 1 {
+		return l.LoadBalancerRules[0].Id, l.Count, nil
+	}
+
+	if l.Count > 1 {
+		for _, v := range l.LoadBalancerRules {
+			if v.Name == name {
+				return v.Id, l.Count, nil
+			}
+		}
+	}
+	return "", l.Count, fmt.Errorf("Could not find an exact match for %s: %+v", name, l)
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *LoadBalancerService) GetLoadBalancerRuleByName(name string, opts ...OptionFunc) (*LoadBalancerRule, int, error) {
+	id, count, err := s.GetLoadBalancerRuleID(name, opts...)
+	if err != nil {
+		return nil, count, err
+	}
+
+	r, count, err := s.GetLoadBalancerRuleByID(id, opts...)
+	if err != nil {
+		return nil, count, err
+	}
+	return r, count, nil
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *LoadBalancerService) GetLoadBalancerRuleByID(id string, opts ...OptionFunc) (*LoadBalancerRule, int, error) {
+	p := &ListLoadBalancerRulesParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["id"] = id
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return nil, -1, err
+		}
+	}
+
+	l, err := s.ListLoadBalancerRules(p)
+	if err != nil {
+		if strings.Contains(err.Error(), fmt.Sprintf(
+			"Invalid parameter id value=%s due to incorrect long value format, "+
+				"or entity does not exist", id)) {
+			return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
+		}
+		return nil, -1, err
+	}
+
+	if l.Count == 0 {
+		return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
+	}
+
+	if l.Count == 1 {
+		return l.LoadBalancerRules[0], l.Count, nil
+	}
+	return nil, l.Count, fmt.Errorf("There is more then one result for LoadBalancerRule UUID: %s!", id)
+}
+
+// Lists load balancer rules.
+func (s *LoadBalancerService) ListLoadBalancerRules(p *ListLoadBalancerRulesParams) (*ListLoadBalancerRulesResponse, error) {
+	resp, err := s.cs.newRequest("listLoadBalancerRules", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListLoadBalancerRulesResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListLoadBalancerRulesResponse struct {
+	Count             int                 `json:"count"`
+	LoadBalancerRules []*LoadBalancerRule `json:"loadbalancerrule"`
+}
+
+type LoadBalancerRule struct {
+	Account     string `json:"account"`
+	Algorithm   string `json:"algorithm"`
+	Cidrlist    string `json:"cidrlist"`
+	Description string `json:"description"`
+	Domain      string `json:"domain"`
+	Domainid    string `json:"domainid"`
+	Fordisplay  bool   `json:"fordisplay"`
+	Id          string `json:"id"`
+	Name        string `json:"name"`
+	Networkid   string `json:"networkid"`
+	Privateport string `json:"privateport"`
+	Project     string `json:"project"`
+	Projectid   string `json:"projectid"`
+	Protocol    string `json:"protocol"`
+	Publicip    string `json:"publicip"`
+	Publicipid  string `json:"publicipid"`
+	Publicport  string `json:"publicport"`
+	State       string `json:"state"`
+	Tags        []struct {
+		Account      string `json:"account"`
+		Customer     string `json:"customer"`
+		Domain       string `json:"domain"`
+		Domainid     string `json:"domainid"`
+		Key          string `json:"key"`
+		Project      string `json:"project"`
+		Projectid    string `json:"projectid"`
+		Resourceid   string `json:"resourceid"`
+		Resourcetype string `json:"resourcetype"`
+		Value        string `json:"value"`
+	} `json:"tags"`
+	Zoneid string `json:"zoneid"`
+}
+
+type ListLoadBalancersParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListLoadBalancersParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["fordisplay"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("fordisplay", vv)
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["isrecursive"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("isrecursive", vv)
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["listall"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("listall", vv)
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["networkid"]; found {
+		u.Set("networkid", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["projectid"]; found {
+		u.Set("projectid", v.(string))
+	}
+	if v, found := p.p["scheme"]; found {
+		u.Set("scheme", v.(string))
+	}
+	if v, found := p.p["sourceipaddress"]; found {
+		u.Set("sourceipaddress", v.(string))
+	}
+	if v, found := p.p["sourceipaddressnetworkid"]; found {
+		u.Set("sourceipaddressnetworkid", v.(string))
+	}
+	if v, found := p.p["tags"]; found {
+		i := 0
+		for k, vv := range v.(map[string]string) {
+			u.Set(fmt.Sprintf("tags[%d].key", i), k)
+			u.Set(fmt.Sprintf("tags[%d].value", i), vv)
+			i++
+		}
+	}
+	return u
+}
+
+func (p *ListLoadBalancersParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *ListLoadBalancersParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *ListLoadBalancersParams) SetFordisplay(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["fordisplay"] = v
+	return
+}
+
+func (p *ListLoadBalancersParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ListLoadBalancersParams) SetIsrecursive(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isrecursive"] = v
+	return
+}
+
+func (p *ListLoadBalancersParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListLoadBalancersParams) SetListall(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["listall"] = v
+	return
+}
+
+func (p *ListLoadBalancersParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *ListLoadBalancersParams) SetNetworkid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["networkid"] = v
+	return
+}
+
+func (p *ListLoadBalancersParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListLoadBalancersParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListLoadBalancersParams) SetProjectid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectid"] = v
+	return
+}
+
+func (p *ListLoadBalancersParams) SetScheme(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["scheme"] = v
+	return
+}
+
+func (p *ListLoadBalancersParams) SetSourceipaddress(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["sourceipaddress"] = v
+	return
+}
+
+func (p *ListLoadBalancersParams) SetSourceipaddressnetworkid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["sourceipaddressnetworkid"] = v
+	return
+}
+
+func (p *ListLoadBalancersParams) SetTags(v map[string]string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["tags"] = v
+	return
+}
+
+// You should always use this function to get a new ListLoadBalancersParams instance,
+// as then you are sure you have configured all required params
+func (s *LoadBalancerService) NewListLoadBalancersParams() *ListLoadBalancersParams {
+	p := &ListLoadBalancersParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *LoadBalancerService) GetLoadBalancerID(name string, opts ...OptionFunc) (string, int, error) {
+	p := &ListLoadBalancersParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["name"] = name
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return "", -1, err
+		}
+	}
+
+	l, err := s.ListLoadBalancers(p)
+	if err != nil {
+		return "", -1, err
+	}
+
+	if l.Count == 0 {
+		return "", l.Count, fmt.Errorf("No match found for %s: %+v", name, l)
+	}
+
+	if l.Count == 1 {
+		return l.LoadBalancers[0].Id, l.Count, nil
+	}
+
+	if l.Count > 1 {
+		for _, v := range l.LoadBalancers {
+			if v.Name == name {
+				return v.Id, l.Count, nil
+			}
+		}
+	}
+	return "", l.Count, fmt.Errorf("Could not find an exact match for %s: %+v", name, l)
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *LoadBalancerService) GetLoadBalancerByName(name string, opts ...OptionFunc) (*LoadBalancer, int, error) {
+	id, count, err := s.GetLoadBalancerID(name, opts...)
+	if err != nil {
+		return nil, count, err
+	}
+
+	r, count, err := s.GetLoadBalancerByID(id, opts...)
+	if err != nil {
+		return nil, count, err
+	}
+	return r, count, nil
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *LoadBalancerService) GetLoadBalancerByID(id string, opts ...OptionFunc) (*LoadBalancer, int, error) {
+	p := &ListLoadBalancersParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["id"] = id
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return nil, -1, err
+		}
+	}
+
+	l, err := s.ListLoadBalancers(p)
+	if err != nil {
+		if strings.Contains(err.Error(), fmt.Sprintf(
+			"Invalid parameter id value=%s due to incorrect long value format, "+
+				"or entity does not exist", id)) {
+			return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
+		}
+		return nil, -1, err
+	}
+
+	if l.Count == 0 {
+		return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
+	}
+
+	if l.Count == 1 {
+		return l.LoadBalancers[0], l.Count, nil
+	}
+	return nil, l.Count, fmt.Errorf("There is more then one result for LoadBalancer UUID: %s!", id)
+}
+
+// Lists load balancers
+func (s *LoadBalancerService) ListLoadBalancers(p *ListLoadBalancersParams) (*ListLoadBalancersResponse, error) {
+	resp, err := s.cs.newRequest("listLoadBalancers", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListLoadBalancersResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListLoadBalancersResponse struct {
+	Count         int             `json:"count"`
+	LoadBalancers []*LoadBalancer `json:"loadbalancer"`
+}
+
+type LoadBalancer struct {
+	Account              string `json:"account"`
+	Algorithm            string `json:"algorithm"`
+	Description          string `json:"description"`
+	Domain               string `json:"domain"`
+	Domainid             string `json:"domainid"`
+	Fordisplay           bool   `json:"fordisplay"`
+	Id                   string `json:"id"`
+	Loadbalancerinstance []struct {
+		Id        string `json:"id"`
+		Ipaddress string `json:"ipaddress"`
+		Name      string `json:"name"`
+		State     string `json:"state"`
+	} `json:"loadbalancerinstance"`
+	Loadbalancerrule []struct {
+		Instanceport int    `json:"instanceport"`
+		Sourceport   int    `json:"sourceport"`
+		State        string `json:"state"`
+	} `json:"loadbalancerrule"`
+	Name                     string `json:"name"`
+	Networkid                string `json:"networkid"`
+	Project                  string `json:"project"`
+	Projectid                string `json:"projectid"`
+	Sourceipaddress          string `json:"sourceipaddress"`
+	Sourceipaddressnetworkid string `json:"sourceipaddressnetworkid"`
+	Tags                     []struct {
+		Account      string `json:"account"`
+		Customer     string `json:"customer"`
+		Domain       string `json:"domain"`
+		Domainid     string `json:"domainid"`
+		Key          string `json:"key"`
+		Project      string `json:"project"`
+		Projectid    string `json:"projectid"`
+		Resourceid   string `json:"resourceid"`
+		Resourcetype string `json:"resourcetype"`
+		Value        string `json:"value"`
+	} `json:"tags"`
+}
+
+type ListNetscalerLoadBalancersParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListNetscalerLoadBalancersParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["lbdeviceid"]; found {
+		u.Set("lbdeviceid", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["physicalnetworkid"]; found {
+		u.Set("physicalnetworkid", v.(string))
+	}
+	return u
+}
+
+func (p *ListNetscalerLoadBalancersParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListNetscalerLoadBalancersParams) SetLbdeviceid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["lbdeviceid"] = v
+	return
+}
+
+func (p *ListNetscalerLoadBalancersParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListNetscalerLoadBalancersParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListNetscalerLoadBalancersParams) SetPhysicalnetworkid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["physicalnetworkid"] = v
+	return
+}
+
+// You should always use this function to get a new ListNetscalerLoadBalancersParams instance,
+// as then you are sure you have configured all required params
+func (s *LoadBalancerService) NewListNetscalerLoadBalancersParams() *ListNetscalerLoadBalancersParams {
+	p := &ListNetscalerLoadBalancersParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// lists netscaler load balancer devices
+func (s *LoadBalancerService) ListNetscalerLoadBalancers(p *ListNetscalerLoadBalancersParams) (*ListNetscalerLoadBalancersResponse, error) {
+	resp, err := s.cs.newRequest("listNetscalerLoadBalancers", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListNetscalerLoadBalancersResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListNetscalerLoadBalancersResponse struct {
+	Count                  int                      `json:"count"`
+	NetscalerLoadBalancers []*NetscalerLoadBalancer `json:"netscalerloadbalancer"`
+}
+
+type NetscalerLoadBalancer struct {
+	Gslbprovider            bool     `json:"gslbprovider"`
+	Gslbproviderprivateip   string   `json:"gslbproviderprivateip"`
+	Gslbproviderpublicip    string   `json:"gslbproviderpublicip"`
+	Ipaddress               string   `json:"ipaddress"`
+	Isexclusivegslbprovider bool     `json:"isexclusivegslbprovider"`
+	Lbdevicecapacity        int64    `json:"lbdevicecapacity"`
+	Lbdevicededicated       bool     `json:"lbdevicededicated"`
+	Lbdeviceid              string   `json:"lbdeviceid"`
+	Lbdevicename            string   `json:"lbdevicename"`
+	Lbdevicestate           string   `json:"lbdevicestate"`
+	Physicalnetworkid       string   `json:"physicalnetworkid"`
+	Podids                  []string `json:"podids"`
+	Privateinterface        string   `json:"privateinterface"`
+	Provider                string   `json:"provider"`
+	Publicinterface         string   `json:"publicinterface"`
+}
+
+type ListSslCertsParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListSslCertsParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["accountid"]; found {
+		u.Set("accountid", v.(string))
+	}
+	if v, found := p.p["certid"]; found {
+		u.Set("certid", v.(string))
+	}
+	if v, found := p.p["lbruleid"]; found {
+		u.Set("lbruleid", v.(string))
+	}
+	if v, found := p.p["projectid"]; found {
+		u.Set("projectid", v.(string))
+	}
+	return u
+}
+
+func (p *ListSslCertsParams) SetAccountid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["accountid"] = v
+	return
+}
+
+func (p *ListSslCertsParams) SetCertid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["certid"] = v
+	return
+}
+
+func (p *ListSslCertsParams) SetLbruleid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["lbruleid"] = v
+	return
+}
+
+func (p *ListSslCertsParams) SetProjectid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectid"] = v
+	return
+}
+
+// You should always use this function to get a new ListSslCertsParams instance,
+// as then you are sure you have configured all required params
+func (s *LoadBalancerService) NewListSslCertsParams() *ListSslCertsParams {
+	p := &ListSslCertsParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// Lists SSL certificates
+func (s *LoadBalancerService) ListSslCerts(p *ListSslCertsParams) (*ListSslCertsResponse, error) {
+	resp, err := s.cs.newRequest("listSslCerts", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListSslCertsResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListSslCertsResponse struct {
+	Count    int        `json:"count"`
+	SslCerts []*SslCert `json:"sslcert"`
+}
+
+type SslCert struct {
+	Account              string   `json:"account"`
+	Certchain            string   `json:"certchain"`
+	Certificate          string   `json:"certificate"`
+	Domain               string   `json:"domain"`
+	Domainid             string   `json:"domainid"`
+	Fingerprint          string   `json:"fingerprint"`
+	Id                   string   `json:"id"`
+	Loadbalancerrulelist []string `json:"loadbalancerrulelist"`
+	Project              string   `json:"project"`
+	Projectid            string   `json:"projectid"`
+}
+
+type RemoveCertFromLoadBalancerParams struct {
+	p map[string]interface{}
+}
+
+func (p *RemoveCertFromLoadBalancerParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["lbruleid"]; found {
+		u.Set("lbruleid", v.(string))
+	}
+	return u
+}
+
+func (p *RemoveCertFromLoadBalancerParams) SetLbruleid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["lbruleid"] = v
+	return
+}
+
+// You should always use this function to get a new RemoveCertFromLoadBalancerParams instance,
+// as then you are sure you have configured all required params
+func (s *LoadBalancerService) NewRemoveCertFromLoadBalancerParams(lbruleid string) *RemoveCertFromLoadBalancerParams {
+	p := &RemoveCertFromLoadBalancerParams{}
+	p.p = make(map[string]interface{})
+	p.p["lbruleid"] = lbruleid
+	return p
+}
+
+// Removes a certificate from a load balancer rule
+func (s *LoadBalancerService) RemoveCertFromLoadBalancer(p *RemoveCertFromLoadBalancerParams) (*RemoveCertFromLoadBalancerResponse, error) {
+	resp, err := s.cs.newRequest("removeCertFromLoadBalancer", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r RemoveCertFromLoadBalancerResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type RemoveCertFromLoadBalancerResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
+
+type RemoveFromGlobalLoadBalancerRuleParams struct {
+	p map[string]interface{}
+}
+
+func (p *RemoveFromGlobalLoadBalancerRuleParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["loadbalancerrulelist"]; found {
+		vv := strings.Join(v.([]string), ",")
+		u.Set("loadbalancerrulelist", vv)
+	}
+	return u
+}
+
+func (p *RemoveFromGlobalLoadBalancerRuleParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *RemoveFromGlobalLoadBalancerRuleParams) SetLoadbalancerrulelist(v []string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["loadbalancerrulelist"] = v
+	return
+}
+
+// You should always use this function to get a new RemoveFromGlobalLoadBalancerRuleParams instance,
+// as then you are sure you have configured all required params
+func (s *LoadBalancerService) NewRemoveFromGlobalLoadBalancerRuleParams(id string, loadbalancerrulelist []string) *RemoveFromGlobalLoadBalancerRuleParams {
+	p := &RemoveFromGlobalLoadBalancerRuleParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	p.p["loadbalancerrulelist"] = loadbalancerrulelist
+	return p
+}
+
+// Removes a load balancer rule association with global load balancer rule
+func (s *LoadBalancerService) RemoveFromGlobalLoadBalancerRule(p *RemoveFromGlobalLoadBalancerRuleParams) (*RemoveFromGlobalLoadBalancerRuleResponse, error) {
+	resp, err := s.cs.newRequest("removeFromGlobalLoadBalancerRule", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r RemoveFromGlobalLoadBalancerRuleResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type RemoveFromGlobalLoadBalancerRuleResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
+
+type RemoveFromLoadBalancerRuleParams struct {
+	p map[string]interface{}
+}
+
+func (p *RemoveFromLoadBalancerRuleParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["virtualmachineids"]; found {
+		vv := strings.Join(v.([]string), ",")
+		u.Set("virtualmachineids", vv)
+	}
+	if v, found := p.p["vmidipmap"]; found {
+		i := 0
+		for k, vv := range v.(map[string]string) {
+			u.Set(fmt.Sprintf("vmidipmap[%d].key", i), k)
+			u.Set(fmt.Sprintf("vmidipmap[%d].value", i), vv)
+			i++
+		}
+	}
+	return u
+}
+
+func (p *RemoveFromLoadBalancerRuleParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *RemoveFromLoadBalancerRuleParams) SetVirtualmachineids(v []string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["virtualmachineids"] = v
+	return
+}
+
+func (p *RemoveFromLoadBalancerRuleParams) SetVmidipmap(v map[string]string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["vmidipmap"] = v
+	return
+}
+
+// You should always use this function to get a new RemoveFromLoadBalancerRuleParams instance,
+// as then you are sure you have configured all required params
+func (s *LoadBalancerService) NewRemoveFromLoadBalancerRuleParams(id string) *RemoveFromLoadBalancerRuleParams {
+	p := &RemoveFromLoadBalancerRuleParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Removes a virtual machine or a list of virtual machines from a load balancer rule.
+func (s *LoadBalancerService) RemoveFromLoadBalancerRule(p *RemoveFromLoadBalancerRuleParams) (*RemoveFromLoadBalancerRuleResponse, error) {
+	resp, err := s.cs.newRequest("removeFromLoadBalancerRule", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r RemoveFromLoadBalancerRuleResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type RemoveFromLoadBalancerRuleResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
+
+type UpdateGlobalLoadBalancerRuleParams struct {
+	p map[string]interface{}
+}
+
+func (p *UpdateGlobalLoadBalancerRuleParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["description"]; found {
+		u.Set("description", v.(string))
+	}
+	if v, found := p.p["gslblbmethod"]; found {
+		u.Set("gslblbmethod", v.(string))
+	}
+	if v, found := p.p["gslbstickysessionmethodname"]; found {
+		u.Set("gslbstickysessionmethodname", v.(string))
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *UpdateGlobalLoadBalancerRuleParams) SetDescription(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["description"] = v
+	return
+}
+
+func (p *UpdateGlobalLoadBalancerRuleParams) SetGslblbmethod(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["gslblbmethod"] = v
+	return
+}
+
+func (p *UpdateGlobalLoadBalancerRuleParams) SetGslbstickysessionmethodname(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["gslbstickysessionmethodname"] = v
+	return
+}
+
+func (p *UpdateGlobalLoadBalancerRuleParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new UpdateGlobalLoadBalancerRuleParams instance,
+// as then you are sure you have configured all required params
+func (s *LoadBalancerService) NewUpdateGlobalLoadBalancerRuleParams(id string) *UpdateGlobalLoadBalancerRuleParams {
+	p := &UpdateGlobalLoadBalancerRuleParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// update global load balancer rules.
+func (s *LoadBalancerService) UpdateGlobalLoadBalancerRule(p *UpdateGlobalLoadBalancerRuleParams) (*UpdateGlobalLoadBalancerRuleResponse, error) {
+	resp, err := s.cs.newRequest("updateGlobalLoadBalancerRule", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r UpdateGlobalLoadBalancerRuleResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type UpdateGlobalLoadBalancerRuleResponse struct {
+	JobID                       string `json:"jobid"`
+	Account                     string `json:"account"`
+	Description                 string `json:"description"`
+	Domain                      string `json:"domain"`
+	Domainid                    string `json:"domainid"`
+	Gslbdomainname              string `json:"gslbdomainname"`
+	Gslblbmethod                string `json:"gslblbmethod"`
+	Gslbservicetype             string `json:"gslbservicetype"`
+	Gslbstickysessionmethodname string `json:"gslbstickysessionmethodname"`
+	Id                          string `json:"id"`
+	Loadbalancerrule            []struct {
+		Account     string `json:"account"`
+		Algorithm   string `json:"algorithm"`
+		Cidrlist    string `json:"cidrlist"`
+		Description string `json:"description"`
+		Domain      string `json:"domain"`
+		Domainid    string `json:"domainid"`
+		Fordisplay  bool   `json:"fordisplay"`
+		Id          string `json:"id"`
+		Name        string `json:"name"`
+		Networkid   string `json:"networkid"`
+		Privateport string `json:"privateport"`
+		Project     string `json:"project"`
+		Projectid   string `json:"projectid"`
+		Protocol    string `json:"protocol"`
+		Publicip    string `json:"publicip"`
+		Publicipid  string `json:"publicipid"`
+		Publicport  string `json:"publicport"`
+		State       string `json:"state"`
+		Tags        []struct {
+			Account      string `json:"account"`
+			Customer     string `json:"customer"`
+			Domain       string `json:"domain"`
+			Domainid     string `json:"domainid"`
+			Key          string `json:"key"`
+			Project      string `json:"project"`
+			Projectid    string `json:"projectid"`
+			Resourceid   string `json:"resourceid"`
+			Resourcetype string `json:"resourcetype"`
+			Value        string `json:"value"`
+		} `json:"tags"`
+		Zoneid string `json:"zoneid"`
+	} `json:"loadbalancerrule"`
+	Name      string `json:"name"`
+	Project   string `json:"project"`
+	Projectid string `json:"projectid"`
+	Regionid  int    `json:"regionid"`
+}
+
+type UpdateLBHealthCheckPolicyParams struct {
+	p map[string]interface{}
+}
+
+func (p *UpdateLBHealthCheckPolicyParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["customid"]; found {
+		u.Set("customid", v.(string))
+	}
+	if v, found := p.p["fordisplay"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("fordisplay", vv)
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *UpdateLBHealthCheckPolicyParams) SetCustomid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["customid"] = v
+	return
+}
+
+func (p *UpdateLBHealthCheckPolicyParams) SetFordisplay(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["fordisplay"] = v
+	return
+}
+
+func (p *UpdateLBHealthCheckPolicyParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new UpdateLBHealthCheckPolicyParams instance,
+// as then you are sure you have configured all required params
+func (s *LoadBalancerService) NewUpdateLBHealthCheckPolicyParams(id string) *UpdateLBHealthCheckPolicyParams {
+	p := &UpdateLBHealthCheckPolicyParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Updates load balancer health check policy
+func (s *LoadBalancerService) UpdateLBHealthCheckPolicy(p *UpdateLBHealthCheckPolicyParams) (*UpdateLBHealthCheckPolicyResponse, error) {
+	resp, err := s.cs.newRequest("updateLBHealthCheckPolicy", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r UpdateLBHealthCheckPolicyResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type UpdateLBHealthCheckPolicyResponse struct {
+	JobID             string `json:"jobid"`
+	Account           string `json:"account"`
+	Domain            string `json:"domain"`
+	Domainid          string `json:"domainid"`
+	Healthcheckpolicy []struct {
+		Description             string `json:"description"`
+		Fordisplay              bool   `json:"fordisplay"`
+		Healthcheckinterval     int    `json:"healthcheckinterval"`
+		Healthcheckthresshold   int    `json:"healthcheckthresshold"`
+		Id                      string `json:"id"`
+		Pingpath                string `json:"pingpath"`
+		Responsetime            int    `json:"responsetime"`
+		State                   string `json:"state"`
+		Unhealthcheckthresshold int    `json:"unhealthcheckthresshold"`
+	} `json:"healthcheckpolicy"`
+	Lbruleid string `json:"lbruleid"`
+	Zoneid   string `json:"zoneid"`
+}
+
+type UpdateLBStickinessPolicyParams struct {
+	p map[string]interface{}
+}
+
+func (p *UpdateLBStickinessPolicyParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["customid"]; found {
+		u.Set("customid", v.(string))
+	}
+	if v, found := p.p["fordisplay"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("fordisplay", vv)
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *UpdateLBStickinessPolicyParams) SetCustomid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["customid"] = v
+	return
+}
+
+func (p *UpdateLBStickinessPolicyParams) SetFordisplay(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["fordisplay"] = v
+	return
+}
+
+func (p *UpdateLBStickinessPolicyParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new UpdateLBStickinessPolicyParams instance,
+// as then you are sure you have configured all required params
+func (s *LoadBalancerService) NewUpdateLBStickinessPolicyParams(id string) *UpdateLBStickinessPolicyParams {
+	p := &UpdateLBStickinessPolicyParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Updates load balancer stickiness policy
+func (s *LoadBalancerService) UpdateLBStickinessPolicy(p *UpdateLBStickinessPolicyParams) (*UpdateLBStickinessPolicyResponse, error) {
+	resp, err := s.cs.newRequest("updateLBStickinessPolicy", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r UpdateLBStickinessPolicyResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type UpdateLBStickinessPolicyResponse struct {
+	JobID            string `json:"jobid"`
+	Account          string `json:"account"`
+	Description      string `json:"description"`
+	Domain           string `json:"domain"`
+	Domainid         string `json:"domainid"`
+	Lbruleid         string `json:"lbruleid"`
+	Name             string `json:"name"`
+	State            string `json:"state"`
+	Stickinesspolicy []struct {
+		Description string            `json:"description"`
+		Fordisplay  bool              `json:"fordisplay"`
+		Id          string            `json:"id"`
+		Methodname  string            `json:"methodname"`
+		Name        string            `json:"name"`
+		Params      map[string]string `json:"params"`
+		State       string            `json:"state"`
+	} `json:"stickinesspolicy"`
+	Zoneid string `json:"zoneid"`
+}
+
+type UpdateLoadBalancerParams struct {
+	p map[string]interface{}
+}
+
+func (p *UpdateLoadBalancerParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["customid"]; found {
+		u.Set("customid", v.(string))
+	}
+	if v, found := p.p["fordisplay"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("fordisplay", vv)
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *UpdateLoadBalancerParams) SetCustomid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["customid"] = v
+	return
+}
+
+func (p *UpdateLoadBalancerParams) SetFordisplay(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["fordisplay"] = v
+	return
+}
+
+func (p *UpdateLoadBalancerParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new UpdateLoadBalancerParams instance,
+// as then you are sure you have configured all required params
+func (s *LoadBalancerService) NewUpdateLoadBalancerParams(id string) *UpdateLoadBalancerParams {
+	p := &UpdateLoadBalancerParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Updates a load balancer
+func (s *LoadBalancerService) UpdateLoadBalancer(p *UpdateLoadBalancerParams) (*UpdateLoadBalancerResponse, error) {
+	resp, err := s.cs.newRequest("updateLoadBalancer", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r UpdateLoadBalancerResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type UpdateLoadBalancerResponse struct {
+	JobID                string `json:"jobid"`
+	Account              string `json:"account"`
+	Algorithm            string `json:"algorithm"`
+	Description          string `json:"description"`
+	Domain               string `json:"domain"`
+	Domainid             string `json:"domainid"`
+	Fordisplay           bool   `json:"fordisplay"`
+	Id                   string `json:"id"`
+	Loadbalancerinstance []struct {
+		Id        string `json:"id"`
+		Ipaddress string `json:"ipaddress"`
+		Name      string `json:"name"`
+		State     string `json:"state"`
+	} `json:"loadbalancerinstance"`
+	Loadbalancerrule []struct {
+		Instanceport int    `json:"instanceport"`
+		Sourceport   int    `json:"sourceport"`
+		State        string `json:"state"`
+	} `json:"loadbalancerrule"`
+	Name                     string `json:"name"`
+	Networkid                string `json:"networkid"`
+	Project                  string `json:"project"`
+	Projectid                string `json:"projectid"`
+	Sourceipaddress          string `json:"sourceipaddress"`
+	Sourceipaddressnetworkid string `json:"sourceipaddressnetworkid"`
+	Tags                     []struct {
+		Account      string `json:"account"`
+		Customer     string `json:"customer"`
+		Domain       string `json:"domain"`
+		Domainid     string `json:"domainid"`
+		Key          string `json:"key"`
+		Project      string `json:"project"`
+		Projectid    string `json:"projectid"`
+		Resourceid   string `json:"resourceid"`
+		Resourcetype string `json:"resourcetype"`
+		Value        string `json:"value"`
+	} `json:"tags"`
+}
+
+type UpdateLoadBalancerRuleParams struct {
+	p map[string]interface{}
+}
+
+func (p *UpdateLoadBalancerRuleParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["algorithm"]; found {
+		u.Set("algorithm", v.(string))
+	}
+	if v, found := p.p["customid"]; found {
+		u.Set("customid", v.(string))
+	}
+	if v, found := p.p["description"]; found {
+		u.Set("description", v.(string))
+	}
+	if v, found := p.p["fordisplay"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("fordisplay", vv)
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	return u
+}
+
+func (p *UpdateLoadBalancerRuleParams) SetAlgorithm(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["algorithm"] = v
+	return
+}
+
+func (p *UpdateLoadBalancerRuleParams) SetCustomid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["customid"] = v
+	return
+}
+
+func (p *UpdateLoadBalancerRuleParams) SetDescription(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["description"] = v
+	return
+}
+
+func (p *UpdateLoadBalancerRuleParams) SetFordisplay(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["fordisplay"] = v
+	return
+}
+
+func (p *UpdateLoadBalancerRuleParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *UpdateLoadBalancerRuleParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+// You should always use this function to get a new UpdateLoadBalancerRuleParams instance,
+// as then you are sure you have configured all required params
+func (s *LoadBalancerService) NewUpdateLoadBalancerRuleParams(id string) *UpdateLoadBalancerRuleParams {
+	p := &UpdateLoadBalancerRuleParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Updates load balancer
+func (s *LoadBalancerService) UpdateLoadBalancerRule(p *UpdateLoadBalancerRuleParams) (*UpdateLoadBalancerRuleResponse, error) {
+	resp, err := s.cs.newRequest("updateLoadBalancerRule", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r UpdateLoadBalancerRuleResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type UpdateLoadBalancerRuleResponse struct {
+	JobID       string `json:"jobid"`
+	Account     string `json:"account"`
+	Algorithm   string `json:"algorithm"`
+	Cidrlist    string `json:"cidrlist"`
+	Description string `json:"description"`
+	Domain      string `json:"domain"`
+	Domainid    string `json:"domainid"`
+	Fordisplay  bool   `json:"fordisplay"`
+	Id          string `json:"id"`
+	Name        string `json:"name"`
+	Networkid   string `json:"networkid"`
+	Privateport string `json:"privateport"`
+	Project     string `json:"project"`
+	Projectid   string `json:"projectid"`
+	Protocol    string `json:"protocol"`
+	Publicip    string `json:"publicip"`
+	Publicipid  string `json:"publicipid"`
+	Publicport  string `json:"publicport"`
+	State       string `json:"state"`
+	Tags        []struct {
+		Account      string `json:"account"`
+		Customer     string `json:"customer"`
+		Domain       string `json:"domain"`
+		Domainid     string `json:"domainid"`
+		Key          string `json:"key"`
+		Project      string `json:"project"`
+		Projectid    string `json:"projectid"`
+		Resourceid   string `json:"resourceid"`
+		Resourcetype string `json:"resourcetype"`
+		Value        string `json:"value"`
+	} `json:"tags"`
+	Zoneid string `json:"zoneid"`
+}
+
+type UploadSslCertParams struct {
+	p map[string]interface{}
+}
+
+func (p *UploadSslCertParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["certchain"]; found {
+		u.Set("certchain", v.(string))
+	}
+	if v, found := p.p["certificate"]; found {
+		u.Set("certificate", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["password"]; found {
+		u.Set("password", v.(string))
+	}
+	if v, found := p.p["privatekey"]; found {
+		u.Set("privatekey", v.(string))
+	}
+	if v, found := p.p["projectid"]; found {
+		u.Set("projectid", v.(string))
+	}
+	return u
+}
+
+func (p *UploadSslCertParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *UploadSslCertParams) SetCertchain(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["certchain"] = v
+	return
+}
+
+func (p *UploadSslCertParams) SetCertificate(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["certificate"] = v
+	return
+}
+
+func (p *UploadSslCertParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *UploadSslCertParams) SetPassword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["password"] = v
+	return
+}
+
+func (p *UploadSslCertParams) SetPrivatekey(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["privatekey"] = v
+	return
+}
+
+func (p *UploadSslCertParams) SetProjectid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectid"] = v
+	return
+}
+
+// You should always use this function to get a new UploadSslCertParams instance,
+// as then you are sure you have configured all required params
+func (s *LoadBalancerService) NewUploadSslCertParams(certificate string, privatekey string) *UploadSslCertParams {
+	p := &UploadSslCertParams{}
+	p.p = make(map[string]interface{})
+	p.p["certificate"] = certificate
+	p.p["privatekey"] = privatekey
+	return p
+}
+
+// Upload a certificate to CloudStack
+func (s *LoadBalancerService) UploadSslCert(p *UploadSslCertParams) (*UploadSslCertResponse, error) {
+	resp, err := s.cs.newRequest("uploadSslCert", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r UploadSslCertResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type UploadSslCertResponse struct {
+	Account              string   `json:"account"`
+	Certchain            string   `json:"certchain"`
+	Certificate          string   `json:"certificate"`
+	Domain               string   `json:"domain"`
+	Domainid             string   `json:"domainid"`
+	Fingerprint          string   `json:"fingerprint"`
+	Id                   string   `json:"id"`
+	Loadbalancerrulelist []string `json:"loadbalancerrulelist"`
+	Project              string   `json:"project"`
+	Projectid            string   `json:"projectid"`
+}
diff --git a/vendor/github.com/xanzy/go-cloudstack/cloudstack/NATService.go b/vendor/github.com/xanzy/go-cloudstack/cloudstack/NATService.go
new file mode 100644
index 0000000..adb213e
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/cloudstack/NATService.go
@@ -0,0 +1,636 @@
+//
+// Copyright 2018, Sander van Harmelen
+//
+// Licensed 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 cloudstack
+
+import (
+	"encoding/json"
+	"fmt"
+	"net/url"
+	"strconv"
+	"strings"
+)
+
+type CreateIpForwardingRuleParams struct {
+	p map[string]interface{}
+}
+
+func (p *CreateIpForwardingRuleParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["cidrlist"]; found {
+		vv := strings.Join(v.([]string), ",")
+		u.Set("cidrlist", vv)
+	}
+	if v, found := p.p["endport"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("endport", vv)
+	}
+	if v, found := p.p["ipaddressid"]; found {
+		u.Set("ipaddressid", v.(string))
+	}
+	if v, found := p.p["openfirewall"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("openfirewall", vv)
+	}
+	if v, found := p.p["protocol"]; found {
+		u.Set("protocol", v.(string))
+	}
+	if v, found := p.p["startport"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("startport", vv)
+	}
+	return u
+}
+
+func (p *CreateIpForwardingRuleParams) SetCidrlist(v []string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["cidrlist"] = v
+	return
+}
+
+func (p *CreateIpForwardingRuleParams) SetEndport(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["endport"] = v
+	return
+}
+
+func (p *CreateIpForwardingRuleParams) SetIpaddressid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["ipaddressid"] = v
+	return
+}
+
+func (p *CreateIpForwardingRuleParams) SetOpenfirewall(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["openfirewall"] = v
+	return
+}
+
+func (p *CreateIpForwardingRuleParams) SetProtocol(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["protocol"] = v
+	return
+}
+
+func (p *CreateIpForwardingRuleParams) SetStartport(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["startport"] = v
+	return
+}
+
+// You should always use this function to get a new CreateIpForwardingRuleParams instance,
+// as then you are sure you have configured all required params
+func (s *NATService) NewCreateIpForwardingRuleParams(ipaddressid string, protocol string, startport int) *CreateIpForwardingRuleParams {
+	p := &CreateIpForwardingRuleParams{}
+	p.p = make(map[string]interface{})
+	p.p["ipaddressid"] = ipaddressid
+	p.p["protocol"] = protocol
+	p.p["startport"] = startport
+	return p
+}
+
+// Creates an IP forwarding rule
+func (s *NATService) CreateIpForwardingRule(p *CreateIpForwardingRuleParams) (*CreateIpForwardingRuleResponse, error) {
+	resp, err := s.cs.newRequest("createIpForwardingRule", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r CreateIpForwardingRuleResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type CreateIpForwardingRuleResponse struct {
+	JobID          string `json:"jobid"`
+	Cidrlist       string `json:"cidrlist"`
+	Fordisplay     bool   `json:"fordisplay"`
+	Id             string `json:"id"`
+	Ipaddress      string `json:"ipaddress"`
+	Ipaddressid    string `json:"ipaddressid"`
+	Networkid      string `json:"networkid"`
+	Privateendport string `json:"privateendport"`
+	Privateport    string `json:"privateport"`
+	Protocol       string `json:"protocol"`
+	Publicendport  string `json:"publicendport"`
+	Publicport     string `json:"publicport"`
+	State          string `json:"state"`
+	Tags           []struct {
+		Account      string `json:"account"`
+		Customer     string `json:"customer"`
+		Domain       string `json:"domain"`
+		Domainid     string `json:"domainid"`
+		Key          string `json:"key"`
+		Project      string `json:"project"`
+		Projectid    string `json:"projectid"`
+		Resourceid   string `json:"resourceid"`
+		Resourcetype string `json:"resourcetype"`
+		Value        string `json:"value"`
+	} `json:"tags"`
+	Virtualmachinedisplayname string `json:"virtualmachinedisplayname"`
+	Virtualmachineid          string `json:"virtualmachineid"`
+	Virtualmachinename        string `json:"virtualmachinename"`
+	Vmguestip                 string `json:"vmguestip"`
+}
+
+type DeleteIpForwardingRuleParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeleteIpForwardingRuleParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *DeleteIpForwardingRuleParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new DeleteIpForwardingRuleParams instance,
+// as then you are sure you have configured all required params
+func (s *NATService) NewDeleteIpForwardingRuleParams(id string) *DeleteIpForwardingRuleParams {
+	p := &DeleteIpForwardingRuleParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Deletes an IP forwarding rule
+func (s *NATService) DeleteIpForwardingRule(p *DeleteIpForwardingRuleParams) (*DeleteIpForwardingRuleResponse, error) {
+	resp, err := s.cs.newRequest("deleteIpForwardingRule", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeleteIpForwardingRuleResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type DeleteIpForwardingRuleResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
+
+type DisableStaticNatParams struct {
+	p map[string]interface{}
+}
+
+func (p *DisableStaticNatParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["ipaddressid"]; found {
+		u.Set("ipaddressid", v.(string))
+	}
+	return u
+}
+
+func (p *DisableStaticNatParams) SetIpaddressid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["ipaddressid"] = v
+	return
+}
+
+// You should always use this function to get a new DisableStaticNatParams instance,
+// as then you are sure you have configured all required params
+func (s *NATService) NewDisableStaticNatParams(ipaddressid string) *DisableStaticNatParams {
+	p := &DisableStaticNatParams{}
+	p.p = make(map[string]interface{})
+	p.p["ipaddressid"] = ipaddressid
+	return p
+}
+
+// Disables static rule for given IP address
+func (s *NATService) DisableStaticNat(p *DisableStaticNatParams) (*DisableStaticNatResponse, error) {
+	resp, err := s.cs.newRequest("disableStaticNat", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DisableStaticNatResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type DisableStaticNatResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
+
+type EnableStaticNatParams struct {
+	p map[string]interface{}
+}
+
+func (p *EnableStaticNatParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["ipaddressid"]; found {
+		u.Set("ipaddressid", v.(string))
+	}
+	if v, found := p.p["networkid"]; found {
+		u.Set("networkid", v.(string))
+	}
+	if v, found := p.p["virtualmachineid"]; found {
+		u.Set("virtualmachineid", v.(string))
+	}
+	if v, found := p.p["vmguestip"]; found {
+		u.Set("vmguestip", v.(string))
+	}
+	return u
+}
+
+func (p *EnableStaticNatParams) SetIpaddressid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["ipaddressid"] = v
+	return
+}
+
+func (p *EnableStaticNatParams) SetNetworkid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["networkid"] = v
+	return
+}
+
+func (p *EnableStaticNatParams) SetVirtualmachineid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["virtualmachineid"] = v
+	return
+}
+
+func (p *EnableStaticNatParams) SetVmguestip(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["vmguestip"] = v
+	return
+}
+
+// You should always use this function to get a new EnableStaticNatParams instance,
+// as then you are sure you have configured all required params
+func (s *NATService) NewEnableStaticNatParams(ipaddressid string, virtualmachineid string) *EnableStaticNatParams {
+	p := &EnableStaticNatParams{}
+	p.p = make(map[string]interface{})
+	p.p["ipaddressid"] = ipaddressid
+	p.p["virtualmachineid"] = virtualmachineid
+	return p
+}
+
+// Enables static NAT for given IP address
+func (s *NATService) EnableStaticNat(p *EnableStaticNatParams) (*EnableStaticNatResponse, error) {
+	resp, err := s.cs.newRequest("enableStaticNat", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r EnableStaticNatResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type EnableStaticNatResponse struct {
+	Displaytext string `json:"displaytext"`
+	Success     string `json:"success"`
+}
+
+type ListIpForwardingRulesParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListIpForwardingRulesParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["ipaddressid"]; found {
+		u.Set("ipaddressid", v.(string))
+	}
+	if v, found := p.p["isrecursive"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("isrecursive", vv)
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["listall"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("listall", vv)
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["projectid"]; found {
+		u.Set("projectid", v.(string))
+	}
+	if v, found := p.p["virtualmachineid"]; found {
+		u.Set("virtualmachineid", v.(string))
+	}
+	return u
+}
+
+func (p *ListIpForwardingRulesParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *ListIpForwardingRulesParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *ListIpForwardingRulesParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ListIpForwardingRulesParams) SetIpaddressid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["ipaddressid"] = v
+	return
+}
+
+func (p *ListIpForwardingRulesParams) SetIsrecursive(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isrecursive"] = v
+	return
+}
+
+func (p *ListIpForwardingRulesParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListIpForwardingRulesParams) SetListall(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["listall"] = v
+	return
+}
+
+func (p *ListIpForwardingRulesParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListIpForwardingRulesParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListIpForwardingRulesParams) SetProjectid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectid"] = v
+	return
+}
+
+func (p *ListIpForwardingRulesParams) SetVirtualmachineid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["virtualmachineid"] = v
+	return
+}
+
+// You should always use this function to get a new ListIpForwardingRulesParams instance,
+// as then you are sure you have configured all required params
+func (s *NATService) NewListIpForwardingRulesParams() *ListIpForwardingRulesParams {
+	p := &ListIpForwardingRulesParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *NATService) GetIpForwardingRuleByID(id string, opts ...OptionFunc) (*IpForwardingRule, int, error) {
+	p := &ListIpForwardingRulesParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["id"] = id
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return nil, -1, err
+		}
+	}
+
+	l, err := s.ListIpForwardingRules(p)
+	if err != nil {
+		if strings.Contains(err.Error(), fmt.Sprintf(
+			"Invalid parameter id value=%s due to incorrect long value format, "+
+				"or entity does not exist", id)) {
+			return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
+		}
+		return nil, -1, err
+	}
+
+	if l.Count == 0 {
+		return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
+	}
+
+	if l.Count == 1 {
+		return l.IpForwardingRules[0], l.Count, nil
+	}
+	return nil, l.Count, fmt.Errorf("There is more then one result for IpForwardingRule UUID: %s!", id)
+}
+
+// List the IP forwarding rules
+func (s *NATService) ListIpForwardingRules(p *ListIpForwardingRulesParams) (*ListIpForwardingRulesResponse, error) {
+	resp, err := s.cs.newRequest("listIpForwardingRules", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListIpForwardingRulesResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListIpForwardingRulesResponse struct {
+	Count             int                 `json:"count"`
+	IpForwardingRules []*IpForwardingRule `json:"ipforwardingrule"`
+}
+
+type IpForwardingRule struct {
+	Cidrlist       string `json:"cidrlist"`
+	Fordisplay     bool   `json:"fordisplay"`
+	Id             string `json:"id"`
+	Ipaddress      string `json:"ipaddress"`
+	Ipaddressid    string `json:"ipaddressid"`
+	Networkid      string `json:"networkid"`
+	Privateendport string `json:"privateendport"`
+	Privateport    string `json:"privateport"`
+	Protocol       string `json:"protocol"`
+	Publicendport  string `json:"publicendport"`
+	Publicport     string `json:"publicport"`
+	State          string `json:"state"`
+	Tags           []struct {
+		Account      string `json:"account"`
+		Customer     string `json:"customer"`
+		Domain       string `json:"domain"`
+		Domainid     string `json:"domainid"`
+		Key          string `json:"key"`
+		Project      string `json:"project"`
+		Projectid    string `json:"projectid"`
+		Resourceid   string `json:"resourceid"`
+		Resourcetype string `json:"resourcetype"`
+		Value        string `json:"value"`
+	} `json:"tags"`
+	Virtualmachinedisplayname string `json:"virtualmachinedisplayname"`
+	Virtualmachineid          string `json:"virtualmachineid"`
+	Virtualmachinename        string `json:"virtualmachinename"`
+	Vmguestip                 string `json:"vmguestip"`
+}
diff --git a/vendor/github.com/xanzy/go-cloudstack/cloudstack/NetworkACLService.go b/vendor/github.com/xanzy/go-cloudstack/cloudstack/NetworkACLService.go
new file mode 100644
index 0000000..e050b80
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/cloudstack/NetworkACLService.go
@@ -0,0 +1,1467 @@
+//
+// Copyright 2018, Sander van Harmelen
+//
+// Licensed 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 cloudstack
+
+import (
+	"encoding/json"
+	"fmt"
+	"net/url"
+	"strconv"
+	"strings"
+)
+
+type CreateNetworkACLParams struct {
+	p map[string]interface{}
+}
+
+func (p *CreateNetworkACLParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["aclid"]; found {
+		u.Set("aclid", v.(string))
+	}
+	if v, found := p.p["action"]; found {
+		u.Set("action", v.(string))
+	}
+	if v, found := p.p["cidrlist"]; found {
+		vv := strings.Join(v.([]string), ",")
+		u.Set("cidrlist", vv)
+	}
+	if v, found := p.p["endport"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("endport", vv)
+	}
+	if v, found := p.p["fordisplay"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("fordisplay", vv)
+	}
+	if v, found := p.p["icmpcode"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("icmpcode", vv)
+	}
+	if v, found := p.p["icmptype"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("icmptype", vv)
+	}
+	if v, found := p.p["networkid"]; found {
+		u.Set("networkid", v.(string))
+	}
+	if v, found := p.p["number"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("number", vv)
+	}
+	if v, found := p.p["protocol"]; found {
+		u.Set("protocol", v.(string))
+	}
+	if v, found := p.p["startport"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("startport", vv)
+	}
+	if v, found := p.p["traffictype"]; found {
+		u.Set("traffictype", v.(string))
+	}
+	return u
+}
+
+func (p *CreateNetworkACLParams) SetAclid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["aclid"] = v
+	return
+}
+
+func (p *CreateNetworkACLParams) SetAction(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["action"] = v
+	return
+}
+
+func (p *CreateNetworkACLParams) SetCidrlist(v []string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["cidrlist"] = v
+	return
+}
+
+func (p *CreateNetworkACLParams) SetEndport(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["endport"] = v
+	return
+}
+
+func (p *CreateNetworkACLParams) SetFordisplay(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["fordisplay"] = v
+	return
+}
+
+func (p *CreateNetworkACLParams) SetIcmpcode(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["icmpcode"] = v
+	return
+}
+
+func (p *CreateNetworkACLParams) SetIcmptype(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["icmptype"] = v
+	return
+}
+
+func (p *CreateNetworkACLParams) SetNetworkid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["networkid"] = v
+	return
+}
+
+func (p *CreateNetworkACLParams) SetNumber(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["number"] = v
+	return
+}
+
+func (p *CreateNetworkACLParams) SetProtocol(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["protocol"] = v
+	return
+}
+
+func (p *CreateNetworkACLParams) SetStartport(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["startport"] = v
+	return
+}
+
+func (p *CreateNetworkACLParams) SetTraffictype(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["traffictype"] = v
+	return
+}
+
+// You should always use this function to get a new CreateNetworkACLParams instance,
+// as then you are sure you have configured all required params
+func (s *NetworkACLService) NewCreateNetworkACLParams(protocol string) *CreateNetworkACLParams {
+	p := &CreateNetworkACLParams{}
+	p.p = make(map[string]interface{})
+	p.p["protocol"] = protocol
+	return p
+}
+
+// Creates a ACL rule in the given network (the network has to belong to VPC)
+func (s *NetworkACLService) CreateNetworkACL(p *CreateNetworkACLParams) (*CreateNetworkACLResponse, error) {
+	resp, err := s.cs.newRequest("createNetworkACL", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r CreateNetworkACLResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type CreateNetworkACLResponse struct {
+	JobID      string `json:"jobid"`
+	Aclid      string `json:"aclid"`
+	Action     string `json:"action"`
+	Cidrlist   string `json:"cidrlist"`
+	Endport    string `json:"endport"`
+	Fordisplay bool   `json:"fordisplay"`
+	Icmpcode   int    `json:"icmpcode"`
+	Icmptype   int    `json:"icmptype"`
+	Id         string `json:"id"`
+	Number     int    `json:"number"`
+	Protocol   string `json:"protocol"`
+	Startport  string `json:"startport"`
+	State      string `json:"state"`
+	Tags       []struct {
+		Account      string `json:"account"`
+		Customer     string `json:"customer"`
+		Domain       string `json:"domain"`
+		Domainid     string `json:"domainid"`
+		Key          string `json:"key"`
+		Project      string `json:"project"`
+		Projectid    string `json:"projectid"`
+		Resourceid   string `json:"resourceid"`
+		Resourcetype string `json:"resourcetype"`
+		Value        string `json:"value"`
+	} `json:"tags"`
+	Traffictype string `json:"traffictype"`
+}
+
+type CreateNetworkACLListParams struct {
+	p map[string]interface{}
+}
+
+func (p *CreateNetworkACLListParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["description"]; found {
+		u.Set("description", v.(string))
+	}
+	if v, found := p.p["fordisplay"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("fordisplay", vv)
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["vpcid"]; found {
+		u.Set("vpcid", v.(string))
+	}
+	return u
+}
+
+func (p *CreateNetworkACLListParams) SetDescription(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["description"] = v
+	return
+}
+
+func (p *CreateNetworkACLListParams) SetFordisplay(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["fordisplay"] = v
+	return
+}
+
+func (p *CreateNetworkACLListParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *CreateNetworkACLListParams) SetVpcid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["vpcid"] = v
+	return
+}
+
+// You should always use this function to get a new CreateNetworkACLListParams instance,
+// as then you are sure you have configured all required params
+func (s *NetworkACLService) NewCreateNetworkACLListParams(name string, vpcid string) *CreateNetworkACLListParams {
+	p := &CreateNetworkACLListParams{}
+	p.p = make(map[string]interface{})
+	p.p["name"] = name
+	p.p["vpcid"] = vpcid
+	return p
+}
+
+// Creates a network ACL for the given VPC
+func (s *NetworkACLService) CreateNetworkACLList(p *CreateNetworkACLListParams) (*CreateNetworkACLListResponse, error) {
+	resp, err := s.cs.newRequest("createNetworkACLList", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r CreateNetworkACLListResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type CreateNetworkACLListResponse struct {
+	JobID       string `json:"jobid"`
+	Description string `json:"description"`
+	Fordisplay  bool   `json:"fordisplay"`
+	Id          string `json:"id"`
+	Name        string `json:"name"`
+	Vpcid       string `json:"vpcid"`
+}
+
+type DeleteNetworkACLParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeleteNetworkACLParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *DeleteNetworkACLParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new DeleteNetworkACLParams instance,
+// as then you are sure you have configured all required params
+func (s *NetworkACLService) NewDeleteNetworkACLParams(id string) *DeleteNetworkACLParams {
+	p := &DeleteNetworkACLParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Deletes a network ACL
+func (s *NetworkACLService) DeleteNetworkACL(p *DeleteNetworkACLParams) (*DeleteNetworkACLResponse, error) {
+	resp, err := s.cs.newRequest("deleteNetworkACL", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeleteNetworkACLResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type DeleteNetworkACLResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
+
+type DeleteNetworkACLListParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeleteNetworkACLListParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *DeleteNetworkACLListParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new DeleteNetworkACLListParams instance,
+// as then you are sure you have configured all required params
+func (s *NetworkACLService) NewDeleteNetworkACLListParams(id string) *DeleteNetworkACLListParams {
+	p := &DeleteNetworkACLListParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Deletes a network ACL
+func (s *NetworkACLService) DeleteNetworkACLList(p *DeleteNetworkACLListParams) (*DeleteNetworkACLListResponse, error) {
+	resp, err := s.cs.newRequest("deleteNetworkACLList", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeleteNetworkACLListResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type DeleteNetworkACLListResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
+
+type ListNetworkACLListsParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListNetworkACLListsParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["fordisplay"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("fordisplay", vv)
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["isrecursive"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("isrecursive", vv)
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["listall"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("listall", vv)
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["networkid"]; found {
+		u.Set("networkid", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["projectid"]; found {
+		u.Set("projectid", v.(string))
+	}
+	if v, found := p.p["vpcid"]; found {
+		u.Set("vpcid", v.(string))
+	}
+	return u
+}
+
+func (p *ListNetworkACLListsParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *ListNetworkACLListsParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *ListNetworkACLListsParams) SetFordisplay(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["fordisplay"] = v
+	return
+}
+
+func (p *ListNetworkACLListsParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ListNetworkACLListsParams) SetIsrecursive(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isrecursive"] = v
+	return
+}
+
+func (p *ListNetworkACLListsParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListNetworkACLListsParams) SetListall(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["listall"] = v
+	return
+}
+
+func (p *ListNetworkACLListsParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *ListNetworkACLListsParams) SetNetworkid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["networkid"] = v
+	return
+}
+
+func (p *ListNetworkACLListsParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListNetworkACLListsParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListNetworkACLListsParams) SetProjectid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectid"] = v
+	return
+}
+
+func (p *ListNetworkACLListsParams) SetVpcid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["vpcid"] = v
+	return
+}
+
+// You should always use this function to get a new ListNetworkACLListsParams instance,
+// as then you are sure you have configured all required params
+func (s *NetworkACLService) NewListNetworkACLListsParams() *ListNetworkACLListsParams {
+	p := &ListNetworkACLListsParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *NetworkACLService) GetNetworkACLListID(name string, opts ...OptionFunc) (string, int, error) {
+	p := &ListNetworkACLListsParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["name"] = name
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return "", -1, err
+		}
+	}
+
+	l, err := s.ListNetworkACLLists(p)
+	if err != nil {
+		return "", -1, err
+	}
+
+	if l.Count == 0 {
+		return "", l.Count, fmt.Errorf("No match found for %s: %+v", name, l)
+	}
+
+	if l.Count == 1 {
+		return l.NetworkACLLists[0].Id, l.Count, nil
+	}
+
+	if l.Count > 1 {
+		for _, v := range l.NetworkACLLists {
+			if v.Name == name {
+				return v.Id, l.Count, nil
+			}
+		}
+	}
+	return "", l.Count, fmt.Errorf("Could not find an exact match for %s: %+v", name, l)
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *NetworkACLService) GetNetworkACLListByName(name string, opts ...OptionFunc) (*NetworkACLList, int, error) {
+	id, count, err := s.GetNetworkACLListID(name, opts...)
+	if err != nil {
+		return nil, count, err
+	}
+
+	r, count, err := s.GetNetworkACLListByID(id, opts...)
+	if err != nil {
+		return nil, count, err
+	}
+	return r, count, nil
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *NetworkACLService) GetNetworkACLListByID(id string, opts ...OptionFunc) (*NetworkACLList, int, error) {
+	p := &ListNetworkACLListsParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["id"] = id
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return nil, -1, err
+		}
+	}
+
+	l, err := s.ListNetworkACLLists(p)
+	if err != nil {
+		if strings.Contains(err.Error(), fmt.Sprintf(
+			"Invalid parameter id value=%s due to incorrect long value format, "+
+				"or entity does not exist", id)) {
+			return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
+		}
+		return nil, -1, err
+	}
+
+	if l.Count == 0 {
+		return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
+	}
+
+	if l.Count == 1 {
+		return l.NetworkACLLists[0], l.Count, nil
+	}
+	return nil, l.Count, fmt.Errorf("There is more then one result for NetworkACLList UUID: %s!", id)
+}
+
+// Lists all network ACLs
+func (s *NetworkACLService) ListNetworkACLLists(p *ListNetworkACLListsParams) (*ListNetworkACLListsResponse, error) {
+	resp, err := s.cs.newRequest("listNetworkACLLists", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListNetworkACLListsResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListNetworkACLListsResponse struct {
+	Count           int               `json:"count"`
+	NetworkACLLists []*NetworkACLList `json:"networkacllist"`
+}
+
+type NetworkACLList struct {
+	Description string `json:"description"`
+	Fordisplay  bool   `json:"fordisplay"`
+	Id          string `json:"id"`
+	Name        string `json:"name"`
+	Vpcid       string `json:"vpcid"`
+}
+
+type ListNetworkACLsParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListNetworkACLsParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["aclid"]; found {
+		u.Set("aclid", v.(string))
+	}
+	if v, found := p.p["action"]; found {
+		u.Set("action", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["fordisplay"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("fordisplay", vv)
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["isrecursive"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("isrecursive", vv)
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["listall"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("listall", vv)
+	}
+	if v, found := p.p["networkid"]; found {
+		u.Set("networkid", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["projectid"]; found {
+		u.Set("projectid", v.(string))
+	}
+	if v, found := p.p["protocol"]; found {
+		u.Set("protocol", v.(string))
+	}
+	if v, found := p.p["tags"]; found {
+		i := 0
+		for k, vv := range v.(map[string]string) {
+			u.Set(fmt.Sprintf("tags[%d].key", i), k)
+			u.Set(fmt.Sprintf("tags[%d].value", i), vv)
+			i++
+		}
+	}
+	if v, found := p.p["traffictype"]; found {
+		u.Set("traffictype", v.(string))
+	}
+	return u
+}
+
+func (p *ListNetworkACLsParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *ListNetworkACLsParams) SetAclid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["aclid"] = v
+	return
+}
+
+func (p *ListNetworkACLsParams) SetAction(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["action"] = v
+	return
+}
+
+func (p *ListNetworkACLsParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *ListNetworkACLsParams) SetFordisplay(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["fordisplay"] = v
+	return
+}
+
+func (p *ListNetworkACLsParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ListNetworkACLsParams) SetIsrecursive(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isrecursive"] = v
+	return
+}
+
+func (p *ListNetworkACLsParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListNetworkACLsParams) SetListall(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["listall"] = v
+	return
+}
+
+func (p *ListNetworkACLsParams) SetNetworkid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["networkid"] = v
+	return
+}
+
+func (p *ListNetworkACLsParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListNetworkACLsParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListNetworkACLsParams) SetProjectid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectid"] = v
+	return
+}
+
+func (p *ListNetworkACLsParams) SetProtocol(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["protocol"] = v
+	return
+}
+
+func (p *ListNetworkACLsParams) SetTags(v map[string]string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["tags"] = v
+	return
+}
+
+func (p *ListNetworkACLsParams) SetTraffictype(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["traffictype"] = v
+	return
+}
+
+// You should always use this function to get a new ListNetworkACLsParams instance,
+// as then you are sure you have configured all required params
+func (s *NetworkACLService) NewListNetworkACLsParams() *ListNetworkACLsParams {
+	p := &ListNetworkACLsParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *NetworkACLService) GetNetworkACLByID(id string, opts ...OptionFunc) (*NetworkACL, int, error) {
+	p := &ListNetworkACLsParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["id"] = id
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return nil, -1, err
+		}
+	}
+
+	l, err := s.ListNetworkACLs(p)
+	if err != nil {
+		if strings.Contains(err.Error(), fmt.Sprintf(
+			"Invalid parameter id value=%s due to incorrect long value format, "+
+				"or entity does not exist", id)) {
+			return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
+		}
+		return nil, -1, err
+	}
+
+	if l.Count == 0 {
+		return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
+	}
+
+	if l.Count == 1 {
+		return l.NetworkACLs[0], l.Count, nil
+	}
+	return nil, l.Count, fmt.Errorf("There is more then one result for NetworkACL UUID: %s!", id)
+}
+
+// Lists all network ACL items
+func (s *NetworkACLService) ListNetworkACLs(p *ListNetworkACLsParams) (*ListNetworkACLsResponse, error) {
+	resp, err := s.cs.newRequest("listNetworkACLs", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListNetworkACLsResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListNetworkACLsResponse struct {
+	Count       int           `json:"count"`
+	NetworkACLs []*NetworkACL `json:"networkacl"`
+}
+
+type NetworkACL struct {
+	Aclid      string `json:"aclid"`
+	Action     string `json:"action"`
+	Cidrlist   string `json:"cidrlist"`
+	Endport    string `json:"endport"`
+	Fordisplay bool   `json:"fordisplay"`
+	Icmpcode   int    `json:"icmpcode"`
+	Icmptype   int    `json:"icmptype"`
+	Id         string `json:"id"`
+	Number     int    `json:"number"`
+	Protocol   string `json:"protocol"`
+	Startport  string `json:"startport"`
+	State      string `json:"state"`
+	Tags       []struct {
+		Account      string `json:"account"`
+		Customer     string `json:"customer"`
+		Domain       string `json:"domain"`
+		Domainid     string `json:"domainid"`
+		Key          string `json:"key"`
+		Project      string `json:"project"`
+		Projectid    string `json:"projectid"`
+		Resourceid   string `json:"resourceid"`
+		Resourcetype string `json:"resourcetype"`
+		Value        string `json:"value"`
+	} `json:"tags"`
+	Traffictype string `json:"traffictype"`
+}
+
+type ReplaceNetworkACLListParams struct {
+	p map[string]interface{}
+}
+
+func (p *ReplaceNetworkACLListParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["aclid"]; found {
+		u.Set("aclid", v.(string))
+	}
+	if v, found := p.p["gatewayid"]; found {
+		u.Set("gatewayid", v.(string))
+	}
+	if v, found := p.p["networkid"]; found {
+		u.Set("networkid", v.(string))
+	}
+	return u
+}
+
+func (p *ReplaceNetworkACLListParams) SetAclid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["aclid"] = v
+	return
+}
+
+func (p *ReplaceNetworkACLListParams) SetGatewayid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["gatewayid"] = v
+	return
+}
+
+func (p *ReplaceNetworkACLListParams) SetNetworkid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["networkid"] = v
+	return
+}
+
+// You should always use this function to get a new ReplaceNetworkACLListParams instance,
+// as then you are sure you have configured all required params
+func (s *NetworkACLService) NewReplaceNetworkACLListParams(aclid string) *ReplaceNetworkACLListParams {
+	p := &ReplaceNetworkACLListParams{}
+	p.p = make(map[string]interface{})
+	p.p["aclid"] = aclid
+	return p
+}
+
+// Replaces ACL associated with a network or private gateway
+func (s *NetworkACLService) ReplaceNetworkACLList(p *ReplaceNetworkACLListParams) (*ReplaceNetworkACLListResponse, error) {
+	resp, err := s.cs.newRequest("replaceNetworkACLList", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ReplaceNetworkACLListResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type ReplaceNetworkACLListResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
+
+type UpdateNetworkACLItemParams struct {
+	p map[string]interface{}
+}
+
+func (p *UpdateNetworkACLItemParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["action"]; found {
+		u.Set("action", v.(string))
+	}
+	if v, found := p.p["cidrlist"]; found {
+		vv := strings.Join(v.([]string), ",")
+		u.Set("cidrlist", vv)
+	}
+	if v, found := p.p["customid"]; found {
+		u.Set("customid", v.(string))
+	}
+	if v, found := p.p["endport"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("endport", vv)
+	}
+	if v, found := p.p["fordisplay"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("fordisplay", vv)
+	}
+	if v, found := p.p["icmpcode"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("icmpcode", vv)
+	}
+	if v, found := p.p["icmptype"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("icmptype", vv)
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["number"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("number", vv)
+	}
+	if v, found := p.p["protocol"]; found {
+		u.Set("protocol", v.(string))
+	}
+	if v, found := p.p["startport"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("startport", vv)
+	}
+	if v, found := p.p["traffictype"]; found {
+		u.Set("traffictype", v.(string))
+	}
+	return u
+}
+
+func (p *UpdateNetworkACLItemParams) SetAction(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["action"] = v
+	return
+}
+
+func (p *UpdateNetworkACLItemParams) SetCidrlist(v []string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["cidrlist"] = v
+	return
+}
+
+func (p *UpdateNetworkACLItemParams) SetCustomid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["customid"] = v
+	return
+}
+
+func (p *UpdateNetworkACLItemParams) SetEndport(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["endport"] = v
+	return
+}
+
+func (p *UpdateNetworkACLItemParams) SetFordisplay(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["fordisplay"] = v
+	return
+}
+
+func (p *UpdateNetworkACLItemParams) SetIcmpcode(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["icmpcode"] = v
+	return
+}
+
+func (p *UpdateNetworkACLItemParams) SetIcmptype(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["icmptype"] = v
+	return
+}
+
+func (p *UpdateNetworkACLItemParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *UpdateNetworkACLItemParams) SetNumber(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["number"] = v
+	return
+}
+
+func (p *UpdateNetworkACLItemParams) SetProtocol(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["protocol"] = v
+	return
+}
+
+func (p *UpdateNetworkACLItemParams) SetStartport(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["startport"] = v
+	return
+}
+
+func (p *UpdateNetworkACLItemParams) SetTraffictype(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["traffictype"] = v
+	return
+}
+
+// You should always use this function to get a new UpdateNetworkACLItemParams instance,
+// as then you are sure you have configured all required params
+func (s *NetworkACLService) NewUpdateNetworkACLItemParams(id string) *UpdateNetworkACLItemParams {
+	p := &UpdateNetworkACLItemParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Updates ACL item with specified ID
+func (s *NetworkACLService) UpdateNetworkACLItem(p *UpdateNetworkACLItemParams) (*UpdateNetworkACLItemResponse, error) {
+	resp, err := s.cs.newRequest("updateNetworkACLItem", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r UpdateNetworkACLItemResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type UpdateNetworkACLItemResponse struct {
+	JobID      string `json:"jobid"`
+	Aclid      string `json:"aclid"`
+	Action     string `json:"action"`
+	Cidrlist   string `json:"cidrlist"`
+	Endport    string `json:"endport"`
+	Fordisplay bool   `json:"fordisplay"`
+	Icmpcode   int    `json:"icmpcode"`
+	Icmptype   int    `json:"icmptype"`
+	Id         string `json:"id"`
+	Number     int    `json:"number"`
+	Protocol   string `json:"protocol"`
+	Startport  string `json:"startport"`
+	State      string `json:"state"`
+	Tags       []struct {
+		Account      string `json:"account"`
+		Customer     string `json:"customer"`
+		Domain       string `json:"domain"`
+		Domainid     string `json:"domainid"`
+		Key          string `json:"key"`
+		Project      string `json:"project"`
+		Projectid    string `json:"projectid"`
+		Resourceid   string `json:"resourceid"`
+		Resourcetype string `json:"resourcetype"`
+		Value        string `json:"value"`
+	} `json:"tags"`
+	Traffictype string `json:"traffictype"`
+}
+
+type UpdateNetworkACLListParams struct {
+	p map[string]interface{}
+}
+
+func (p *UpdateNetworkACLListParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["customid"]; found {
+		u.Set("customid", v.(string))
+	}
+	if v, found := p.p["fordisplay"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("fordisplay", vv)
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *UpdateNetworkACLListParams) SetCustomid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["customid"] = v
+	return
+}
+
+func (p *UpdateNetworkACLListParams) SetFordisplay(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["fordisplay"] = v
+	return
+}
+
+func (p *UpdateNetworkACLListParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new UpdateNetworkACLListParams instance,
+// as then you are sure you have configured all required params
+func (s *NetworkACLService) NewUpdateNetworkACLListParams(id string) *UpdateNetworkACLListParams {
+	p := &UpdateNetworkACLListParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Updates network ACL list
+func (s *NetworkACLService) UpdateNetworkACLList(p *UpdateNetworkACLListParams) (*UpdateNetworkACLListResponse, error) {
+	resp, err := s.cs.newRequest("updateNetworkACLList", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r UpdateNetworkACLListResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type UpdateNetworkACLListResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
diff --git a/vendor/github.com/xanzy/go-cloudstack/cloudstack/NetworkDeviceService.go b/vendor/github.com/xanzy/go-cloudstack/cloudstack/NetworkDeviceService.go
new file mode 100644
index 0000000..6f44b98
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/cloudstack/NetworkDeviceService.go
@@ -0,0 +1,248 @@
+//
+// Copyright 2018, Sander van Harmelen
+//
+// Licensed 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 cloudstack
+
+import (
+	"encoding/json"
+	"fmt"
+	"net/url"
+	"strconv"
+)
+
+type AddNetworkDeviceParams struct {
+	p map[string]interface{}
+}
+
+func (p *AddNetworkDeviceParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["networkdeviceparameterlist"]; found {
+		i := 0
+		for k, vv := range v.(map[string]string) {
+			u.Set(fmt.Sprintf("networkdeviceparameterlist[%d].key", i), k)
+			u.Set(fmt.Sprintf("networkdeviceparameterlist[%d].value", i), vv)
+			i++
+		}
+	}
+	if v, found := p.p["networkdevicetype"]; found {
+		u.Set("networkdevicetype", v.(string))
+	}
+	return u
+}
+
+func (p *AddNetworkDeviceParams) SetNetworkdeviceparameterlist(v map[string]string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["networkdeviceparameterlist"] = v
+	return
+}
+
+func (p *AddNetworkDeviceParams) SetNetworkdevicetype(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["networkdevicetype"] = v
+	return
+}
+
+// You should always use this function to get a new AddNetworkDeviceParams instance,
+// as then you are sure you have configured all required params
+func (s *NetworkDeviceService) NewAddNetworkDeviceParams() *AddNetworkDeviceParams {
+	p := &AddNetworkDeviceParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// Adds a network device of one of the following types: ExternalDhcp, ExternalFirewall, ExternalLoadBalancer, PxeServer
+func (s *NetworkDeviceService) AddNetworkDevice(p *AddNetworkDeviceParams) (*AddNetworkDeviceResponse, error) {
+	resp, err := s.cs.newRequest("addNetworkDevice", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r AddNetworkDeviceResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type AddNetworkDeviceResponse struct {
+	Id string `json:"id"`
+}
+
+type DeleteNetworkDeviceParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeleteNetworkDeviceParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *DeleteNetworkDeviceParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new DeleteNetworkDeviceParams instance,
+// as then you are sure you have configured all required params
+func (s *NetworkDeviceService) NewDeleteNetworkDeviceParams(id string) *DeleteNetworkDeviceParams {
+	p := &DeleteNetworkDeviceParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Deletes network device.
+func (s *NetworkDeviceService) DeleteNetworkDevice(p *DeleteNetworkDeviceParams) (*DeleteNetworkDeviceResponse, error) {
+	resp, err := s.cs.newRequest("deleteNetworkDevice", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeleteNetworkDeviceResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type DeleteNetworkDeviceResponse struct {
+	Displaytext string `json:"displaytext"`
+	Success     string `json:"success"`
+}
+
+type ListNetworkDeviceParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListNetworkDeviceParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["networkdeviceparameterlist"]; found {
+		i := 0
+		for k, vv := range v.(map[string]string) {
+			u.Set(fmt.Sprintf("networkdeviceparameterlist[%d].key", i), k)
+			u.Set(fmt.Sprintf("networkdeviceparameterlist[%d].value", i), vv)
+			i++
+		}
+	}
+	if v, found := p.p["networkdevicetype"]; found {
+		u.Set("networkdevicetype", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	return u
+}
+
+func (p *ListNetworkDeviceParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListNetworkDeviceParams) SetNetworkdeviceparameterlist(v map[string]string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["networkdeviceparameterlist"] = v
+	return
+}
+
+func (p *ListNetworkDeviceParams) SetNetworkdevicetype(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["networkdevicetype"] = v
+	return
+}
+
+func (p *ListNetworkDeviceParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListNetworkDeviceParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+// You should always use this function to get a new ListNetworkDeviceParams instance,
+// as then you are sure you have configured all required params
+func (s *NetworkDeviceService) NewListNetworkDeviceParams() *ListNetworkDeviceParams {
+	p := &ListNetworkDeviceParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// List network devices
+func (s *NetworkDeviceService) ListNetworkDevice(p *ListNetworkDeviceParams) (*ListNetworkDeviceResponse, error) {
+	resp, err := s.cs.newRequest("listNetworkDevice", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListNetworkDeviceResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListNetworkDeviceResponse struct {
+	Count         int              `json:"count"`
+	NetworkDevice []*NetworkDevice `json:"networkdevice"`
+}
+
+type NetworkDevice struct {
+	Id string `json:"id"`
+}
diff --git a/vendor/github.com/xanzy/go-cloudstack/cloudstack/NetworkOfferingService.go b/vendor/github.com/xanzy/go-cloudstack/cloudstack/NetworkOfferingService.go
new file mode 100644
index 0000000..59b6663
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/cloudstack/NetworkOfferingService.go
@@ -0,0 +1,954 @@
+//
+// Copyright 2018, Sander van Harmelen
+//
+// Licensed 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 cloudstack
+
+import (
+	"encoding/json"
+	"fmt"
+	"net/url"
+	"strconv"
+	"strings"
+)
+
+type CreateNetworkOfferingParams struct {
+	p map[string]interface{}
+}
+
+func (p *CreateNetworkOfferingParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["availability"]; found {
+		u.Set("availability", v.(string))
+	}
+	if v, found := p.p["conservemode"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("conservemode", vv)
+	}
+	if v, found := p.p["details"]; found {
+		i := 0
+		for k, vv := range v.(map[string]string) {
+			u.Set(fmt.Sprintf("details[%d].%s", i, k), vv)
+			i++
+		}
+	}
+	if v, found := p.p["displaytext"]; found {
+		u.Set("displaytext", v.(string))
+	}
+	if v, found := p.p["egressdefaultpolicy"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("egressdefaultpolicy", vv)
+	}
+	if v, found := p.p["guestiptype"]; found {
+		u.Set("guestiptype", v.(string))
+	}
+	if v, found := p.p["ispersistent"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("ispersistent", vv)
+	}
+	if v, found := p.p["keepaliveenabled"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("keepaliveenabled", vv)
+	}
+	if v, found := p.p["maxconnections"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("maxconnections", vv)
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["networkrate"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("networkrate", vv)
+	}
+	if v, found := p.p["servicecapabilitylist"]; found {
+		i := 0
+		for k, vv := range v.(map[string]string) {
+			u.Set(fmt.Sprintf("servicecapabilitylist[%d].key", i), k)
+			u.Set(fmt.Sprintf("servicecapabilitylist[%d].value", i), vv)
+			i++
+		}
+	}
+	if v, found := p.p["serviceofferingid"]; found {
+		u.Set("serviceofferingid", v.(string))
+	}
+	if v, found := p.p["serviceproviderlist"]; found {
+		i := 0
+		for k, vv := range v.(map[string]string) {
+			u.Set(fmt.Sprintf("serviceproviderlist[%d].service", i), k)
+			u.Set(fmt.Sprintf("serviceproviderlist[%d].provider", i), vv)
+			i++
+		}
+	}
+	if v, found := p.p["specifyipranges"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("specifyipranges", vv)
+	}
+	if v, found := p.p["specifyvlan"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("specifyvlan", vv)
+	}
+	if v, found := p.p["supportedservices"]; found {
+		vv := strings.Join(v.([]string), ",")
+		u.Set("supportedservices", vv)
+	}
+	if v, found := p.p["tags"]; found {
+		u.Set("tags", v.(string))
+	}
+	if v, found := p.p["traffictype"]; found {
+		u.Set("traffictype", v.(string))
+	}
+	return u
+}
+
+func (p *CreateNetworkOfferingParams) SetAvailability(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["availability"] = v
+	return
+}
+
+func (p *CreateNetworkOfferingParams) SetConservemode(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["conservemode"] = v
+	return
+}
+
+func (p *CreateNetworkOfferingParams) SetDetails(v map[string]string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["details"] = v
+	return
+}
+
+func (p *CreateNetworkOfferingParams) SetDisplaytext(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["displaytext"] = v
+	return
+}
+
+func (p *CreateNetworkOfferingParams) SetEgressdefaultpolicy(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["egressdefaultpolicy"] = v
+	return
+}
+
+func (p *CreateNetworkOfferingParams) SetGuestiptype(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["guestiptype"] = v
+	return
+}
+
+func (p *CreateNetworkOfferingParams) SetIspersistent(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["ispersistent"] = v
+	return
+}
+
+func (p *CreateNetworkOfferingParams) SetKeepaliveenabled(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keepaliveenabled"] = v
+	return
+}
+
+func (p *CreateNetworkOfferingParams) SetMaxconnections(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["maxconnections"] = v
+	return
+}
+
+func (p *CreateNetworkOfferingParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *CreateNetworkOfferingParams) SetNetworkrate(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["networkrate"] = v
+	return
+}
+
+func (p *CreateNetworkOfferingParams) SetServicecapabilitylist(v map[string]string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["servicecapabilitylist"] = v
+	return
+}
+
+func (p *CreateNetworkOfferingParams) SetServiceofferingid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["serviceofferingid"] = v
+	return
+}
+
+func (p *CreateNetworkOfferingParams) SetServiceproviderlist(v map[string]string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["serviceproviderlist"] = v
+	return
+}
+
+func (p *CreateNetworkOfferingParams) SetSpecifyipranges(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["specifyipranges"] = v
+	return
+}
+
+func (p *CreateNetworkOfferingParams) SetSpecifyvlan(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["specifyvlan"] = v
+	return
+}
+
+func (p *CreateNetworkOfferingParams) SetSupportedservices(v []string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["supportedservices"] = v
+	return
+}
+
+func (p *CreateNetworkOfferingParams) SetTags(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["tags"] = v
+	return
+}
+
+func (p *CreateNetworkOfferingParams) SetTraffictype(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["traffictype"] = v
+	return
+}
+
+// You should always use this function to get a new CreateNetworkOfferingParams instance,
+// as then you are sure you have configured all required params
+func (s *NetworkOfferingService) NewCreateNetworkOfferingParams(displaytext string, guestiptype string, name string, supportedservices []string, traffictype string) *CreateNetworkOfferingParams {
+	p := &CreateNetworkOfferingParams{}
+	p.p = make(map[string]interface{})
+	p.p["displaytext"] = displaytext
+	p.p["guestiptype"] = guestiptype
+	p.p["name"] = name
+	p.p["supportedservices"] = supportedservices
+	p.p["traffictype"] = traffictype
+	return p
+}
+
+// Creates a network offering.
+func (s *NetworkOfferingService) CreateNetworkOffering(p *CreateNetworkOfferingParams) (*CreateNetworkOfferingResponse, error) {
+	resp, err := s.cs.newRequest("createNetworkOffering", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	if resp, err = getRawValue(resp); err != nil {
+		return nil, err
+	}
+
+	var r CreateNetworkOfferingResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type CreateNetworkOfferingResponse struct {
+	Availability        string            `json:"availability"`
+	Conservemode        bool              `json:"conservemode"`
+	Created             string            `json:"created"`
+	Details             map[string]string `json:"details"`
+	Displaytext         string            `json:"displaytext"`
+	Egressdefaultpolicy bool              `json:"egressdefaultpolicy"`
+	Forvpc              bool              `json:"forvpc"`
+	Guestiptype         string            `json:"guestiptype"`
+	Id                  string            `json:"id"`
+	Isdefault           bool              `json:"isdefault"`
+	Ispersistent        bool              `json:"ispersistent"`
+	Maxconnections      int               `json:"maxconnections"`
+	Name                string            `json:"name"`
+	Networkrate         int               `json:"networkrate"`
+	Service             []struct {
+		Capability []struct {
+			Canchooseservicecapability bool   `json:"canchooseservicecapability"`
+			Name                       string `json:"name"`
+			Value                      string `json:"value"`
+		} `json:"capability"`
+		Name     string `json:"name"`
+		Provider []struct {
+			Canenableindividualservice   bool     `json:"canenableindividualservice"`
+			Destinationphysicalnetworkid string   `json:"destinationphysicalnetworkid"`
+			Id                           string   `json:"id"`
+			Name                         string   `json:"name"`
+			Physicalnetworkid            string   `json:"physicalnetworkid"`
+			Servicelist                  []string `json:"servicelist"`
+			State                        string   `json:"state"`
+		} `json:"provider"`
+	} `json:"service"`
+	Serviceofferingid        string `json:"serviceofferingid"`
+	Specifyipranges          bool   `json:"specifyipranges"`
+	Specifyvlan              bool   `json:"specifyvlan"`
+	State                    string `json:"state"`
+	Supportsstrechedl2subnet bool   `json:"supportsstrechedl2subnet"`
+	Tags                     string `json:"tags"`
+	Traffictype              string `json:"traffictype"`
+}
+
+type DeleteNetworkOfferingParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeleteNetworkOfferingParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *DeleteNetworkOfferingParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new DeleteNetworkOfferingParams instance,
+// as then you are sure you have configured all required params
+func (s *NetworkOfferingService) NewDeleteNetworkOfferingParams(id string) *DeleteNetworkOfferingParams {
+	p := &DeleteNetworkOfferingParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Deletes a network offering.
+func (s *NetworkOfferingService) DeleteNetworkOffering(p *DeleteNetworkOfferingParams) (*DeleteNetworkOfferingResponse, error) {
+	resp, err := s.cs.newRequest("deleteNetworkOffering", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeleteNetworkOfferingResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type DeleteNetworkOfferingResponse struct {
+	Displaytext string `json:"displaytext"`
+	Success     string `json:"success"`
+}
+
+type ListNetworkOfferingsParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListNetworkOfferingsParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["availability"]; found {
+		u.Set("availability", v.(string))
+	}
+	if v, found := p.p["displaytext"]; found {
+		u.Set("displaytext", v.(string))
+	}
+	if v, found := p.p["forvpc"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("forvpc", vv)
+	}
+	if v, found := p.p["guestiptype"]; found {
+		u.Set("guestiptype", v.(string))
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["isdefault"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("isdefault", vv)
+	}
+	if v, found := p.p["istagged"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("istagged", vv)
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["networkid"]; found {
+		u.Set("networkid", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["sourcenatsupported"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("sourcenatsupported", vv)
+	}
+	if v, found := p.p["specifyipranges"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("specifyipranges", vv)
+	}
+	if v, found := p.p["specifyvlan"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("specifyvlan", vv)
+	}
+	if v, found := p.p["state"]; found {
+		u.Set("state", v.(string))
+	}
+	if v, found := p.p["supportedservices"]; found {
+		vv := strings.Join(v.([]string), ",")
+		u.Set("supportedservices", vv)
+	}
+	if v, found := p.p["tags"]; found {
+		u.Set("tags", v.(string))
+	}
+	if v, found := p.p["traffictype"]; found {
+		u.Set("traffictype", v.(string))
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *ListNetworkOfferingsParams) SetAvailability(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["availability"] = v
+	return
+}
+
+func (p *ListNetworkOfferingsParams) SetDisplaytext(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["displaytext"] = v
+	return
+}
+
+func (p *ListNetworkOfferingsParams) SetForvpc(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["forvpc"] = v
+	return
+}
+
+func (p *ListNetworkOfferingsParams) SetGuestiptype(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["guestiptype"] = v
+	return
+}
+
+func (p *ListNetworkOfferingsParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ListNetworkOfferingsParams) SetIsdefault(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isdefault"] = v
+	return
+}
+
+func (p *ListNetworkOfferingsParams) SetIstagged(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["istagged"] = v
+	return
+}
+
+func (p *ListNetworkOfferingsParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListNetworkOfferingsParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *ListNetworkOfferingsParams) SetNetworkid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["networkid"] = v
+	return
+}
+
+func (p *ListNetworkOfferingsParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListNetworkOfferingsParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListNetworkOfferingsParams) SetSourcenatsupported(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["sourcenatsupported"] = v
+	return
+}
+
+func (p *ListNetworkOfferingsParams) SetSpecifyipranges(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["specifyipranges"] = v
+	return
+}
+
+func (p *ListNetworkOfferingsParams) SetSpecifyvlan(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["specifyvlan"] = v
+	return
+}
+
+func (p *ListNetworkOfferingsParams) SetState(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["state"] = v
+	return
+}
+
+func (p *ListNetworkOfferingsParams) SetSupportedservices(v []string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["supportedservices"] = v
+	return
+}
+
+func (p *ListNetworkOfferingsParams) SetTags(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["tags"] = v
+	return
+}
+
+func (p *ListNetworkOfferingsParams) SetTraffictype(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["traffictype"] = v
+	return
+}
+
+func (p *ListNetworkOfferingsParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new ListNetworkOfferingsParams instance,
+// as then you are sure you have configured all required params
+func (s *NetworkOfferingService) NewListNetworkOfferingsParams() *ListNetworkOfferingsParams {
+	p := &ListNetworkOfferingsParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *NetworkOfferingService) GetNetworkOfferingID(name string, opts ...OptionFunc) (string, int, error) {
+	p := &ListNetworkOfferingsParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["name"] = name
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return "", -1, err
+		}
+	}
+
+	l, err := s.ListNetworkOfferings(p)
+	if err != nil {
+		return "", -1, err
+	}
+
+	if l.Count == 0 {
+		return "", l.Count, fmt.Errorf("No match found for %s: %+v", name, l)
+	}
+
+	if l.Count == 1 {
+		return l.NetworkOfferings[0].Id, l.Count, nil
+	}
+
+	if l.Count > 1 {
+		for _, v := range l.NetworkOfferings {
+			if v.Name == name {
+				return v.Id, l.Count, nil
+			}
+		}
+	}
+	return "", l.Count, fmt.Errorf("Could not find an exact match for %s: %+v", name, l)
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *NetworkOfferingService) GetNetworkOfferingByName(name string, opts ...OptionFunc) (*NetworkOffering, int, error) {
+	id, count, err := s.GetNetworkOfferingID(name, opts...)
+	if err != nil {
+		return nil, count, err
+	}
+
+	r, count, err := s.GetNetworkOfferingByID(id, opts...)
+	if err != nil {
+		return nil, count, err
+	}
+	return r, count, nil
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *NetworkOfferingService) GetNetworkOfferingByID(id string, opts ...OptionFunc) (*NetworkOffering, int, error) {
+	p := &ListNetworkOfferingsParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["id"] = id
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return nil, -1, err
+		}
+	}
+
+	l, err := s.ListNetworkOfferings(p)
+	if err != nil {
+		if strings.Contains(err.Error(), fmt.Sprintf(
+			"Invalid parameter id value=%s due to incorrect long value format, "+
+				"or entity does not exist", id)) {
+			return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
+		}
+		return nil, -1, err
+	}
+
+	if l.Count == 0 {
+		return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
+	}
+
+	if l.Count == 1 {
+		return l.NetworkOfferings[0], l.Count, nil
+	}
+	return nil, l.Count, fmt.Errorf("There is more then one result for NetworkOffering UUID: %s!", id)
+}
+
+// Lists all available network offerings.
+func (s *NetworkOfferingService) ListNetworkOfferings(p *ListNetworkOfferingsParams) (*ListNetworkOfferingsResponse, error) {
+	resp, err := s.cs.newRequest("listNetworkOfferings", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListNetworkOfferingsResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListNetworkOfferingsResponse struct {
+	Count            int                `json:"count"`
+	NetworkOfferings []*NetworkOffering `json:"networkoffering"`
+}
+
+type NetworkOffering struct {
+	Availability        string            `json:"availability"`
+	Conservemode        bool              `json:"conservemode"`
+	Created             string            `json:"created"`
+	Details             map[string]string `json:"details"`
+	Displaytext         string            `json:"displaytext"`
+	Egressdefaultpolicy bool              `json:"egressdefaultpolicy"`
+	Forvpc              bool              `json:"forvpc"`
+	Guestiptype         string            `json:"guestiptype"`
+	Id                  string            `json:"id"`
+	Isdefault           bool              `json:"isdefault"`
+	Ispersistent        bool              `json:"ispersistent"`
+	Maxconnections      int               `json:"maxconnections"`
+	Name                string            `json:"name"`
+	Networkrate         int               `json:"networkrate"`
+	Service             []struct {
+		Capability []struct {
+			Canchooseservicecapability bool   `json:"canchooseservicecapability"`
+			Name                       string `json:"name"`
+			Value                      string `json:"value"`
+		} `json:"capability"`
+		Name     string `json:"name"`
+		Provider []struct {
+			Canenableindividualservice   bool     `json:"canenableindividualservice"`
+			Destinationphysicalnetworkid string   `json:"destinationphysicalnetworkid"`
+			Id                           string   `json:"id"`
+			Name                         string   `json:"name"`
+			Physicalnetworkid            string   `json:"physicalnetworkid"`
+			Servicelist                  []string `json:"servicelist"`
+			State                        string   `json:"state"`
+		} `json:"provider"`
+	} `json:"service"`
+	Serviceofferingid        string `json:"serviceofferingid"`
+	Specifyipranges          bool   `json:"specifyipranges"`
+	Specifyvlan              bool   `json:"specifyvlan"`
+	State                    string `json:"state"`
+	Supportsstrechedl2subnet bool   `json:"supportsstrechedl2subnet"`
+	Tags                     string `json:"tags"`
+	Traffictype              string `json:"traffictype"`
+}
+
+type UpdateNetworkOfferingParams struct {
+	p map[string]interface{}
+}
+
+func (p *UpdateNetworkOfferingParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["availability"]; found {
+		u.Set("availability", v.(string))
+	}
+	if v, found := p.p["displaytext"]; found {
+		u.Set("displaytext", v.(string))
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["keepaliveenabled"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("keepaliveenabled", vv)
+	}
+	if v, found := p.p["maxconnections"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("maxconnections", vv)
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["sortkey"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("sortkey", vv)
+	}
+	if v, found := p.p["state"]; found {
+		u.Set("state", v.(string))
+	}
+	return u
+}
+
+func (p *UpdateNetworkOfferingParams) SetAvailability(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["availability"] = v
+	return
+}
+
+func (p *UpdateNetworkOfferingParams) SetDisplaytext(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["displaytext"] = v
+	return
+}
+
+func (p *UpdateNetworkOfferingParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *UpdateNetworkOfferingParams) SetKeepaliveenabled(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keepaliveenabled"] = v
+	return
+}
+
+func (p *UpdateNetworkOfferingParams) SetMaxconnections(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["maxconnections"] = v
+	return
+}
+
+func (p *UpdateNetworkOfferingParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *UpdateNetworkOfferingParams) SetSortkey(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["sortkey"] = v
+	return
+}
+
+func (p *UpdateNetworkOfferingParams) SetState(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["state"] = v
+	return
+}
+
+// You should always use this function to get a new UpdateNetworkOfferingParams instance,
+// as then you are sure you have configured all required params
+func (s *NetworkOfferingService) NewUpdateNetworkOfferingParams() *UpdateNetworkOfferingParams {
+	p := &UpdateNetworkOfferingParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// Updates a network offering.
+func (s *NetworkOfferingService) UpdateNetworkOffering(p *UpdateNetworkOfferingParams) (*UpdateNetworkOfferingResponse, error) {
+	resp, err := s.cs.newRequest("updateNetworkOffering", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r UpdateNetworkOfferingResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type UpdateNetworkOfferingResponse struct {
+	Availability        string            `json:"availability"`
+	Conservemode        bool              `json:"conservemode"`
+	Created             string            `json:"created"`
+	Details             map[string]string `json:"details"`
+	Displaytext         string            `json:"displaytext"`
+	Egressdefaultpolicy bool              `json:"egressdefaultpolicy"`
+	Forvpc              bool              `json:"forvpc"`
+	Guestiptype         string            `json:"guestiptype"`
+	Id                  string            `json:"id"`
+	Isdefault           bool              `json:"isdefault"`
+	Ispersistent        bool              `json:"ispersistent"`
+	Maxconnections      int               `json:"maxconnections"`
+	Name                string            `json:"name"`
+	Networkrate         int               `json:"networkrate"`
+	Service             []struct {
+		Capability []struct {
+			Canchooseservicecapability bool   `json:"canchooseservicecapability"`
+			Name                       string `json:"name"`
+			Value                      string `json:"value"`
+		} `json:"capability"`
+		Name     string `json:"name"`
+		Provider []struct {
+			Canenableindividualservice   bool     `json:"canenableindividualservice"`
+			Destinationphysicalnetworkid string   `json:"destinationphysicalnetworkid"`
+			Id                           string   `json:"id"`
+			Name                         string   `json:"name"`
+			Physicalnetworkid            string   `json:"physicalnetworkid"`
+			Servicelist                  []string `json:"servicelist"`
+			State                        string   `json:"state"`
+		} `json:"provider"`
+	} `json:"service"`
+	Serviceofferingid        string `json:"serviceofferingid"`
+	Specifyipranges          bool   `json:"specifyipranges"`
+	Specifyvlan              bool   `json:"specifyvlan"`
+	State                    string `json:"state"`
+	Supportsstrechedl2subnet bool   `json:"supportsstrechedl2subnet"`
+	Tags                     string `json:"tags"`
+	Traffictype              string `json:"traffictype"`
+}
diff --git a/vendor/github.com/xanzy/go-cloudstack/cloudstack/NetworkService.go b/vendor/github.com/xanzy/go-cloudstack/cloudstack/NetworkService.go
new file mode 100644
index 0000000..6129da1
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/cloudstack/NetworkService.go
@@ -0,0 +1,4627 @@
+//
+// Copyright 2018, Sander van Harmelen
+//
+// Licensed 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 cloudstack
+
+import (
+	"encoding/json"
+	"fmt"
+	"net/url"
+	"strconv"
+	"strings"
+)
+
+type AddNetworkServiceProviderParams struct {
+	p map[string]interface{}
+}
+
+func (p *AddNetworkServiceProviderParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["destinationphysicalnetworkid"]; found {
+		u.Set("destinationphysicalnetworkid", v.(string))
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["physicalnetworkid"]; found {
+		u.Set("physicalnetworkid", v.(string))
+	}
+	if v, found := p.p["servicelist"]; found {
+		vv := strings.Join(v.([]string), ",")
+		u.Set("servicelist", vv)
+	}
+	return u
+}
+
+func (p *AddNetworkServiceProviderParams) SetDestinationphysicalnetworkid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["destinationphysicalnetworkid"] = v
+	return
+}
+
+func (p *AddNetworkServiceProviderParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *AddNetworkServiceProviderParams) SetPhysicalnetworkid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["physicalnetworkid"] = v
+	return
+}
+
+func (p *AddNetworkServiceProviderParams) SetServicelist(v []string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["servicelist"] = v
+	return
+}
+
+// You should always use this function to get a new AddNetworkServiceProviderParams instance,
+// as then you are sure you have configured all required params
+func (s *NetworkService) NewAddNetworkServiceProviderParams(name string, physicalnetworkid string) *AddNetworkServiceProviderParams {
+	p := &AddNetworkServiceProviderParams{}
+	p.p = make(map[string]interface{})
+	p.p["name"] = name
+	p.p["physicalnetworkid"] = physicalnetworkid
+	return p
+}
+
+// Adds a network serviceProvider to a physical network
+func (s *NetworkService) AddNetworkServiceProvider(p *AddNetworkServiceProviderParams) (*AddNetworkServiceProviderResponse, error) {
+	resp, err := s.cs.newRequest("addNetworkServiceProvider", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r AddNetworkServiceProviderResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type AddNetworkServiceProviderResponse struct {
+	JobID                        string   `json:"jobid"`
+	Canenableindividualservice   bool     `json:"canenableindividualservice"`
+	Destinationphysicalnetworkid string   `json:"destinationphysicalnetworkid"`
+	Id                           string   `json:"id"`
+	Name                         string   `json:"name"`
+	Physicalnetworkid            string   `json:"physicalnetworkid"`
+	Servicelist                  []string `json:"servicelist"`
+	State                        string   `json:"state"`
+}
+
+type AddOpenDaylightControllerParams struct {
+	p map[string]interface{}
+}
+
+func (p *AddOpenDaylightControllerParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["password"]; found {
+		u.Set("password", v.(string))
+	}
+	if v, found := p.p["physicalnetworkid"]; found {
+		u.Set("physicalnetworkid", v.(string))
+	}
+	if v, found := p.p["url"]; found {
+		u.Set("url", v.(string))
+	}
+	if v, found := p.p["username"]; found {
+		u.Set("username", v.(string))
+	}
+	return u
+}
+
+func (p *AddOpenDaylightControllerParams) SetPassword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["password"] = v
+	return
+}
+
+func (p *AddOpenDaylightControllerParams) SetPhysicalnetworkid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["physicalnetworkid"] = v
+	return
+}
+
+func (p *AddOpenDaylightControllerParams) SetUrl(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["url"] = v
+	return
+}
+
+func (p *AddOpenDaylightControllerParams) SetUsername(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["username"] = v
+	return
+}
+
+// You should always use this function to get a new AddOpenDaylightControllerParams instance,
+// as then you are sure you have configured all required params
+func (s *NetworkService) NewAddOpenDaylightControllerParams(password string, physicalnetworkid string, url string, username string) *AddOpenDaylightControllerParams {
+	p := &AddOpenDaylightControllerParams{}
+	p.p = make(map[string]interface{})
+	p.p["password"] = password
+	p.p["physicalnetworkid"] = physicalnetworkid
+	p.p["url"] = url
+	p.p["username"] = username
+	return p
+}
+
+// Adds an OpenDyalight controler
+func (s *NetworkService) AddOpenDaylightController(p *AddOpenDaylightControllerParams) (*AddOpenDaylightControllerResponse, error) {
+	resp, err := s.cs.newRequest("addOpenDaylightController", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r AddOpenDaylightControllerResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type AddOpenDaylightControllerResponse struct {
+	JobID             string `json:"jobid"`
+	Id                string `json:"id"`
+	Name              string `json:"name"`
+	Physicalnetworkid string `json:"physicalnetworkid"`
+	Url               string `json:"url"`
+	Username          string `json:"username"`
+}
+
+type CreateNetworkParams struct {
+	p map[string]interface{}
+}
+
+func (p *CreateNetworkParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["aclid"]; found {
+		u.Set("aclid", v.(string))
+	}
+	if v, found := p.p["acltype"]; found {
+		u.Set("acltype", v.(string))
+	}
+	if v, found := p.p["displaynetwork"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("displaynetwork", vv)
+	}
+	if v, found := p.p["displaytext"]; found {
+		u.Set("displaytext", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["endip"]; found {
+		u.Set("endip", v.(string))
+	}
+	if v, found := p.p["endipv6"]; found {
+		u.Set("endipv6", v.(string))
+	}
+	if v, found := p.p["gateway"]; found {
+		u.Set("gateway", v.(string))
+	}
+	if v, found := p.p["ip6cidr"]; found {
+		u.Set("ip6cidr", v.(string))
+	}
+	if v, found := p.p["ip6gateway"]; found {
+		u.Set("ip6gateway", v.(string))
+	}
+	if v, found := p.p["isolatedpvlan"]; found {
+		u.Set("isolatedpvlan", v.(string))
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["netmask"]; found {
+		u.Set("netmask", v.(string))
+	}
+	if v, found := p.p["networkdomain"]; found {
+		u.Set("networkdomain", v.(string))
+	}
+	if v, found := p.p["networkofferingid"]; found {
+		u.Set("networkofferingid", v.(string))
+	}
+	if v, found := p.p["physicalnetworkid"]; found {
+		u.Set("physicalnetworkid", v.(string))
+	}
+	if v, found := p.p["projectid"]; found {
+		u.Set("projectid", v.(string))
+	}
+	if v, found := p.p["startip"]; found {
+		u.Set("startip", v.(string))
+	}
+	if v, found := p.p["startipv6"]; found {
+		u.Set("startipv6", v.(string))
+	}
+	if v, found := p.p["subdomainaccess"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("subdomainaccess", vv)
+	}
+	if v, found := p.p["vlan"]; found {
+		u.Set("vlan", v.(string))
+	}
+	if v, found := p.p["vpcid"]; found {
+		u.Set("vpcid", v.(string))
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *CreateNetworkParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *CreateNetworkParams) SetAclid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["aclid"] = v
+	return
+}
+
+func (p *CreateNetworkParams) SetAcltype(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["acltype"] = v
+	return
+}
+
+func (p *CreateNetworkParams) SetDisplaynetwork(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["displaynetwork"] = v
+	return
+}
+
+func (p *CreateNetworkParams) SetDisplaytext(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["displaytext"] = v
+	return
+}
+
+func (p *CreateNetworkParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *CreateNetworkParams) SetEndip(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["endip"] = v
+	return
+}
+
+func (p *CreateNetworkParams) SetEndipv6(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["endipv6"] = v
+	return
+}
+
+func (p *CreateNetworkParams) SetGateway(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["gateway"] = v
+	return
+}
+
+func (p *CreateNetworkParams) SetIp6cidr(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["ip6cidr"] = v
+	return
+}
+
+func (p *CreateNetworkParams) SetIp6gateway(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["ip6gateway"] = v
+	return
+}
+
+func (p *CreateNetworkParams) SetIsolatedpvlan(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isolatedpvlan"] = v
+	return
+}
+
+func (p *CreateNetworkParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *CreateNetworkParams) SetNetmask(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["netmask"] = v
+	return
+}
+
+func (p *CreateNetworkParams) SetNetworkdomain(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["networkdomain"] = v
+	return
+}
+
+func (p *CreateNetworkParams) SetNetworkofferingid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["networkofferingid"] = v
+	return
+}
+
+func (p *CreateNetworkParams) SetPhysicalnetworkid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["physicalnetworkid"] = v
+	return
+}
+
+func (p *CreateNetworkParams) SetProjectid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectid"] = v
+	return
+}
+
+func (p *CreateNetworkParams) SetStartip(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["startip"] = v
+	return
+}
+
+func (p *CreateNetworkParams) SetStartipv6(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["startipv6"] = v
+	return
+}
+
+func (p *CreateNetworkParams) SetSubdomainaccess(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["subdomainaccess"] = v
+	return
+}
+
+func (p *CreateNetworkParams) SetVlan(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["vlan"] = v
+	return
+}
+
+func (p *CreateNetworkParams) SetVpcid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["vpcid"] = v
+	return
+}
+
+func (p *CreateNetworkParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new CreateNetworkParams instance,
+// as then you are sure you have configured all required params
+func (s *NetworkService) NewCreateNetworkParams(displaytext string, name string, networkofferingid string, zoneid string) *CreateNetworkParams {
+	p := &CreateNetworkParams{}
+	p.p = make(map[string]interface{})
+	p.p["displaytext"] = displaytext
+	p.p["name"] = name
+	p.p["networkofferingid"] = networkofferingid
+	p.p["zoneid"] = zoneid
+	return p
+}
+
+// Creates a network
+func (s *NetworkService) CreateNetwork(p *CreateNetworkParams) (*CreateNetworkResponse, error) {
+	resp, err := s.cs.newRequest("createNetwork", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	if resp, err = getRawValue(resp); err != nil {
+		return nil, err
+	}
+
+	var r CreateNetworkResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type CreateNetworkResponse struct {
+	Account                     string `json:"account"`
+	Aclid                       string `json:"aclid"`
+	Acltype                     string `json:"acltype"`
+	Broadcastdomaintype         string `json:"broadcastdomaintype"`
+	Broadcasturi                string `json:"broadcasturi"`
+	Canusefordeploy             bool   `json:"canusefordeploy"`
+	Cidr                        string `json:"cidr"`
+	Displaynetwork              bool   `json:"displaynetwork"`
+	Displaytext                 string `json:"displaytext"`
+	Dns1                        string `json:"dns1"`
+	Dns2                        string `json:"dns2"`
+	Domain                      string `json:"domain"`
+	Domainid                    string `json:"domainid"`
+	Gateway                     string `json:"gateway"`
+	Id                          string `json:"id"`
+	Ip6cidr                     string `json:"ip6cidr"`
+	Ip6gateway                  string `json:"ip6gateway"`
+	Isdefault                   bool   `json:"isdefault"`
+	Ispersistent                bool   `json:"ispersistent"`
+	Issystem                    bool   `json:"issystem"`
+	Name                        string `json:"name"`
+	Netmask                     string `json:"netmask"`
+	Networkcidr                 string `json:"networkcidr"`
+	Networkdomain               string `json:"networkdomain"`
+	Networkofferingavailability string `json:"networkofferingavailability"`
+	Networkofferingconservemode bool   `json:"networkofferingconservemode"`
+	Networkofferingdisplaytext  string `json:"networkofferingdisplaytext"`
+	Networkofferingid           string `json:"networkofferingid"`
+	Networkofferingname         string `json:"networkofferingname"`
+	Physicalnetworkid           string `json:"physicalnetworkid"`
+	Project                     string `json:"project"`
+	Projectid                   string `json:"projectid"`
+	Related                     string `json:"related"`
+	Reservediprange             string `json:"reservediprange"`
+	Restartrequired             bool   `json:"restartrequired"`
+	Service                     []struct {
+		Capability []struct {
+			Canchooseservicecapability bool   `json:"canchooseservicecapability"`
+			Name                       string `json:"name"`
+			Value                      string `json:"value"`
+		} `json:"capability"`
+		Name     string `json:"name"`
+		Provider []struct {
+			Canenableindividualservice   bool     `json:"canenableindividualservice"`
+			Destinationphysicalnetworkid string   `json:"destinationphysicalnetworkid"`
+			Id                           string   `json:"id"`
+			Name                         string   `json:"name"`
+			Physicalnetworkid            string   `json:"physicalnetworkid"`
+			Servicelist                  []string `json:"servicelist"`
+			State                        string   `json:"state"`
+		} `json:"provider"`
+	} `json:"service"`
+	Specifyipranges  bool   `json:"specifyipranges"`
+	State            string `json:"state"`
+	Strechedl2subnet bool   `json:"strechedl2subnet"`
+	Subdomainaccess  bool   `json:"subdomainaccess"`
+	Tags             []struct {
+		Account      string `json:"account"`
+		Customer     string `json:"customer"`
+		Domain       string `json:"domain"`
+		Domainid     string `json:"domainid"`
+		Key          string `json:"key"`
+		Project      string `json:"project"`
+		Projectid    string `json:"projectid"`
+		Resourceid   string `json:"resourceid"`
+		Resourcetype string `json:"resourcetype"`
+		Value        string `json:"value"`
+	} `json:"tags"`
+	Traffictype       string        `json:"traffictype"`
+	Type              string        `json:"type"`
+	Vlan              string        `json:"vlan"`
+	Vpcid             string        `json:"vpcid"`
+	Zoneid            string        `json:"zoneid"`
+	Zonename          string        `json:"zonename"`
+	Zonesnetworkspans []interface{} `json:"zonesnetworkspans"`
+}
+
+type CreatePhysicalNetworkParams struct {
+	p map[string]interface{}
+}
+
+func (p *CreatePhysicalNetworkParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["broadcastdomainrange"]; found {
+		u.Set("broadcastdomainrange", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["isolationmethods"]; found {
+		vv := strings.Join(v.([]string), ",")
+		u.Set("isolationmethods", vv)
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["networkspeed"]; found {
+		u.Set("networkspeed", v.(string))
+	}
+	if v, found := p.p["tags"]; found {
+		vv := strings.Join(v.([]string), ",")
+		u.Set("tags", vv)
+	}
+	if v, found := p.p["vlan"]; found {
+		u.Set("vlan", v.(string))
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *CreatePhysicalNetworkParams) SetBroadcastdomainrange(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["broadcastdomainrange"] = v
+	return
+}
+
+func (p *CreatePhysicalNetworkParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *CreatePhysicalNetworkParams) SetIsolationmethods(v []string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isolationmethods"] = v
+	return
+}
+
+func (p *CreatePhysicalNetworkParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *CreatePhysicalNetworkParams) SetNetworkspeed(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["networkspeed"] = v
+	return
+}
+
+func (p *CreatePhysicalNetworkParams) SetTags(v []string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["tags"] = v
+	return
+}
+
+func (p *CreatePhysicalNetworkParams) SetVlan(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["vlan"] = v
+	return
+}
+
+func (p *CreatePhysicalNetworkParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new CreatePhysicalNetworkParams instance,
+// as then you are sure you have configured all required params
+func (s *NetworkService) NewCreatePhysicalNetworkParams(name string, zoneid string) *CreatePhysicalNetworkParams {
+	p := &CreatePhysicalNetworkParams{}
+	p.p = make(map[string]interface{})
+	p.p["name"] = name
+	p.p["zoneid"] = zoneid
+	return p
+}
+
+// Creates a physical network
+func (s *NetworkService) CreatePhysicalNetwork(p *CreatePhysicalNetworkParams) (*CreatePhysicalNetworkResponse, error) {
+	resp, err := s.cs.newRequest("createPhysicalNetwork", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r CreatePhysicalNetworkResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type CreatePhysicalNetworkResponse struct {
+	JobID                string `json:"jobid"`
+	Broadcastdomainrange string `json:"broadcastdomainrange"`
+	Domainid             string `json:"domainid"`
+	Id                   string `json:"id"`
+	Isolationmethods     string `json:"isolationmethods"`
+	Name                 string `json:"name"`
+	Networkspeed         string `json:"networkspeed"`
+	State                string `json:"state"`
+	Tags                 string `json:"tags"`
+	Vlan                 string `json:"vlan"`
+	Zoneid               string `json:"zoneid"`
+}
+
+type CreateServiceInstanceParams struct {
+	p map[string]interface{}
+}
+
+func (p *CreateServiceInstanceParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["leftnetworkid"]; found {
+		u.Set("leftnetworkid", v.(string))
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["projectid"]; found {
+		u.Set("projectid", v.(string))
+	}
+	if v, found := p.p["rightnetworkid"]; found {
+		u.Set("rightnetworkid", v.(string))
+	}
+	if v, found := p.p["serviceofferingid"]; found {
+		u.Set("serviceofferingid", v.(string))
+	}
+	if v, found := p.p["templateid"]; found {
+		u.Set("templateid", v.(string))
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *CreateServiceInstanceParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *CreateServiceInstanceParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *CreateServiceInstanceParams) SetLeftnetworkid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["leftnetworkid"] = v
+	return
+}
+
+func (p *CreateServiceInstanceParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *CreateServiceInstanceParams) SetProjectid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectid"] = v
+	return
+}
+
+func (p *CreateServiceInstanceParams) SetRightnetworkid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["rightnetworkid"] = v
+	return
+}
+
+func (p *CreateServiceInstanceParams) SetServiceofferingid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["serviceofferingid"] = v
+	return
+}
+
+func (p *CreateServiceInstanceParams) SetTemplateid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["templateid"] = v
+	return
+}
+
+func (p *CreateServiceInstanceParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new CreateServiceInstanceParams instance,
+// as then you are sure you have configured all required params
+func (s *NetworkService) NewCreateServiceInstanceParams(leftnetworkid string, name string, rightnetworkid string, serviceofferingid string, templateid string, zoneid string) *CreateServiceInstanceParams {
+	p := &CreateServiceInstanceParams{}
+	p.p = make(map[string]interface{})
+	p.p["leftnetworkid"] = leftnetworkid
+	p.p["name"] = name
+	p.p["rightnetworkid"] = rightnetworkid
+	p.p["serviceofferingid"] = serviceofferingid
+	p.p["templateid"] = templateid
+	p.p["zoneid"] = zoneid
+	return p
+}
+
+// Creates a system virtual-machine that implements network services
+func (s *NetworkService) CreateServiceInstance(p *CreateServiceInstanceParams) (*CreateServiceInstanceResponse, error) {
+	resp, err := s.cs.newRequest("createServiceInstance", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r CreateServiceInstanceResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type CreateServiceInstanceResponse struct {
+	JobID       string `json:"jobid"`
+	Account     string `json:"account"`
+	Displayname string `json:"displayname"`
+	Domain      string `json:"domain"`
+	Domainid    string `json:"domainid"`
+	Id          string `json:"id"`
+	Name        string `json:"name"`
+	Project     string `json:"project"`
+	Projectid   string `json:"projectid"`
+}
+
+type CreateStorageNetworkIpRangeParams struct {
+	p map[string]interface{}
+}
+
+func (p *CreateStorageNetworkIpRangeParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["endip"]; found {
+		u.Set("endip", v.(string))
+	}
+	if v, found := p.p["gateway"]; found {
+		u.Set("gateway", v.(string))
+	}
+	if v, found := p.p["netmask"]; found {
+		u.Set("netmask", v.(string))
+	}
+	if v, found := p.p["podid"]; found {
+		u.Set("podid", v.(string))
+	}
+	if v, found := p.p["startip"]; found {
+		u.Set("startip", v.(string))
+	}
+	if v, found := p.p["vlan"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("vlan", vv)
+	}
+	return u
+}
+
+func (p *CreateStorageNetworkIpRangeParams) SetEndip(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["endip"] = v
+	return
+}
+
+func (p *CreateStorageNetworkIpRangeParams) SetGateway(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["gateway"] = v
+	return
+}
+
+func (p *CreateStorageNetworkIpRangeParams) SetNetmask(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["netmask"] = v
+	return
+}
+
+func (p *CreateStorageNetworkIpRangeParams) SetPodid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["podid"] = v
+	return
+}
+
+func (p *CreateStorageNetworkIpRangeParams) SetStartip(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["startip"] = v
+	return
+}
+
+func (p *CreateStorageNetworkIpRangeParams) SetVlan(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["vlan"] = v
+	return
+}
+
+// You should always use this function to get a new CreateStorageNetworkIpRangeParams instance,
+// as then you are sure you have configured all required params
+func (s *NetworkService) NewCreateStorageNetworkIpRangeParams(gateway string, netmask string, podid string, startip string) *CreateStorageNetworkIpRangeParams {
+	p := &CreateStorageNetworkIpRangeParams{}
+	p.p = make(map[string]interface{})
+	p.p["gateway"] = gateway
+	p.p["netmask"] = netmask
+	p.p["podid"] = podid
+	p.p["startip"] = startip
+	return p
+}
+
+// Creates a Storage network IP range.
+func (s *NetworkService) CreateStorageNetworkIpRange(p *CreateStorageNetworkIpRangeParams) (*CreateStorageNetworkIpRangeResponse, error) {
+	resp, err := s.cs.newRequest("createStorageNetworkIpRange", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r CreateStorageNetworkIpRangeResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type CreateStorageNetworkIpRangeResponse struct {
+	JobID     string `json:"jobid"`
+	Endip     string `json:"endip"`
+	Gateway   string `json:"gateway"`
+	Id        string `json:"id"`
+	Netmask   string `json:"netmask"`
+	Networkid string `json:"networkid"`
+	Podid     string `json:"podid"`
+	Startip   string `json:"startip"`
+	Vlan      int    `json:"vlan"`
+	Zoneid    string `json:"zoneid"`
+}
+
+type DedicatePublicIpRangeParams struct {
+	p map[string]interface{}
+}
+
+func (p *DedicatePublicIpRangeParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["projectid"]; found {
+		u.Set("projectid", v.(string))
+	}
+	return u
+}
+
+func (p *DedicatePublicIpRangeParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *DedicatePublicIpRangeParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *DedicatePublicIpRangeParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *DedicatePublicIpRangeParams) SetProjectid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectid"] = v
+	return
+}
+
+// You should always use this function to get a new DedicatePublicIpRangeParams instance,
+// as then you are sure you have configured all required params
+func (s *NetworkService) NewDedicatePublicIpRangeParams(domainid string, id string) *DedicatePublicIpRangeParams {
+	p := &DedicatePublicIpRangeParams{}
+	p.p = make(map[string]interface{})
+	p.p["domainid"] = domainid
+	p.p["id"] = id
+	return p
+}
+
+// Dedicates a Public IP range to an account
+func (s *NetworkService) DedicatePublicIpRange(p *DedicatePublicIpRangeParams) (*DedicatePublicIpRangeResponse, error) {
+	resp, err := s.cs.newRequest("dedicatePublicIpRange", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DedicatePublicIpRangeResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type DedicatePublicIpRangeResponse struct {
+	Account           string `json:"account"`
+	Description       string `json:"description"`
+	Domain            string `json:"domain"`
+	Domainid          string `json:"domainid"`
+	Endip             string `json:"endip"`
+	Endipv6           string `json:"endipv6"`
+	Forvirtualnetwork bool   `json:"forvirtualnetwork"`
+	Gateway           string `json:"gateway"`
+	Id                string `json:"id"`
+	Ip6cidr           string `json:"ip6cidr"`
+	Ip6gateway        string `json:"ip6gateway"`
+	Netmask           string `json:"netmask"`
+	Networkid         string `json:"networkid"`
+	Physicalnetworkid string `json:"physicalnetworkid"`
+	Podid             string `json:"podid"`
+	Podname           string `json:"podname"`
+	Project           string `json:"project"`
+	Projectid         string `json:"projectid"`
+	Startip           string `json:"startip"`
+	Startipv6         string `json:"startipv6"`
+	Vlan              string `json:"vlan"`
+	Zoneid            string `json:"zoneid"`
+}
+
+type DeleteNetworkParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeleteNetworkParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["forced"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("forced", vv)
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *DeleteNetworkParams) SetForced(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["forced"] = v
+	return
+}
+
+func (p *DeleteNetworkParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new DeleteNetworkParams instance,
+// as then you are sure you have configured all required params
+func (s *NetworkService) NewDeleteNetworkParams(id string) *DeleteNetworkParams {
+	p := &DeleteNetworkParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Deletes a network
+func (s *NetworkService) DeleteNetwork(p *DeleteNetworkParams) (*DeleteNetworkResponse, error) {
+	resp, err := s.cs.newRequest("deleteNetwork", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeleteNetworkResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type DeleteNetworkResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
+
+type DeleteNetworkServiceProviderParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeleteNetworkServiceProviderParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *DeleteNetworkServiceProviderParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new DeleteNetworkServiceProviderParams instance,
+// as then you are sure you have configured all required params
+func (s *NetworkService) NewDeleteNetworkServiceProviderParams(id string) *DeleteNetworkServiceProviderParams {
+	p := &DeleteNetworkServiceProviderParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Deletes a Network Service Provider.
+func (s *NetworkService) DeleteNetworkServiceProvider(p *DeleteNetworkServiceProviderParams) (*DeleteNetworkServiceProviderResponse, error) {
+	resp, err := s.cs.newRequest("deleteNetworkServiceProvider", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeleteNetworkServiceProviderResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type DeleteNetworkServiceProviderResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
+
+type DeleteOpenDaylightControllerParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeleteOpenDaylightControllerParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *DeleteOpenDaylightControllerParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new DeleteOpenDaylightControllerParams instance,
+// as then you are sure you have configured all required params
+func (s *NetworkService) NewDeleteOpenDaylightControllerParams(id string) *DeleteOpenDaylightControllerParams {
+	p := &DeleteOpenDaylightControllerParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Removes an OpenDyalight controler
+func (s *NetworkService) DeleteOpenDaylightController(p *DeleteOpenDaylightControllerParams) (*DeleteOpenDaylightControllerResponse, error) {
+	resp, err := s.cs.newRequest("deleteOpenDaylightController", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeleteOpenDaylightControllerResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type DeleteOpenDaylightControllerResponse struct {
+	JobID             string `json:"jobid"`
+	Id                string `json:"id"`
+	Name              string `json:"name"`
+	Physicalnetworkid string `json:"physicalnetworkid"`
+	Url               string `json:"url"`
+	Username          string `json:"username"`
+}
+
+type DeletePhysicalNetworkParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeletePhysicalNetworkParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *DeletePhysicalNetworkParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new DeletePhysicalNetworkParams instance,
+// as then you are sure you have configured all required params
+func (s *NetworkService) NewDeletePhysicalNetworkParams(id string) *DeletePhysicalNetworkParams {
+	p := &DeletePhysicalNetworkParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Deletes a Physical Network.
+func (s *NetworkService) DeletePhysicalNetwork(p *DeletePhysicalNetworkParams) (*DeletePhysicalNetworkResponse, error) {
+	resp, err := s.cs.newRequest("deletePhysicalNetwork", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeletePhysicalNetworkResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type DeletePhysicalNetworkResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
+
+type DeleteStorageNetworkIpRangeParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeleteStorageNetworkIpRangeParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *DeleteStorageNetworkIpRangeParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new DeleteStorageNetworkIpRangeParams instance,
+// as then you are sure you have configured all required params
+func (s *NetworkService) NewDeleteStorageNetworkIpRangeParams(id string) *DeleteStorageNetworkIpRangeParams {
+	p := &DeleteStorageNetworkIpRangeParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Deletes a storage network IP Range.
+func (s *NetworkService) DeleteStorageNetworkIpRange(p *DeleteStorageNetworkIpRangeParams) (*DeleteStorageNetworkIpRangeResponse, error) {
+	resp, err := s.cs.newRequest("deleteStorageNetworkIpRange", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeleteStorageNetworkIpRangeResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type DeleteStorageNetworkIpRangeResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
+
+type ListF5LoadBalancerNetworksParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListF5LoadBalancerNetworksParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["lbdeviceid"]; found {
+		u.Set("lbdeviceid", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	return u
+}
+
+func (p *ListF5LoadBalancerNetworksParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListF5LoadBalancerNetworksParams) SetLbdeviceid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["lbdeviceid"] = v
+	return
+}
+
+func (p *ListF5LoadBalancerNetworksParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListF5LoadBalancerNetworksParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+// You should always use this function to get a new ListF5LoadBalancerNetworksParams instance,
+// as then you are sure you have configured all required params
+func (s *NetworkService) NewListF5LoadBalancerNetworksParams(lbdeviceid string) *ListF5LoadBalancerNetworksParams {
+	p := &ListF5LoadBalancerNetworksParams{}
+	p.p = make(map[string]interface{})
+	p.p["lbdeviceid"] = lbdeviceid
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *NetworkService) GetF5LoadBalancerNetworkID(keyword string, lbdeviceid string, opts ...OptionFunc) (string, int, error) {
+	p := &ListF5LoadBalancerNetworksParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["keyword"] = keyword
+	p.p["lbdeviceid"] = lbdeviceid
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return "", -1, err
+		}
+	}
+
+	l, err := s.ListF5LoadBalancerNetworks(p)
+	if err != nil {
+		return "", -1, err
+	}
+
+	if l.Count == 0 {
+		return "", l.Count, fmt.Errorf("No match found for %s: %+v", keyword, l)
+	}
+
+	if l.Count == 1 {
+		return l.F5LoadBalancerNetworks[0].Id, l.Count, nil
+	}
+
+	if l.Count > 1 {
+		for _, v := range l.F5LoadBalancerNetworks {
+			if v.Name == keyword {
+				return v.Id, l.Count, nil
+			}
+		}
+	}
+	return "", l.Count, fmt.Errorf("Could not find an exact match for %s: %+v", keyword, l)
+}
+
+// lists network that are using a F5 load balancer device
+func (s *NetworkService) ListF5LoadBalancerNetworks(p *ListF5LoadBalancerNetworksParams) (*ListF5LoadBalancerNetworksResponse, error) {
+	resp, err := s.cs.newRequest("listF5LoadBalancerNetworks", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListF5LoadBalancerNetworksResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListF5LoadBalancerNetworksResponse struct {
+	Count                  int                      `json:"count"`
+	F5LoadBalancerNetworks []*F5LoadBalancerNetwork `json:"f5loadbalancernetwork"`
+}
+
+type F5LoadBalancerNetwork struct {
+	Account                     string `json:"account"`
+	Aclid                       string `json:"aclid"`
+	Acltype                     string `json:"acltype"`
+	Broadcastdomaintype         string `json:"broadcastdomaintype"`
+	Broadcasturi                string `json:"broadcasturi"`
+	Canusefordeploy             bool   `json:"canusefordeploy"`
+	Cidr                        string `json:"cidr"`
+	Displaynetwork              bool   `json:"displaynetwork"`
+	Displaytext                 string `json:"displaytext"`
+	Dns1                        string `json:"dns1"`
+	Dns2                        string `json:"dns2"`
+	Domain                      string `json:"domain"`
+	Domainid                    string `json:"domainid"`
+	Gateway                     string `json:"gateway"`
+	Id                          string `json:"id"`
+	Ip6cidr                     string `json:"ip6cidr"`
+	Ip6gateway                  string `json:"ip6gateway"`
+	Isdefault                   bool   `json:"isdefault"`
+	Ispersistent                bool   `json:"ispersistent"`
+	Issystem                    bool   `json:"issystem"`
+	Name                        string `json:"name"`
+	Netmask                     string `json:"netmask"`
+	Networkcidr                 string `json:"networkcidr"`
+	Networkdomain               string `json:"networkdomain"`
+	Networkofferingavailability string `json:"networkofferingavailability"`
+	Networkofferingconservemode bool   `json:"networkofferingconservemode"`
+	Networkofferingdisplaytext  string `json:"networkofferingdisplaytext"`
+	Networkofferingid           string `json:"networkofferingid"`
+	Networkofferingname         string `json:"networkofferingname"`
+	Physicalnetworkid           string `json:"physicalnetworkid"`
+	Project                     string `json:"project"`
+	Projectid                   string `json:"projectid"`
+	Related                     string `json:"related"`
+	Reservediprange             string `json:"reservediprange"`
+	Restartrequired             bool   `json:"restartrequired"`
+	Service                     []struct {
+		Capability []struct {
+			Canchooseservicecapability bool   `json:"canchooseservicecapability"`
+			Name                       string `json:"name"`
+			Value                      string `json:"value"`
+		} `json:"capability"`
+		Name     string `json:"name"`
+		Provider []struct {
+			Canenableindividualservice   bool     `json:"canenableindividualservice"`
+			Destinationphysicalnetworkid string   `json:"destinationphysicalnetworkid"`
+			Id                           string   `json:"id"`
+			Name                         string   `json:"name"`
+			Physicalnetworkid            string   `json:"physicalnetworkid"`
+			Servicelist                  []string `json:"servicelist"`
+			State                        string   `json:"state"`
+		} `json:"provider"`
+	} `json:"service"`
+	Specifyipranges  bool   `json:"specifyipranges"`
+	State            string `json:"state"`
+	Strechedl2subnet bool   `json:"strechedl2subnet"`
+	Subdomainaccess  bool   `json:"subdomainaccess"`
+	Tags             []struct {
+		Account      string `json:"account"`
+		Customer     string `json:"customer"`
+		Domain       string `json:"domain"`
+		Domainid     string `json:"domainid"`
+		Key          string `json:"key"`
+		Project      string `json:"project"`
+		Projectid    string `json:"projectid"`
+		Resourceid   string `json:"resourceid"`
+		Resourcetype string `json:"resourcetype"`
+		Value        string `json:"value"`
+	} `json:"tags"`
+	Traffictype       string        `json:"traffictype"`
+	Type              string        `json:"type"`
+	Vlan              string        `json:"vlan"`
+	Vpcid             string        `json:"vpcid"`
+	Zoneid            string        `json:"zoneid"`
+	Zonename          string        `json:"zonename"`
+	Zonesnetworkspans []interface{} `json:"zonesnetworkspans"`
+}
+
+type ListNetscalerLoadBalancerNetworksParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListNetscalerLoadBalancerNetworksParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["lbdeviceid"]; found {
+		u.Set("lbdeviceid", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	return u
+}
+
+func (p *ListNetscalerLoadBalancerNetworksParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListNetscalerLoadBalancerNetworksParams) SetLbdeviceid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["lbdeviceid"] = v
+	return
+}
+
+func (p *ListNetscalerLoadBalancerNetworksParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListNetscalerLoadBalancerNetworksParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+// You should always use this function to get a new ListNetscalerLoadBalancerNetworksParams instance,
+// as then you are sure you have configured all required params
+func (s *NetworkService) NewListNetscalerLoadBalancerNetworksParams(lbdeviceid string) *ListNetscalerLoadBalancerNetworksParams {
+	p := &ListNetscalerLoadBalancerNetworksParams{}
+	p.p = make(map[string]interface{})
+	p.p["lbdeviceid"] = lbdeviceid
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *NetworkService) GetNetscalerLoadBalancerNetworkID(keyword string, lbdeviceid string, opts ...OptionFunc) (string, int, error) {
+	p := &ListNetscalerLoadBalancerNetworksParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["keyword"] = keyword
+	p.p["lbdeviceid"] = lbdeviceid
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return "", -1, err
+		}
+	}
+
+	l, err := s.ListNetscalerLoadBalancerNetworks(p)
+	if err != nil {
+		return "", -1, err
+	}
+
+	if l.Count == 0 {
+		return "", l.Count, fmt.Errorf("No match found for %s: %+v", keyword, l)
+	}
+
+	if l.Count == 1 {
+		return l.NetscalerLoadBalancerNetworks[0].Id, l.Count, nil
+	}
+
+	if l.Count > 1 {
+		for _, v := range l.NetscalerLoadBalancerNetworks {
+			if v.Name == keyword {
+				return v.Id, l.Count, nil
+			}
+		}
+	}
+	return "", l.Count, fmt.Errorf("Could not find an exact match for %s: %+v", keyword, l)
+}
+
+// lists network that are using a netscaler load balancer device
+func (s *NetworkService) ListNetscalerLoadBalancerNetworks(p *ListNetscalerLoadBalancerNetworksParams) (*ListNetscalerLoadBalancerNetworksResponse, error) {
+	resp, err := s.cs.newRequest("listNetscalerLoadBalancerNetworks", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListNetscalerLoadBalancerNetworksResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListNetscalerLoadBalancerNetworksResponse struct {
+	Count                         int                             `json:"count"`
+	NetscalerLoadBalancerNetworks []*NetscalerLoadBalancerNetwork `json:"netscalerloadbalancernetwork"`
+}
+
+type NetscalerLoadBalancerNetwork struct {
+	Account                     string `json:"account"`
+	Aclid                       string `json:"aclid"`
+	Acltype                     string `json:"acltype"`
+	Broadcastdomaintype         string `json:"broadcastdomaintype"`
+	Broadcasturi                string `json:"broadcasturi"`
+	Canusefordeploy             bool   `json:"canusefordeploy"`
+	Cidr                        string `json:"cidr"`
+	Displaynetwork              bool   `json:"displaynetwork"`
+	Displaytext                 string `json:"displaytext"`
+	Dns1                        string `json:"dns1"`
+	Dns2                        string `json:"dns2"`
+	Domain                      string `json:"domain"`
+	Domainid                    string `json:"domainid"`
+	Gateway                     string `json:"gateway"`
+	Id                          string `json:"id"`
+	Ip6cidr                     string `json:"ip6cidr"`
+	Ip6gateway                  string `json:"ip6gateway"`
+	Isdefault                   bool   `json:"isdefault"`
+	Ispersistent                bool   `json:"ispersistent"`
+	Issystem                    bool   `json:"issystem"`
+	Name                        string `json:"name"`
+	Netmask                     string `json:"netmask"`
+	Networkcidr                 string `json:"networkcidr"`
+	Networkdomain               string `json:"networkdomain"`
+	Networkofferingavailability string `json:"networkofferingavailability"`
+	Networkofferingconservemode bool   `json:"networkofferingconservemode"`
+	Networkofferingdisplaytext  string `json:"networkofferingdisplaytext"`
+	Networkofferingid           string `json:"networkofferingid"`
+	Networkofferingname         string `json:"networkofferingname"`
+	Physicalnetworkid           string `json:"physicalnetworkid"`
+	Project                     string `json:"project"`
+	Projectid                   string `json:"projectid"`
+	Related                     string `json:"related"`
+	Reservediprange             string `json:"reservediprange"`
+	Restartrequired             bool   `json:"restartrequired"`
+	Service                     []struct {
+		Capability []struct {
+			Canchooseservicecapability bool   `json:"canchooseservicecapability"`
+			Name                       string `json:"name"`
+			Value                      string `json:"value"`
+		} `json:"capability"`
+		Name     string `json:"name"`
+		Provider []struct {
+			Canenableindividualservice   bool     `json:"canenableindividualservice"`
+			Destinationphysicalnetworkid string   `json:"destinationphysicalnetworkid"`
+			Id                           string   `json:"id"`
+			Name                         string   `json:"name"`
+			Physicalnetworkid            string   `json:"physicalnetworkid"`
+			Servicelist                  []string `json:"servicelist"`
+			State                        string   `json:"state"`
+		} `json:"provider"`
+	} `json:"service"`
+	Specifyipranges  bool   `json:"specifyipranges"`
+	State            string `json:"state"`
+	Strechedl2subnet bool   `json:"strechedl2subnet"`
+	Subdomainaccess  bool   `json:"subdomainaccess"`
+	Tags             []struct {
+		Account      string `json:"account"`
+		Customer     string `json:"customer"`
+		Domain       string `json:"domain"`
+		Domainid     string `json:"domainid"`
+		Key          string `json:"key"`
+		Project      string `json:"project"`
+		Projectid    string `json:"projectid"`
+		Resourceid   string `json:"resourceid"`
+		Resourcetype string `json:"resourcetype"`
+		Value        string `json:"value"`
+	} `json:"tags"`
+	Traffictype       string        `json:"traffictype"`
+	Type              string        `json:"type"`
+	Vlan              string        `json:"vlan"`
+	Vpcid             string        `json:"vpcid"`
+	Zoneid            string        `json:"zoneid"`
+	Zonename          string        `json:"zonename"`
+	Zonesnetworkspans []interface{} `json:"zonesnetworkspans"`
+}
+
+type ListNetworkIsolationMethodsParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListNetworkIsolationMethodsParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	return u
+}
+
+func (p *ListNetworkIsolationMethodsParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListNetworkIsolationMethodsParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListNetworkIsolationMethodsParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+// You should always use this function to get a new ListNetworkIsolationMethodsParams instance,
+// as then you are sure you have configured all required params
+func (s *NetworkService) NewListNetworkIsolationMethodsParams() *ListNetworkIsolationMethodsParams {
+	p := &ListNetworkIsolationMethodsParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// Lists supported methods of network isolation
+func (s *NetworkService) ListNetworkIsolationMethods(p *ListNetworkIsolationMethodsParams) (*ListNetworkIsolationMethodsResponse, error) {
+	resp, err := s.cs.newRequest("listNetworkIsolationMethods", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListNetworkIsolationMethodsResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListNetworkIsolationMethodsResponse struct {
+	Count                   int                       `json:"count"`
+	NetworkIsolationMethods []*NetworkIsolationMethod `json:"networkisolationmethod"`
+}
+
+type NetworkIsolationMethod struct {
+	Name string `json:"name"`
+}
+
+type ListNetworkServiceProvidersParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListNetworkServiceProvidersParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["physicalnetworkid"]; found {
+		u.Set("physicalnetworkid", v.(string))
+	}
+	if v, found := p.p["state"]; found {
+		u.Set("state", v.(string))
+	}
+	return u
+}
+
+func (p *ListNetworkServiceProvidersParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListNetworkServiceProvidersParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *ListNetworkServiceProvidersParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListNetworkServiceProvidersParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListNetworkServiceProvidersParams) SetPhysicalnetworkid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["physicalnetworkid"] = v
+	return
+}
+
+func (p *ListNetworkServiceProvidersParams) SetState(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["state"] = v
+	return
+}
+
+// You should always use this function to get a new ListNetworkServiceProvidersParams instance,
+// as then you are sure you have configured all required params
+func (s *NetworkService) NewListNetworkServiceProvidersParams() *ListNetworkServiceProvidersParams {
+	p := &ListNetworkServiceProvidersParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *NetworkService) GetNetworkServiceProviderID(name string, opts ...OptionFunc) (string, int, error) {
+	p := &ListNetworkServiceProvidersParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["name"] = name
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return "", -1, err
+		}
+	}
+
+	l, err := s.ListNetworkServiceProviders(p)
+	if err != nil {
+		return "", -1, err
+	}
+
+	if l.Count == 0 {
+		return "", l.Count, fmt.Errorf("No match found for %s: %+v", name, l)
+	}
+
+	if l.Count == 1 {
+		return l.NetworkServiceProviders[0].Id, l.Count, nil
+	}
+
+	if l.Count > 1 {
+		for _, v := range l.NetworkServiceProviders {
+			if v.Name == name {
+				return v.Id, l.Count, nil
+			}
+		}
+	}
+	return "", l.Count, fmt.Errorf("Could not find an exact match for %s: %+v", name, l)
+}
+
+// Lists network serviceproviders for a given physical network.
+func (s *NetworkService) ListNetworkServiceProviders(p *ListNetworkServiceProvidersParams) (*ListNetworkServiceProvidersResponse, error) {
+	resp, err := s.cs.newRequest("listNetworkServiceProviders", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListNetworkServiceProvidersResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListNetworkServiceProvidersResponse struct {
+	Count                   int                       `json:"count"`
+	NetworkServiceProviders []*NetworkServiceProvider `json:"networkserviceprovider"`
+}
+
+type NetworkServiceProvider struct {
+	Canenableindividualservice   bool     `json:"canenableindividualservice"`
+	Destinationphysicalnetworkid string   `json:"destinationphysicalnetworkid"`
+	Id                           string   `json:"id"`
+	Name                         string   `json:"name"`
+	Physicalnetworkid            string   `json:"physicalnetworkid"`
+	Servicelist                  []string `json:"servicelist"`
+	State                        string   `json:"state"`
+}
+
+type ListNetworksParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListNetworksParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["acltype"]; found {
+		u.Set("acltype", v.(string))
+	}
+	if v, found := p.p["canusefordeploy"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("canusefordeploy", vv)
+	}
+	if v, found := p.p["displaynetwork"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("displaynetwork", vv)
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["forvpc"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("forvpc", vv)
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["isrecursive"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("isrecursive", vv)
+	}
+	if v, found := p.p["issystem"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("issystem", vv)
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["listall"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("listall", vv)
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["physicalnetworkid"]; found {
+		u.Set("physicalnetworkid", v.(string))
+	}
+	if v, found := p.p["projectid"]; found {
+		u.Set("projectid", v.(string))
+	}
+	if v, found := p.p["restartrequired"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("restartrequired", vv)
+	}
+	if v, found := p.p["specifyipranges"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("specifyipranges", vv)
+	}
+	if v, found := p.p["supportedservices"]; found {
+		vv := strings.Join(v.([]string), ",")
+		u.Set("supportedservices", vv)
+	}
+	if v, found := p.p["tags"]; found {
+		i := 0
+		for k, vv := range v.(map[string]string) {
+			u.Set(fmt.Sprintf("tags[%d].key", i), k)
+			u.Set(fmt.Sprintf("tags[%d].value", i), vv)
+			i++
+		}
+	}
+	if v, found := p.p["traffictype"]; found {
+		u.Set("traffictype", v.(string))
+	}
+	if v, found := p.p["type"]; found {
+		u.Set("type", v.(string))
+	}
+	if v, found := p.p["vpcid"]; found {
+		u.Set("vpcid", v.(string))
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *ListNetworksParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *ListNetworksParams) SetAcltype(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["acltype"] = v
+	return
+}
+
+func (p *ListNetworksParams) SetCanusefordeploy(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["canusefordeploy"] = v
+	return
+}
+
+func (p *ListNetworksParams) SetDisplaynetwork(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["displaynetwork"] = v
+	return
+}
+
+func (p *ListNetworksParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *ListNetworksParams) SetForvpc(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["forvpc"] = v
+	return
+}
+
+func (p *ListNetworksParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ListNetworksParams) SetIsrecursive(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isrecursive"] = v
+	return
+}
+
+func (p *ListNetworksParams) SetIssystem(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["issystem"] = v
+	return
+}
+
+func (p *ListNetworksParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListNetworksParams) SetListall(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["listall"] = v
+	return
+}
+
+func (p *ListNetworksParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListNetworksParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListNetworksParams) SetPhysicalnetworkid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["physicalnetworkid"] = v
+	return
+}
+
+func (p *ListNetworksParams) SetProjectid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectid"] = v
+	return
+}
+
+func (p *ListNetworksParams) SetRestartrequired(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["restartrequired"] = v
+	return
+}
+
+func (p *ListNetworksParams) SetSpecifyipranges(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["specifyipranges"] = v
+	return
+}
+
+func (p *ListNetworksParams) SetSupportedservices(v []string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["supportedservices"] = v
+	return
+}
+
+func (p *ListNetworksParams) SetTags(v map[string]string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["tags"] = v
+	return
+}
+
+func (p *ListNetworksParams) SetTraffictype(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["traffictype"] = v
+	return
+}
+
+func (p *ListNetworksParams) SetType(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["type"] = v
+	return
+}
+
+func (p *ListNetworksParams) SetVpcid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["vpcid"] = v
+	return
+}
+
+func (p *ListNetworksParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new ListNetworksParams instance,
+// as then you are sure you have configured all required params
+func (s *NetworkService) NewListNetworksParams() *ListNetworksParams {
+	p := &ListNetworksParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *NetworkService) GetNetworkID(keyword string, opts ...OptionFunc) (string, int, error) {
+	p := &ListNetworksParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["keyword"] = keyword
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return "", -1, err
+		}
+	}
+
+	l, err := s.ListNetworks(p)
+	if err != nil {
+		return "", -1, err
+	}
+
+	if l.Count == 0 {
+		return "", l.Count, fmt.Errorf("No match found for %s: %+v", keyword, l)
+	}
+
+	if l.Count == 1 {
+		return l.Networks[0].Id, l.Count, nil
+	}
+
+	if l.Count > 1 {
+		for _, v := range l.Networks {
+			if v.Name == keyword {
+				return v.Id, l.Count, nil
+			}
+		}
+	}
+	return "", l.Count, fmt.Errorf("Could not find an exact match for %s: %+v", keyword, l)
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *NetworkService) GetNetworkByName(name string, opts ...OptionFunc) (*Network, int, error) {
+	id, count, err := s.GetNetworkID(name, opts...)
+	if err != nil {
+		return nil, count, err
+	}
+
+	r, count, err := s.GetNetworkByID(id, opts...)
+	if err != nil {
+		return nil, count, err
+	}
+	return r, count, nil
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *NetworkService) GetNetworkByID(id string, opts ...OptionFunc) (*Network, int, error) {
+	p := &ListNetworksParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["id"] = id
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return nil, -1, err
+		}
+	}
+
+	l, err := s.ListNetworks(p)
+	if err != nil {
+		if strings.Contains(err.Error(), fmt.Sprintf(
+			"Invalid parameter id value=%s due to incorrect long value format, "+
+				"or entity does not exist", id)) {
+			return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
+		}
+		return nil, -1, err
+	}
+
+	if l.Count == 0 {
+		return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
+	}
+
+	if l.Count == 1 {
+		return l.Networks[0], l.Count, nil
+	}
+	return nil, l.Count, fmt.Errorf("There is more then one result for Network UUID: %s!", id)
+}
+
+// Lists all available networks.
+func (s *NetworkService) ListNetworks(p *ListNetworksParams) (*ListNetworksResponse, error) {
+	resp, err := s.cs.newRequest("listNetworks", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListNetworksResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListNetworksResponse struct {
+	Count    int        `json:"count"`
+	Networks []*Network `json:"network"`
+}
+
+type Network struct {
+	Account                     string `json:"account"`
+	Aclid                       string `json:"aclid"`
+	Acltype                     string `json:"acltype"`
+	Broadcastdomaintype         string `json:"broadcastdomaintype"`
+	Broadcasturi                string `json:"broadcasturi"`
+	Canusefordeploy             bool   `json:"canusefordeploy"`
+	Cidr                        string `json:"cidr"`
+	Displaynetwork              bool   `json:"displaynetwork"`
+	Displaytext                 string `json:"displaytext"`
+	Dns1                        string `json:"dns1"`
+	Dns2                        string `json:"dns2"`
+	Domain                      string `json:"domain"`
+	Domainid                    string `json:"domainid"`
+	Gateway                     string `json:"gateway"`
+	Id                          string `json:"id"`
+	Ip6cidr                     string `json:"ip6cidr"`
+	Ip6gateway                  string `json:"ip6gateway"`
+	Isdefault                   bool   `json:"isdefault"`
+	Ispersistent                bool   `json:"ispersistent"`
+	Issystem                    bool   `json:"issystem"`
+	Name                        string `json:"name"`
+	Netmask                     string `json:"netmask"`
+	Networkcidr                 string `json:"networkcidr"`
+	Networkdomain               string `json:"networkdomain"`
+	Networkofferingavailability string `json:"networkofferingavailability"`
+	Networkofferingconservemode bool   `json:"networkofferingconservemode"`
+	Networkofferingdisplaytext  string `json:"networkofferingdisplaytext"`
+	Networkofferingid           string `json:"networkofferingid"`
+	Networkofferingname         string `json:"networkofferingname"`
+	Physicalnetworkid           string `json:"physicalnetworkid"`
+	Project                     string `json:"project"`
+	Projectid                   string `json:"projectid"`
+	Related                     string `json:"related"`
+	Reservediprange             string `json:"reservediprange"`
+	Restartrequired             bool   `json:"restartrequired"`
+	Service                     []struct {
+		Capability []struct {
+			Canchooseservicecapability bool   `json:"canchooseservicecapability"`
+			Name                       string `json:"name"`
+			Value                      string `json:"value"`
+		} `json:"capability"`
+		Name     string `json:"name"`
+		Provider []struct {
+			Canenableindividualservice   bool     `json:"canenableindividualservice"`
+			Destinationphysicalnetworkid string   `json:"destinationphysicalnetworkid"`
+			Id                           string   `json:"id"`
+			Name                         string   `json:"name"`
+			Physicalnetworkid            string   `json:"physicalnetworkid"`
+			Servicelist                  []string `json:"servicelist"`
+			State                        string   `json:"state"`
+		} `json:"provider"`
+	} `json:"service"`
+	Specifyipranges  bool   `json:"specifyipranges"`
+	State            string `json:"state"`
+	Strechedl2subnet bool   `json:"strechedl2subnet"`
+	Subdomainaccess  bool   `json:"subdomainaccess"`
+	Tags             []struct {
+		Account      string `json:"account"`
+		Customer     string `json:"customer"`
+		Domain       string `json:"domain"`
+		Domainid     string `json:"domainid"`
+		Key          string `json:"key"`
+		Project      string `json:"project"`
+		Projectid    string `json:"projectid"`
+		Resourceid   string `json:"resourceid"`
+		Resourcetype string `json:"resourcetype"`
+		Value        string `json:"value"`
+	} `json:"tags"`
+	Traffictype       string        `json:"traffictype"`
+	Type              string        `json:"type"`
+	Vlan              string        `json:"vlan"`
+	Vpcid             string        `json:"vpcid"`
+	Zoneid            string        `json:"zoneid"`
+	Zonename          string        `json:"zonename"`
+	Zonesnetworkspans []interface{} `json:"zonesnetworkspans"`
+}
+
+type ListNiciraNvpDeviceNetworksParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListNiciraNvpDeviceNetworksParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["nvpdeviceid"]; found {
+		u.Set("nvpdeviceid", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	return u
+}
+
+func (p *ListNiciraNvpDeviceNetworksParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListNiciraNvpDeviceNetworksParams) SetNvpdeviceid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["nvpdeviceid"] = v
+	return
+}
+
+func (p *ListNiciraNvpDeviceNetworksParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListNiciraNvpDeviceNetworksParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+// You should always use this function to get a new ListNiciraNvpDeviceNetworksParams instance,
+// as then you are sure you have configured all required params
+func (s *NetworkService) NewListNiciraNvpDeviceNetworksParams(nvpdeviceid string) *ListNiciraNvpDeviceNetworksParams {
+	p := &ListNiciraNvpDeviceNetworksParams{}
+	p.p = make(map[string]interface{})
+	p.p["nvpdeviceid"] = nvpdeviceid
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *NetworkService) GetNiciraNvpDeviceNetworkID(keyword string, nvpdeviceid string, opts ...OptionFunc) (string, int, error) {
+	p := &ListNiciraNvpDeviceNetworksParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["keyword"] = keyword
+	p.p["nvpdeviceid"] = nvpdeviceid
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return "", -1, err
+		}
+	}
+
+	l, err := s.ListNiciraNvpDeviceNetworks(p)
+	if err != nil {
+		return "", -1, err
+	}
+
+	if l.Count == 0 {
+		return "", l.Count, fmt.Errorf("No match found for %s: %+v", keyword, l)
+	}
+
+	if l.Count == 1 {
+		return l.NiciraNvpDeviceNetworks[0].Id, l.Count, nil
+	}
+
+	if l.Count > 1 {
+		for _, v := range l.NiciraNvpDeviceNetworks {
+			if v.Name == keyword {
+				return v.Id, l.Count, nil
+			}
+		}
+	}
+	return "", l.Count, fmt.Errorf("Could not find an exact match for %s: %+v", keyword, l)
+}
+
+// lists network that are using a nicira nvp device
+func (s *NetworkService) ListNiciraNvpDeviceNetworks(p *ListNiciraNvpDeviceNetworksParams) (*ListNiciraNvpDeviceNetworksResponse, error) {
+	resp, err := s.cs.newRequest("listNiciraNvpDeviceNetworks", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListNiciraNvpDeviceNetworksResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListNiciraNvpDeviceNetworksResponse struct {
+	Count                   int                       `json:"count"`
+	NiciraNvpDeviceNetworks []*NiciraNvpDeviceNetwork `json:"niciranvpdevicenetwork"`
+}
+
+type NiciraNvpDeviceNetwork struct {
+	Account                     string `json:"account"`
+	Aclid                       string `json:"aclid"`
+	Acltype                     string `json:"acltype"`
+	Broadcastdomaintype         string `json:"broadcastdomaintype"`
+	Broadcasturi                string `json:"broadcasturi"`
+	Canusefordeploy             bool   `json:"canusefordeploy"`
+	Cidr                        string `json:"cidr"`
+	Displaynetwork              bool   `json:"displaynetwork"`
+	Displaytext                 string `json:"displaytext"`
+	Dns1                        string `json:"dns1"`
+	Dns2                        string `json:"dns2"`
+	Domain                      string `json:"domain"`
+	Domainid                    string `json:"domainid"`
+	Gateway                     string `json:"gateway"`
+	Id                          string `json:"id"`
+	Ip6cidr                     string `json:"ip6cidr"`
+	Ip6gateway                  string `json:"ip6gateway"`
+	Isdefault                   bool   `json:"isdefault"`
+	Ispersistent                bool   `json:"ispersistent"`
+	Issystem                    bool   `json:"issystem"`
+	Name                        string `json:"name"`
+	Netmask                     string `json:"netmask"`
+	Networkcidr                 string `json:"networkcidr"`
+	Networkdomain               string `json:"networkdomain"`
+	Networkofferingavailability string `json:"networkofferingavailability"`
+	Networkofferingconservemode bool   `json:"networkofferingconservemode"`
+	Networkofferingdisplaytext  string `json:"networkofferingdisplaytext"`
+	Networkofferingid           string `json:"networkofferingid"`
+	Networkofferingname         string `json:"networkofferingname"`
+	Physicalnetworkid           string `json:"physicalnetworkid"`
+	Project                     string `json:"project"`
+	Projectid                   string `json:"projectid"`
+	Related                     string `json:"related"`
+	Reservediprange             string `json:"reservediprange"`
+	Restartrequired             bool   `json:"restartrequired"`
+	Service                     []struct {
+		Capability []struct {
+			Canchooseservicecapability bool   `json:"canchooseservicecapability"`
+			Name                       string `json:"name"`
+			Value                      string `json:"value"`
+		} `json:"capability"`
+		Name     string `json:"name"`
+		Provider []struct {
+			Canenableindividualservice   bool     `json:"canenableindividualservice"`
+			Destinationphysicalnetworkid string   `json:"destinationphysicalnetworkid"`
+			Id                           string   `json:"id"`
+			Name                         string   `json:"name"`
+			Physicalnetworkid            string   `json:"physicalnetworkid"`
+			Servicelist                  []string `json:"servicelist"`
+			State                        string   `json:"state"`
+		} `json:"provider"`
+	} `json:"service"`
+	Specifyipranges  bool   `json:"specifyipranges"`
+	State            string `json:"state"`
+	Strechedl2subnet bool   `json:"strechedl2subnet"`
+	Subdomainaccess  bool   `json:"subdomainaccess"`
+	Tags             []struct {
+		Account      string `json:"account"`
+		Customer     string `json:"customer"`
+		Domain       string `json:"domain"`
+		Domainid     string `json:"domainid"`
+		Key          string `json:"key"`
+		Project      string `json:"project"`
+		Projectid    string `json:"projectid"`
+		Resourceid   string `json:"resourceid"`
+		Resourcetype string `json:"resourcetype"`
+		Value        string `json:"value"`
+	} `json:"tags"`
+	Traffictype       string        `json:"traffictype"`
+	Type              string        `json:"type"`
+	Vlan              string        `json:"vlan"`
+	Vpcid             string        `json:"vpcid"`
+	Zoneid            string        `json:"zoneid"`
+	Zonename          string        `json:"zonename"`
+	Zonesnetworkspans []interface{} `json:"zonesnetworkspans"`
+}
+
+type ListOpenDaylightControllersParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListOpenDaylightControllersParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["physicalnetworkid"]; found {
+		u.Set("physicalnetworkid", v.(string))
+	}
+	return u
+}
+
+func (p *ListOpenDaylightControllersParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ListOpenDaylightControllersParams) SetPhysicalnetworkid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["physicalnetworkid"] = v
+	return
+}
+
+// You should always use this function to get a new ListOpenDaylightControllersParams instance,
+// as then you are sure you have configured all required params
+func (s *NetworkService) NewListOpenDaylightControllersParams() *ListOpenDaylightControllersParams {
+	p := &ListOpenDaylightControllersParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *NetworkService) GetOpenDaylightControllerByID(id string, opts ...OptionFunc) (*OpenDaylightController, int, error) {
+	p := &ListOpenDaylightControllersParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["id"] = id
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return nil, -1, err
+		}
+	}
+
+	l, err := s.ListOpenDaylightControllers(p)
+	if err != nil {
+		if strings.Contains(err.Error(), fmt.Sprintf(
+			"Invalid parameter id value=%s due to incorrect long value format, "+
+				"or entity does not exist", id)) {
+			return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
+		}
+		return nil, -1, err
+	}
+
+	if l.Count == 0 {
+		return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
+	}
+
+	if l.Count == 1 {
+		return l.OpenDaylightControllers[0], l.Count, nil
+	}
+	return nil, l.Count, fmt.Errorf("There is more then one result for OpenDaylightController UUID: %s!", id)
+}
+
+// Lists OpenDyalight controllers
+func (s *NetworkService) ListOpenDaylightControllers(p *ListOpenDaylightControllersParams) (*ListOpenDaylightControllersResponse, error) {
+	resp, err := s.cs.newRequest("listOpenDaylightControllers", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListOpenDaylightControllersResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListOpenDaylightControllersResponse struct {
+	Count                   int                       `json:"count"`
+	OpenDaylightControllers []*OpenDaylightController `json:"opendaylightcontroller"`
+}
+
+type OpenDaylightController struct {
+	Id                string `json:"id"`
+	Name              string `json:"name"`
+	Physicalnetworkid string `json:"physicalnetworkid"`
+	Url               string `json:"url"`
+	Username          string `json:"username"`
+}
+
+type ListPaloAltoFirewallNetworksParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListPaloAltoFirewallNetworksParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["lbdeviceid"]; found {
+		u.Set("lbdeviceid", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	return u
+}
+
+func (p *ListPaloAltoFirewallNetworksParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListPaloAltoFirewallNetworksParams) SetLbdeviceid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["lbdeviceid"] = v
+	return
+}
+
+func (p *ListPaloAltoFirewallNetworksParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListPaloAltoFirewallNetworksParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+// You should always use this function to get a new ListPaloAltoFirewallNetworksParams instance,
+// as then you are sure you have configured all required params
+func (s *NetworkService) NewListPaloAltoFirewallNetworksParams(lbdeviceid string) *ListPaloAltoFirewallNetworksParams {
+	p := &ListPaloAltoFirewallNetworksParams{}
+	p.p = make(map[string]interface{})
+	p.p["lbdeviceid"] = lbdeviceid
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *NetworkService) GetPaloAltoFirewallNetworkID(keyword string, lbdeviceid string, opts ...OptionFunc) (string, int, error) {
+	p := &ListPaloAltoFirewallNetworksParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["keyword"] = keyword
+	p.p["lbdeviceid"] = lbdeviceid
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return "", -1, err
+		}
+	}
+
+	l, err := s.ListPaloAltoFirewallNetworks(p)
+	if err != nil {
+		return "", -1, err
+	}
+
+	if l.Count == 0 {
+		return "", l.Count, fmt.Errorf("No match found for %s: %+v", keyword, l)
+	}
+
+	if l.Count == 1 {
+		return l.PaloAltoFirewallNetworks[0].Id, l.Count, nil
+	}
+
+	if l.Count > 1 {
+		for _, v := range l.PaloAltoFirewallNetworks {
+			if v.Name == keyword {
+				return v.Id, l.Count, nil
+			}
+		}
+	}
+	return "", l.Count, fmt.Errorf("Could not find an exact match for %s: %+v", keyword, l)
+}
+
+// lists network that are using Palo Alto firewall device
+func (s *NetworkService) ListPaloAltoFirewallNetworks(p *ListPaloAltoFirewallNetworksParams) (*ListPaloAltoFirewallNetworksResponse, error) {
+	resp, err := s.cs.newRequest("listPaloAltoFirewallNetworks", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListPaloAltoFirewallNetworksResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListPaloAltoFirewallNetworksResponse struct {
+	Count                    int                        `json:"count"`
+	PaloAltoFirewallNetworks []*PaloAltoFirewallNetwork `json:"paloaltofirewallnetwork"`
+}
+
+type PaloAltoFirewallNetwork struct {
+	Account                     string `json:"account"`
+	Aclid                       string `json:"aclid"`
+	Acltype                     string `json:"acltype"`
+	Broadcastdomaintype         string `json:"broadcastdomaintype"`
+	Broadcasturi                string `json:"broadcasturi"`
+	Canusefordeploy             bool   `json:"canusefordeploy"`
+	Cidr                        string `json:"cidr"`
+	Displaynetwork              bool   `json:"displaynetwork"`
+	Displaytext                 string `json:"displaytext"`
+	Dns1                        string `json:"dns1"`
+	Dns2                        string `json:"dns2"`
+	Domain                      string `json:"domain"`
+	Domainid                    string `json:"domainid"`
+	Gateway                     string `json:"gateway"`
+	Id                          string `json:"id"`
+	Ip6cidr                     string `json:"ip6cidr"`
+	Ip6gateway                  string `json:"ip6gateway"`
+	Isdefault                   bool   `json:"isdefault"`
+	Ispersistent                bool   `json:"ispersistent"`
+	Issystem                    bool   `json:"issystem"`
+	Name                        string `json:"name"`
+	Netmask                     string `json:"netmask"`
+	Networkcidr                 string `json:"networkcidr"`
+	Networkdomain               string `json:"networkdomain"`
+	Networkofferingavailability string `json:"networkofferingavailability"`
+	Networkofferingconservemode bool   `json:"networkofferingconservemode"`
+	Networkofferingdisplaytext  string `json:"networkofferingdisplaytext"`
+	Networkofferingid           string `json:"networkofferingid"`
+	Networkofferingname         string `json:"networkofferingname"`
+	Physicalnetworkid           string `json:"physicalnetworkid"`
+	Project                     string `json:"project"`
+	Projectid                   string `json:"projectid"`
+	Related                     string `json:"related"`
+	Reservediprange             string `json:"reservediprange"`
+	Restartrequired             bool   `json:"restartrequired"`
+	Service                     []struct {
+		Capability []struct {
+			Canchooseservicecapability bool   `json:"canchooseservicecapability"`
+			Name                       string `json:"name"`
+			Value                      string `json:"value"`
+		} `json:"capability"`
+		Name     string `json:"name"`
+		Provider []struct {
+			Canenableindividualservice   bool     `json:"canenableindividualservice"`
+			Destinationphysicalnetworkid string   `json:"destinationphysicalnetworkid"`
+			Id                           string   `json:"id"`
+			Name                         string   `json:"name"`
+			Physicalnetworkid            string   `json:"physicalnetworkid"`
+			Servicelist                  []string `json:"servicelist"`
+			State                        string   `json:"state"`
+		} `json:"provider"`
+	} `json:"service"`
+	Specifyipranges  bool   `json:"specifyipranges"`
+	State            string `json:"state"`
+	Strechedl2subnet bool   `json:"strechedl2subnet"`
+	Subdomainaccess  bool   `json:"subdomainaccess"`
+	Tags             []struct {
+		Account      string `json:"account"`
+		Customer     string `json:"customer"`
+		Domain       string `json:"domain"`
+		Domainid     string `json:"domainid"`
+		Key          string `json:"key"`
+		Project      string `json:"project"`
+		Projectid    string `json:"projectid"`
+		Resourceid   string `json:"resourceid"`
+		Resourcetype string `json:"resourcetype"`
+		Value        string `json:"value"`
+	} `json:"tags"`
+	Traffictype       string        `json:"traffictype"`
+	Type              string        `json:"type"`
+	Vlan              string        `json:"vlan"`
+	Vpcid             string        `json:"vpcid"`
+	Zoneid            string        `json:"zoneid"`
+	Zonename          string        `json:"zonename"`
+	Zonesnetworkspans []interface{} `json:"zonesnetworkspans"`
+}
+
+type ListPhysicalNetworksParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListPhysicalNetworksParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *ListPhysicalNetworksParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ListPhysicalNetworksParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListPhysicalNetworksParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *ListPhysicalNetworksParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListPhysicalNetworksParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListPhysicalNetworksParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new ListPhysicalNetworksParams instance,
+// as then you are sure you have configured all required params
+func (s *NetworkService) NewListPhysicalNetworksParams() *ListPhysicalNetworksParams {
+	p := &ListPhysicalNetworksParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *NetworkService) GetPhysicalNetworkID(name string, opts ...OptionFunc) (string, int, error) {
+	p := &ListPhysicalNetworksParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["name"] = name
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return "", -1, err
+		}
+	}
+
+	l, err := s.ListPhysicalNetworks(p)
+	if err != nil {
+		return "", -1, err
+	}
+
+	if l.Count == 0 {
+		return "", l.Count, fmt.Errorf("No match found for %s: %+v", name, l)
+	}
+
+	if l.Count == 1 {
+		return l.PhysicalNetworks[0].Id, l.Count, nil
+	}
+
+	if l.Count > 1 {
+		for _, v := range l.PhysicalNetworks {
+			if v.Name == name {
+				return v.Id, l.Count, nil
+			}
+		}
+	}
+	return "", l.Count, fmt.Errorf("Could not find an exact match for %s: %+v", name, l)
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *NetworkService) GetPhysicalNetworkByName(name string, opts ...OptionFunc) (*PhysicalNetwork, int, error) {
+	id, count, err := s.GetPhysicalNetworkID(name, opts...)
+	if err != nil {
+		return nil, count, err
+	}
+
+	r, count, err := s.GetPhysicalNetworkByID(id, opts...)
+	if err != nil {
+		return nil, count, err
+	}
+	return r, count, nil
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *NetworkService) GetPhysicalNetworkByID(id string, opts ...OptionFunc) (*PhysicalNetwork, int, error) {
+	p := &ListPhysicalNetworksParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["id"] = id
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return nil, -1, err
+		}
+	}
+
+	l, err := s.ListPhysicalNetworks(p)
+	if err != nil {
+		if strings.Contains(err.Error(), fmt.Sprintf(
+			"Invalid parameter id value=%s due to incorrect long value format, "+
+				"or entity does not exist", id)) {
+			return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
+		}
+		return nil, -1, err
+	}
+
+	if l.Count == 0 {
+		return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
+	}
+
+	if l.Count == 1 {
+		return l.PhysicalNetworks[0], l.Count, nil
+	}
+	return nil, l.Count, fmt.Errorf("There is more then one result for PhysicalNetwork UUID: %s!", id)
+}
+
+// Lists physical networks
+func (s *NetworkService) ListPhysicalNetworks(p *ListPhysicalNetworksParams) (*ListPhysicalNetworksResponse, error) {
+	resp, err := s.cs.newRequest("listPhysicalNetworks", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListPhysicalNetworksResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListPhysicalNetworksResponse struct {
+	Count            int                `json:"count"`
+	PhysicalNetworks []*PhysicalNetwork `json:"physicalnetwork"`
+}
+
+type PhysicalNetwork struct {
+	Broadcastdomainrange string `json:"broadcastdomainrange"`
+	Domainid             string `json:"domainid"`
+	Id                   string `json:"id"`
+	Isolationmethods     string `json:"isolationmethods"`
+	Name                 string `json:"name"`
+	Networkspeed         string `json:"networkspeed"`
+	State                string `json:"state"`
+	Tags                 string `json:"tags"`
+	Vlan                 string `json:"vlan"`
+	Zoneid               string `json:"zoneid"`
+}
+
+type ListSrxFirewallNetworksParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListSrxFirewallNetworksParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["lbdeviceid"]; found {
+		u.Set("lbdeviceid", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	return u
+}
+
+func (p *ListSrxFirewallNetworksParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListSrxFirewallNetworksParams) SetLbdeviceid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["lbdeviceid"] = v
+	return
+}
+
+func (p *ListSrxFirewallNetworksParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListSrxFirewallNetworksParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+// You should always use this function to get a new ListSrxFirewallNetworksParams instance,
+// as then you are sure you have configured all required params
+func (s *NetworkService) NewListSrxFirewallNetworksParams(lbdeviceid string) *ListSrxFirewallNetworksParams {
+	p := &ListSrxFirewallNetworksParams{}
+	p.p = make(map[string]interface{})
+	p.p["lbdeviceid"] = lbdeviceid
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *NetworkService) GetSrxFirewallNetworkID(keyword string, lbdeviceid string, opts ...OptionFunc) (string, int, error) {
+	p := &ListSrxFirewallNetworksParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["keyword"] = keyword
+	p.p["lbdeviceid"] = lbdeviceid
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return "", -1, err
+		}
+	}
+
+	l, err := s.ListSrxFirewallNetworks(p)
+	if err != nil {
+		return "", -1, err
+	}
+
+	if l.Count == 0 {
+		return "", l.Count, fmt.Errorf("No match found for %s: %+v", keyword, l)
+	}
+
+	if l.Count == 1 {
+		return l.SrxFirewallNetworks[0].Id, l.Count, nil
+	}
+
+	if l.Count > 1 {
+		for _, v := range l.SrxFirewallNetworks {
+			if v.Name == keyword {
+				return v.Id, l.Count, nil
+			}
+		}
+	}
+	return "", l.Count, fmt.Errorf("Could not find an exact match for %s: %+v", keyword, l)
+}
+
+// lists network that are using SRX firewall device
+func (s *NetworkService) ListSrxFirewallNetworks(p *ListSrxFirewallNetworksParams) (*ListSrxFirewallNetworksResponse, error) {
+	resp, err := s.cs.newRequest("listSrxFirewallNetworks", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListSrxFirewallNetworksResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListSrxFirewallNetworksResponse struct {
+	Count               int                   `json:"count"`
+	SrxFirewallNetworks []*SrxFirewallNetwork `json:"srxfirewallnetwork"`
+}
+
+type SrxFirewallNetwork struct {
+	Account                     string `json:"account"`
+	Aclid                       string `json:"aclid"`
+	Acltype                     string `json:"acltype"`
+	Broadcastdomaintype         string `json:"broadcastdomaintype"`
+	Broadcasturi                string `json:"broadcasturi"`
+	Canusefordeploy             bool   `json:"canusefordeploy"`
+	Cidr                        string `json:"cidr"`
+	Displaynetwork              bool   `json:"displaynetwork"`
+	Displaytext                 string `json:"displaytext"`
+	Dns1                        string `json:"dns1"`
+	Dns2                        string `json:"dns2"`
+	Domain                      string `json:"domain"`
+	Domainid                    string `json:"domainid"`
+	Gateway                     string `json:"gateway"`
+	Id                          string `json:"id"`
+	Ip6cidr                     string `json:"ip6cidr"`
+	Ip6gateway                  string `json:"ip6gateway"`
+	Isdefault                   bool   `json:"isdefault"`
+	Ispersistent                bool   `json:"ispersistent"`
+	Issystem                    bool   `json:"issystem"`
+	Name                        string `json:"name"`
+	Netmask                     string `json:"netmask"`
+	Networkcidr                 string `json:"networkcidr"`
+	Networkdomain               string `json:"networkdomain"`
+	Networkofferingavailability string `json:"networkofferingavailability"`
+	Networkofferingconservemode bool   `json:"networkofferingconservemode"`
+	Networkofferingdisplaytext  string `json:"networkofferingdisplaytext"`
+	Networkofferingid           string `json:"networkofferingid"`
+	Networkofferingname         string `json:"networkofferingname"`
+	Physicalnetworkid           string `json:"physicalnetworkid"`
+	Project                     string `json:"project"`
+	Projectid                   string `json:"projectid"`
+	Related                     string `json:"related"`
+	Reservediprange             string `json:"reservediprange"`
+	Restartrequired             bool   `json:"restartrequired"`
+	Service                     []struct {
+		Capability []struct {
+			Canchooseservicecapability bool   `json:"canchooseservicecapability"`
+			Name                       string `json:"name"`
+			Value                      string `json:"value"`
+		} `json:"capability"`
+		Name     string `json:"name"`
+		Provider []struct {
+			Canenableindividualservice   bool     `json:"canenableindividualservice"`
+			Destinationphysicalnetworkid string   `json:"destinationphysicalnetworkid"`
+			Id                           string   `json:"id"`
+			Name                         string   `json:"name"`
+			Physicalnetworkid            string   `json:"physicalnetworkid"`
+			Servicelist                  []string `json:"servicelist"`
+			State                        string   `json:"state"`
+		} `json:"provider"`
+	} `json:"service"`
+	Specifyipranges  bool   `json:"specifyipranges"`
+	State            string `json:"state"`
+	Strechedl2subnet bool   `json:"strechedl2subnet"`
+	Subdomainaccess  bool   `json:"subdomainaccess"`
+	Tags             []struct {
+		Account      string `json:"account"`
+		Customer     string `json:"customer"`
+		Domain       string `json:"domain"`
+		Domainid     string `json:"domainid"`
+		Key          string `json:"key"`
+		Project      string `json:"project"`
+		Projectid    string `json:"projectid"`
+		Resourceid   string `json:"resourceid"`
+		Resourcetype string `json:"resourcetype"`
+		Value        string `json:"value"`
+	} `json:"tags"`
+	Traffictype       string        `json:"traffictype"`
+	Type              string        `json:"type"`
+	Vlan              string        `json:"vlan"`
+	Vpcid             string        `json:"vpcid"`
+	Zoneid            string        `json:"zoneid"`
+	Zonename          string        `json:"zonename"`
+	Zonesnetworkspans []interface{} `json:"zonesnetworkspans"`
+}
+
+type ListStorageNetworkIpRangeParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListStorageNetworkIpRangeParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["podid"]; found {
+		u.Set("podid", v.(string))
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *ListStorageNetworkIpRangeParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ListStorageNetworkIpRangeParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListStorageNetworkIpRangeParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListStorageNetworkIpRangeParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListStorageNetworkIpRangeParams) SetPodid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["podid"] = v
+	return
+}
+
+func (p *ListStorageNetworkIpRangeParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new ListStorageNetworkIpRangeParams instance,
+// as then you are sure you have configured all required params
+func (s *NetworkService) NewListStorageNetworkIpRangeParams() *ListStorageNetworkIpRangeParams {
+	p := &ListStorageNetworkIpRangeParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *NetworkService) GetStorageNetworkIpRangeByID(id string, opts ...OptionFunc) (*StorageNetworkIpRange, int, error) {
+	p := &ListStorageNetworkIpRangeParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["id"] = id
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return nil, -1, err
+		}
+	}
+
+	l, err := s.ListStorageNetworkIpRange(p)
+	if err != nil {
+		if strings.Contains(err.Error(), fmt.Sprintf(
+			"Invalid parameter id value=%s due to incorrect long value format, "+
+				"or entity does not exist", id)) {
+			return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
+		}
+		return nil, -1, err
+	}
+
+	if l.Count == 0 {
+		return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
+	}
+
+	if l.Count == 1 {
+		return l.StorageNetworkIpRange[0], l.Count, nil
+	}
+	return nil, l.Count, fmt.Errorf("There is more then one result for StorageNetworkIpRange UUID: %s!", id)
+}
+
+// List a storage network IP range.
+func (s *NetworkService) ListStorageNetworkIpRange(p *ListStorageNetworkIpRangeParams) (*ListStorageNetworkIpRangeResponse, error) {
+	resp, err := s.cs.newRequest("listStorageNetworkIpRange", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListStorageNetworkIpRangeResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListStorageNetworkIpRangeResponse struct {
+	Count                 int                      `json:"count"`
+	StorageNetworkIpRange []*StorageNetworkIpRange `json:"storagenetworkiprange"`
+}
+
+type StorageNetworkIpRange struct {
+	Endip     string `json:"endip"`
+	Gateway   string `json:"gateway"`
+	Id        string `json:"id"`
+	Netmask   string `json:"netmask"`
+	Networkid string `json:"networkid"`
+	Podid     string `json:"podid"`
+	Startip   string `json:"startip"`
+	Vlan      int    `json:"vlan"`
+	Zoneid    string `json:"zoneid"`
+}
+
+type ListSupportedNetworkServicesParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListSupportedNetworkServicesParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["provider"]; found {
+		u.Set("provider", v.(string))
+	}
+	if v, found := p.p["service"]; found {
+		u.Set("service", v.(string))
+	}
+	return u
+}
+
+func (p *ListSupportedNetworkServicesParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListSupportedNetworkServicesParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListSupportedNetworkServicesParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListSupportedNetworkServicesParams) SetProvider(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["provider"] = v
+	return
+}
+
+func (p *ListSupportedNetworkServicesParams) SetService(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["service"] = v
+	return
+}
+
+// You should always use this function to get a new ListSupportedNetworkServicesParams instance,
+// as then you are sure you have configured all required params
+func (s *NetworkService) NewListSupportedNetworkServicesParams() *ListSupportedNetworkServicesParams {
+	p := &ListSupportedNetworkServicesParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// Lists all network services provided by CloudStack or for the given Provider.
+func (s *NetworkService) ListSupportedNetworkServices(p *ListSupportedNetworkServicesParams) (*ListSupportedNetworkServicesResponse, error) {
+	resp, err := s.cs.newRequest("listSupportedNetworkServices", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListSupportedNetworkServicesResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListSupportedNetworkServicesResponse struct {
+	Count                    int                        `json:"count"`
+	SupportedNetworkServices []*SupportedNetworkService `json:"supportednetworkservice"`
+}
+
+type SupportedNetworkService struct {
+	Capability []struct {
+		Canchooseservicecapability bool   `json:"canchooseservicecapability"`
+		Name                       string `json:"name"`
+		Value                      string `json:"value"`
+	} `json:"capability"`
+	Name     string `json:"name"`
+	Provider []struct {
+		Canenableindividualservice   bool     `json:"canenableindividualservice"`
+		Destinationphysicalnetworkid string   `json:"destinationphysicalnetworkid"`
+		Id                           string   `json:"id"`
+		Name                         string   `json:"name"`
+		Physicalnetworkid            string   `json:"physicalnetworkid"`
+		Servicelist                  []string `json:"servicelist"`
+		State                        string   `json:"state"`
+	} `json:"provider"`
+}
+
+type ReleasePublicIpRangeParams struct {
+	p map[string]interface{}
+}
+
+func (p *ReleasePublicIpRangeParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *ReleasePublicIpRangeParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new ReleasePublicIpRangeParams instance,
+// as then you are sure you have configured all required params
+func (s *NetworkService) NewReleasePublicIpRangeParams(id string) *ReleasePublicIpRangeParams {
+	p := &ReleasePublicIpRangeParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Releases a Public IP range back to the system pool
+func (s *NetworkService) ReleasePublicIpRange(p *ReleasePublicIpRangeParams) (*ReleasePublicIpRangeResponse, error) {
+	resp, err := s.cs.newRequest("releasePublicIpRange", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ReleasePublicIpRangeResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ReleasePublicIpRangeResponse struct {
+	Displaytext string `json:"displaytext"`
+	Success     string `json:"success"`
+}
+
+type RestartNetworkParams struct {
+	p map[string]interface{}
+}
+
+func (p *RestartNetworkParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["cleanup"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("cleanup", vv)
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *RestartNetworkParams) SetCleanup(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["cleanup"] = v
+	return
+}
+
+func (p *RestartNetworkParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new RestartNetworkParams instance,
+// as then you are sure you have configured all required params
+func (s *NetworkService) NewRestartNetworkParams(id string) *RestartNetworkParams {
+	p := &RestartNetworkParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Restarts the network; includes 1) restarting network elements - virtual routers, DHCP servers 2) reapplying all public IPs 3) reapplying loadBalancing/portForwarding rules
+func (s *NetworkService) RestartNetwork(p *RestartNetworkParams) (*RestartNetworkResponse, error) {
+	resp, err := s.cs.newRequest("restartNetwork", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r RestartNetworkResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type RestartNetworkResponse struct {
+	JobID                 string `json:"jobid"`
+	Account               string `json:"account"`
+	Allocated             string `json:"allocated"`
+	Associatednetworkid   string `json:"associatednetworkid"`
+	Associatednetworkname string `json:"associatednetworkname"`
+	Domain                string `json:"domain"`
+	Domainid              string `json:"domainid"`
+	Fordisplay            bool   `json:"fordisplay"`
+	Forvirtualnetwork     bool   `json:"forvirtualnetwork"`
+	Id                    string `json:"id"`
+	Ipaddress             string `json:"ipaddress"`
+	Isportable            bool   `json:"isportable"`
+	Issourcenat           bool   `json:"issourcenat"`
+	Isstaticnat           bool   `json:"isstaticnat"`
+	Issystem              bool   `json:"issystem"`
+	Networkid             string `json:"networkid"`
+	Physicalnetworkid     string `json:"physicalnetworkid"`
+	Project               string `json:"project"`
+	Projectid             string `json:"projectid"`
+	Purpose               string `json:"purpose"`
+	State                 string `json:"state"`
+	Tags                  []struct {
+		Account      string `json:"account"`
+		Customer     string `json:"customer"`
+		Domain       string `json:"domain"`
+		Domainid     string `json:"domainid"`
+		Key          string `json:"key"`
+		Project      string `json:"project"`
+		Projectid    string `json:"projectid"`
+		Resourceid   string `json:"resourceid"`
+		Resourcetype string `json:"resourcetype"`
+		Value        string `json:"value"`
+	} `json:"tags"`
+	Virtualmachinedisplayname string `json:"virtualmachinedisplayname"`
+	Virtualmachineid          string `json:"virtualmachineid"`
+	Virtualmachinename        string `json:"virtualmachinename"`
+	Vlanid                    string `json:"vlanid"`
+	Vlanname                  string `json:"vlanname"`
+	Vmipaddress               string `json:"vmipaddress"`
+	Vpcid                     string `json:"vpcid"`
+	Zoneid                    string `json:"zoneid"`
+	Zonename                  string `json:"zonename"`
+}
+
+type UpdateNetworkParams struct {
+	p map[string]interface{}
+}
+
+func (p *UpdateNetworkParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["changecidr"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("changecidr", vv)
+	}
+	if v, found := p.p["customid"]; found {
+		u.Set("customid", v.(string))
+	}
+	if v, found := p.p["displaynetwork"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("displaynetwork", vv)
+	}
+	if v, found := p.p["displaytext"]; found {
+		u.Set("displaytext", v.(string))
+	}
+	if v, found := p.p["guestvmcidr"]; found {
+		u.Set("guestvmcidr", v.(string))
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["networkdomain"]; found {
+		u.Set("networkdomain", v.(string))
+	}
+	if v, found := p.p["networkofferingid"]; found {
+		u.Set("networkofferingid", v.(string))
+	}
+	return u
+}
+
+func (p *UpdateNetworkParams) SetChangecidr(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["changecidr"] = v
+	return
+}
+
+func (p *UpdateNetworkParams) SetCustomid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["customid"] = v
+	return
+}
+
+func (p *UpdateNetworkParams) SetDisplaynetwork(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["displaynetwork"] = v
+	return
+}
+
+func (p *UpdateNetworkParams) SetDisplaytext(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["displaytext"] = v
+	return
+}
+
+func (p *UpdateNetworkParams) SetGuestvmcidr(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["guestvmcidr"] = v
+	return
+}
+
+func (p *UpdateNetworkParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *UpdateNetworkParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *UpdateNetworkParams) SetNetworkdomain(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["networkdomain"] = v
+	return
+}
+
+func (p *UpdateNetworkParams) SetNetworkofferingid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["networkofferingid"] = v
+	return
+}
+
+// You should always use this function to get a new UpdateNetworkParams instance,
+// as then you are sure you have configured all required params
+func (s *NetworkService) NewUpdateNetworkParams(id string) *UpdateNetworkParams {
+	p := &UpdateNetworkParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Updates a network
+func (s *NetworkService) UpdateNetwork(p *UpdateNetworkParams) (*UpdateNetworkResponse, error) {
+	resp, err := s.cs.newRequest("updateNetwork", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r UpdateNetworkResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type UpdateNetworkResponse struct {
+	JobID                       string `json:"jobid"`
+	Account                     string `json:"account"`
+	Aclid                       string `json:"aclid"`
+	Acltype                     string `json:"acltype"`
+	Broadcastdomaintype         string `json:"broadcastdomaintype"`
+	Broadcasturi                string `json:"broadcasturi"`
+	Canusefordeploy             bool   `json:"canusefordeploy"`
+	Cidr                        string `json:"cidr"`
+	Displaynetwork              bool   `json:"displaynetwork"`
+	Displaytext                 string `json:"displaytext"`
+	Dns1                        string `json:"dns1"`
+	Dns2                        string `json:"dns2"`
+	Domain                      string `json:"domain"`
+	Domainid                    string `json:"domainid"`
+	Gateway                     string `json:"gateway"`
+	Id                          string `json:"id"`
+	Ip6cidr                     string `json:"ip6cidr"`
+	Ip6gateway                  string `json:"ip6gateway"`
+	Isdefault                   bool   `json:"isdefault"`
+	Ispersistent                bool   `json:"ispersistent"`
+	Issystem                    bool   `json:"issystem"`
+	Name                        string `json:"name"`
+	Netmask                     string `json:"netmask"`
+	Networkcidr                 string `json:"networkcidr"`
+	Networkdomain               string `json:"networkdomain"`
+	Networkofferingavailability string `json:"networkofferingavailability"`
+	Networkofferingconservemode bool   `json:"networkofferingconservemode"`
+	Networkofferingdisplaytext  string `json:"networkofferingdisplaytext"`
+	Networkofferingid           string `json:"networkofferingid"`
+	Networkofferingname         string `json:"networkofferingname"`
+	Physicalnetworkid           string `json:"physicalnetworkid"`
+	Project                     string `json:"project"`
+	Projectid                   string `json:"projectid"`
+	Related                     string `json:"related"`
+	Reservediprange             string `json:"reservediprange"`
+	Restartrequired             bool   `json:"restartrequired"`
+	Service                     []struct {
+		Capability []struct {
+			Canchooseservicecapability bool   `json:"canchooseservicecapability"`
+			Name                       string `json:"name"`
+			Value                      string `json:"value"`
+		} `json:"capability"`
+		Name     string `json:"name"`
+		Provider []struct {
+			Canenableindividualservice   bool     `json:"canenableindividualservice"`
+			Destinationphysicalnetworkid string   `json:"destinationphysicalnetworkid"`
+			Id                           string   `json:"id"`
+			Name                         string   `json:"name"`
+			Physicalnetworkid            string   `json:"physicalnetworkid"`
+			Servicelist                  []string `json:"servicelist"`
+			State                        string   `json:"state"`
+		} `json:"provider"`
+	} `json:"service"`
+	Specifyipranges  bool   `json:"specifyipranges"`
+	State            string `json:"state"`
+	Strechedl2subnet bool   `json:"strechedl2subnet"`
+	Subdomainaccess  bool   `json:"subdomainaccess"`
+	Tags             []struct {
+		Account      string `json:"account"`
+		Customer     string `json:"customer"`
+		Domain       string `json:"domain"`
+		Domainid     string `json:"domainid"`
+		Key          string `json:"key"`
+		Project      string `json:"project"`
+		Projectid    string `json:"projectid"`
+		Resourceid   string `json:"resourceid"`
+		Resourcetype string `json:"resourcetype"`
+		Value        string `json:"value"`
+	} `json:"tags"`
+	Traffictype       string        `json:"traffictype"`
+	Type              string        `json:"type"`
+	Vlan              string        `json:"vlan"`
+	Vpcid             string        `json:"vpcid"`
+	Zoneid            string        `json:"zoneid"`
+	Zonename          string        `json:"zonename"`
+	Zonesnetworkspans []interface{} `json:"zonesnetworkspans"`
+}
+
+type UpdateNetworkServiceProviderParams struct {
+	p map[string]interface{}
+}
+
+func (p *UpdateNetworkServiceProviderParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["servicelist"]; found {
+		vv := strings.Join(v.([]string), ",")
+		u.Set("servicelist", vv)
+	}
+	if v, found := p.p["state"]; found {
+		u.Set("state", v.(string))
+	}
+	return u
+}
+
+func (p *UpdateNetworkServiceProviderParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *UpdateNetworkServiceProviderParams) SetServicelist(v []string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["servicelist"] = v
+	return
+}
+
+func (p *UpdateNetworkServiceProviderParams) SetState(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["state"] = v
+	return
+}
+
+// You should always use this function to get a new UpdateNetworkServiceProviderParams instance,
+// as then you are sure you have configured all required params
+func (s *NetworkService) NewUpdateNetworkServiceProviderParams(id string) *UpdateNetworkServiceProviderParams {
+	p := &UpdateNetworkServiceProviderParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Updates a network serviceProvider of a physical network
+func (s *NetworkService) UpdateNetworkServiceProvider(p *UpdateNetworkServiceProviderParams) (*UpdateNetworkServiceProviderResponse, error) {
+	resp, err := s.cs.newRequest("updateNetworkServiceProvider", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r UpdateNetworkServiceProviderResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type UpdateNetworkServiceProviderResponse struct {
+	JobID                        string   `json:"jobid"`
+	Canenableindividualservice   bool     `json:"canenableindividualservice"`
+	Destinationphysicalnetworkid string   `json:"destinationphysicalnetworkid"`
+	Id                           string   `json:"id"`
+	Name                         string   `json:"name"`
+	Physicalnetworkid            string   `json:"physicalnetworkid"`
+	Servicelist                  []string `json:"servicelist"`
+	State                        string   `json:"state"`
+}
+
+type UpdatePhysicalNetworkParams struct {
+	p map[string]interface{}
+}
+
+func (p *UpdatePhysicalNetworkParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["networkspeed"]; found {
+		u.Set("networkspeed", v.(string))
+	}
+	if v, found := p.p["state"]; found {
+		u.Set("state", v.(string))
+	}
+	if v, found := p.p["tags"]; found {
+		vv := strings.Join(v.([]string), ",")
+		u.Set("tags", vv)
+	}
+	if v, found := p.p["vlan"]; found {
+		u.Set("vlan", v.(string))
+	}
+	return u
+}
+
+func (p *UpdatePhysicalNetworkParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *UpdatePhysicalNetworkParams) SetNetworkspeed(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["networkspeed"] = v
+	return
+}
+
+func (p *UpdatePhysicalNetworkParams) SetState(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["state"] = v
+	return
+}
+
+func (p *UpdatePhysicalNetworkParams) SetTags(v []string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["tags"] = v
+	return
+}
+
+func (p *UpdatePhysicalNetworkParams) SetVlan(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["vlan"] = v
+	return
+}
+
+// You should always use this function to get a new UpdatePhysicalNetworkParams instance,
+// as then you are sure you have configured all required params
+func (s *NetworkService) NewUpdatePhysicalNetworkParams(id string) *UpdatePhysicalNetworkParams {
+	p := &UpdatePhysicalNetworkParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Updates a physical network
+func (s *NetworkService) UpdatePhysicalNetwork(p *UpdatePhysicalNetworkParams) (*UpdatePhysicalNetworkResponse, error) {
+	resp, err := s.cs.newRequest("updatePhysicalNetwork", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r UpdatePhysicalNetworkResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type UpdatePhysicalNetworkResponse struct {
+	JobID                string `json:"jobid"`
+	Broadcastdomainrange string `json:"broadcastdomainrange"`
+	Domainid             string `json:"domainid"`
+	Id                   string `json:"id"`
+	Isolationmethods     string `json:"isolationmethods"`
+	Name                 string `json:"name"`
+	Networkspeed         string `json:"networkspeed"`
+	State                string `json:"state"`
+	Tags                 string `json:"tags"`
+	Vlan                 string `json:"vlan"`
+	Zoneid               string `json:"zoneid"`
+}
+
+type UpdateStorageNetworkIpRangeParams struct {
+	p map[string]interface{}
+}
+
+func (p *UpdateStorageNetworkIpRangeParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["endip"]; found {
+		u.Set("endip", v.(string))
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["netmask"]; found {
+		u.Set("netmask", v.(string))
+	}
+	if v, found := p.p["startip"]; found {
+		u.Set("startip", v.(string))
+	}
+	if v, found := p.p["vlan"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("vlan", vv)
+	}
+	return u
+}
+
+func (p *UpdateStorageNetworkIpRangeParams) SetEndip(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["endip"] = v
+	return
+}
+
+func (p *UpdateStorageNetworkIpRangeParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *UpdateStorageNetworkIpRangeParams) SetNetmask(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["netmask"] = v
+	return
+}
+
+func (p *UpdateStorageNetworkIpRangeParams) SetStartip(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["startip"] = v
+	return
+}
+
+func (p *UpdateStorageNetworkIpRangeParams) SetVlan(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["vlan"] = v
+	return
+}
+
+// You should always use this function to get a new UpdateStorageNetworkIpRangeParams instance,
+// as then you are sure you have configured all required params
+func (s *NetworkService) NewUpdateStorageNetworkIpRangeParams(id string) *UpdateStorageNetworkIpRangeParams {
+	p := &UpdateStorageNetworkIpRangeParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Update a Storage network IP range, only allowed when no IPs in this range have been allocated.
+func (s *NetworkService) UpdateStorageNetworkIpRange(p *UpdateStorageNetworkIpRangeParams) (*UpdateStorageNetworkIpRangeResponse, error) {
+	resp, err := s.cs.newRequest("updateStorageNetworkIpRange", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r UpdateStorageNetworkIpRangeResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type UpdateStorageNetworkIpRangeResponse struct {
+	JobID     string `json:"jobid"`
+	Endip     string `json:"endip"`
+	Gateway   string `json:"gateway"`
+	Id        string `json:"id"`
+	Netmask   string `json:"netmask"`
+	Networkid string `json:"networkid"`
+	Podid     string `json:"podid"`
+	Startip   string `json:"startip"`
+	Vlan      int    `json:"vlan"`
+	Zoneid    string `json:"zoneid"`
+}
diff --git a/vendor/github.com/xanzy/go-cloudstack/cloudstack/NicService.go b/vendor/github.com/xanzy/go-cloudstack/cloudstack/NicService.go
new file mode 100644
index 0000000..a6a93d8
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/cloudstack/NicService.go
@@ -0,0 +1,573 @@
+//
+// Copyright 2018, Sander van Harmelen
+//
+// Licensed 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 cloudstack
+
+import (
+	"encoding/json"
+	"net/url"
+	"strconv"
+)
+
+type AddIpToNicParams struct {
+	p map[string]interface{}
+}
+
+func (p *AddIpToNicParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["ipaddress"]; found {
+		u.Set("ipaddress", v.(string))
+	}
+	if v, found := p.p["nicid"]; found {
+		u.Set("nicid", v.(string))
+	}
+	return u
+}
+
+func (p *AddIpToNicParams) SetIpaddress(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["ipaddress"] = v
+	return
+}
+
+func (p *AddIpToNicParams) SetNicid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["nicid"] = v
+	return
+}
+
+// You should always use this function to get a new AddIpToNicParams instance,
+// as then you are sure you have configured all required params
+func (s *NicService) NewAddIpToNicParams(nicid string) *AddIpToNicParams {
+	p := &AddIpToNicParams{}
+	p.p = make(map[string]interface{})
+	p.p["nicid"] = nicid
+	return p
+}
+
+// Assigns secondary IP to NIC
+func (s *NicService) AddIpToNic(p *AddIpToNicParams) (*AddIpToNicResponse, error) {
+	resp, err := s.cs.newRequest("addIpToNic", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r AddIpToNicResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type AddIpToNicResponse struct {
+	JobID            string `json:"jobid"`
+	Id               string `json:"id"`
+	Ipaddress        string `json:"ipaddress"`
+	Networkid        string `json:"networkid"`
+	Nicid            string `json:"nicid"`
+	Virtualmachineid string `json:"virtualmachineid"`
+}
+
+type ListNicsParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListNicsParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["fordisplay"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("fordisplay", vv)
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["networkid"]; found {
+		u.Set("networkid", v.(string))
+	}
+	if v, found := p.p["nicid"]; found {
+		u.Set("nicid", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["virtualmachineid"]; found {
+		u.Set("virtualmachineid", v.(string))
+	}
+	return u
+}
+
+func (p *ListNicsParams) SetFordisplay(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["fordisplay"] = v
+	return
+}
+
+func (p *ListNicsParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListNicsParams) SetNetworkid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["networkid"] = v
+	return
+}
+
+func (p *ListNicsParams) SetNicid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["nicid"] = v
+	return
+}
+
+func (p *ListNicsParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListNicsParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListNicsParams) SetVirtualmachineid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["virtualmachineid"] = v
+	return
+}
+
+// You should always use this function to get a new ListNicsParams instance,
+// as then you are sure you have configured all required params
+func (s *NicService) NewListNicsParams(virtualmachineid string) *ListNicsParams {
+	p := &ListNicsParams{}
+	p.p = make(map[string]interface{})
+	p.p["virtualmachineid"] = virtualmachineid
+	return p
+}
+
+// list the vm nics  IP to NIC
+func (s *NicService) ListNics(p *ListNicsParams) (*ListNicsResponse, error) {
+	resp, err := s.cs.newRequest("listNics", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListNicsResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListNicsResponse struct {
+	Count int    `json:"count"`
+	Nics  []*Nic `json:"nic"`
+}
+
+type Nic struct {
+	Broadcasturi         string `json:"broadcasturi"`
+	Deviceid             string `json:"deviceid"`
+	Gateway              string `json:"gateway"`
+	Id                   string `json:"id"`
+	Ip6address           string `json:"ip6address"`
+	Ip6cidr              string `json:"ip6cidr"`
+	Ip6gateway           string `json:"ip6gateway"`
+	Ipaddress            string `json:"ipaddress"`
+	Isdefault            bool   `json:"isdefault"`
+	Isolationuri         string `json:"isolationuri"`
+	Macaddress           string `json:"macaddress"`
+	Netmask              string `json:"netmask"`
+	Networkid            string `json:"networkid"`
+	Networkname          string `json:"networkname"`
+	Nsxlogicalswitch     string `json:"nsxlogicalswitch"`
+	Nsxlogicalswitchport string `json:"nsxlogicalswitchport"`
+	Secondaryip          []struct {
+		Id        string `json:"id"`
+		Ipaddress string `json:"ipaddress"`
+	} `json:"secondaryip"`
+	Traffictype      string `json:"traffictype"`
+	Type             string `json:"type"`
+	Virtualmachineid string `json:"virtualmachineid"`
+}
+
+type RemoveIpFromNicParams struct {
+	p map[string]interface{}
+}
+
+func (p *RemoveIpFromNicParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *RemoveIpFromNicParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new RemoveIpFromNicParams instance,
+// as then you are sure you have configured all required params
+func (s *NicService) NewRemoveIpFromNicParams(id string) *RemoveIpFromNicParams {
+	p := &RemoveIpFromNicParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Removes secondary IP from the NIC.
+func (s *NicService) RemoveIpFromNic(p *RemoveIpFromNicParams) (*RemoveIpFromNicResponse, error) {
+	resp, err := s.cs.newRequest("removeIpFromNic", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r RemoveIpFromNicResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type RemoveIpFromNicResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
+
+type UpdateVmNicIpParams struct {
+	p map[string]interface{}
+}
+
+func (p *UpdateVmNicIpParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["ipaddress"]; found {
+		u.Set("ipaddress", v.(string))
+	}
+	if v, found := p.p["nicid"]; found {
+		u.Set("nicid", v.(string))
+	}
+	return u
+}
+
+func (p *UpdateVmNicIpParams) SetIpaddress(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["ipaddress"] = v
+	return
+}
+
+func (p *UpdateVmNicIpParams) SetNicid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["nicid"] = v
+	return
+}
+
+// You should always use this function to get a new UpdateVmNicIpParams instance,
+// as then you are sure you have configured all required params
+func (s *NicService) NewUpdateVmNicIpParams(nicid string) *UpdateVmNicIpParams {
+	p := &UpdateVmNicIpParams{}
+	p.p = make(map[string]interface{})
+	p.p["nicid"] = nicid
+	return p
+}
+
+// Update the default Ip of a VM Nic
+func (s *NicService) UpdateVmNicIp(p *UpdateVmNicIpParams) (*UpdateVmNicIpResponse, error) {
+	resp, err := s.cs.newRequest("updateVmNicIp", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r UpdateVmNicIpResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type UpdateVmNicIpResponse struct {
+	JobID         string `json:"jobid"`
+	Account       string `json:"account"`
+	Affinitygroup []struct {
+		Account           string   `json:"account"`
+		Description       string   `json:"description"`
+		Domain            string   `json:"domain"`
+		Domainid          string   `json:"domainid"`
+		Id                string   `json:"id"`
+		Name              string   `json:"name"`
+		Project           string   `json:"project"`
+		Projectid         string   `json:"projectid"`
+		Type              string   `json:"type"`
+		VirtualmachineIds []string `json:"virtualmachineIds"`
+	} `json:"affinitygroup"`
+	Cpunumber             int               `json:"cpunumber"`
+	Cpuspeed              int               `json:"cpuspeed"`
+	Cpuused               string            `json:"cpuused"`
+	Created               string            `json:"created"`
+	Details               map[string]string `json:"details"`
+	Diskioread            int64             `json:"diskioread"`
+	Diskiowrite           int64             `json:"diskiowrite"`
+	Diskkbsread           int64             `json:"diskkbsread"`
+	Diskkbswrite          int64             `json:"diskkbswrite"`
+	Diskofferingid        string            `json:"diskofferingid"`
+	Diskofferingname      string            `json:"diskofferingname"`
+	Displayname           string            `json:"displayname"`
+	Displayvm             bool              `json:"displayvm"`
+	Domain                string            `json:"domain"`
+	Domainid              string            `json:"domainid"`
+	Forvirtualnetwork     bool              `json:"forvirtualnetwork"`
+	Group                 string            `json:"group"`
+	Groupid               string            `json:"groupid"`
+	Guestosid             string            `json:"guestosid"`
+	Haenable              bool              `json:"haenable"`
+	Hostid                string            `json:"hostid"`
+	Hostname              string            `json:"hostname"`
+	Hypervisor            string            `json:"hypervisor"`
+	Id                    string            `json:"id"`
+	Instancename          string            `json:"instancename"`
+	Isdynamicallyscalable bool              `json:"isdynamicallyscalable"`
+	Isodisplaytext        string            `json:"isodisplaytext"`
+	Isoid                 string            `json:"isoid"`
+	Isoname               string            `json:"isoname"`
+	Keypair               string            `json:"keypair"`
+	Memory                int               `json:"memory"`
+	Memoryintfreekbs      int64             `json:"memoryintfreekbs"`
+	Memorykbs             int64             `json:"memorykbs"`
+	Memorytargetkbs       int64             `json:"memorytargetkbs"`
+	Name                  string            `json:"name"`
+	Networkkbsread        int64             `json:"networkkbsread"`
+	Networkkbswrite       int64             `json:"networkkbswrite"`
+	Nic                   []struct {
+		Broadcasturi         string `json:"broadcasturi"`
+		Deviceid             string `json:"deviceid"`
+		Gateway              string `json:"gateway"`
+		Id                   string `json:"id"`
+		Ip6address           string `json:"ip6address"`
+		Ip6cidr              string `json:"ip6cidr"`
+		Ip6gateway           string `json:"ip6gateway"`
+		Ipaddress            string `json:"ipaddress"`
+		Isdefault            bool   `json:"isdefault"`
+		Isolationuri         string `json:"isolationuri"`
+		Macaddress           string `json:"macaddress"`
+		Netmask              string `json:"netmask"`
+		Networkid            string `json:"networkid"`
+		Networkname          string `json:"networkname"`
+		Nsxlogicalswitch     string `json:"nsxlogicalswitch"`
+		Nsxlogicalswitchport string `json:"nsxlogicalswitchport"`
+		Secondaryip          []struct {
+			Id        string `json:"id"`
+			Ipaddress string `json:"ipaddress"`
+		} `json:"secondaryip"`
+		Traffictype      string `json:"traffictype"`
+		Type             string `json:"type"`
+		Virtualmachineid string `json:"virtualmachineid"`
+	} `json:"nic"`
+	Ostypeid        int64  `json:"ostypeid"`
+	Password        string `json:"password"`
+	Passwordenabled bool   `json:"passwordenabled"`
+	Project         string `json:"project"`
+	Projectid       string `json:"projectid"`
+	Publicip        string `json:"publicip"`
+	Publicipid      string `json:"publicipid"`
+	Rootdeviceid    int64  `json:"rootdeviceid"`
+	Rootdevicetype  string `json:"rootdevicetype"`
+	Securitygroup   []struct {
+		Account     string `json:"account"`
+		Description string `json:"description"`
+		Domain      string `json:"domain"`
+		Domainid    string `json:"domainid"`
+		Egressrule  []struct {
+			Account           string `json:"account"`
+			Cidr              string `json:"cidr"`
+			Endport           int    `json:"endport"`
+			Icmpcode          int    `json:"icmpcode"`
+			Icmptype          int    `json:"icmptype"`
+			Protocol          string `json:"protocol"`
+			Ruleid            string `json:"ruleid"`
+			Securitygroupname string `json:"securitygroupname"`
+			Startport         int    `json:"startport"`
+			Tags              []struct {
+				Account      string `json:"account"`
+				Customer     string `json:"customer"`
+				Domain       string `json:"domain"`
+				Domainid     string `json:"domainid"`
+				Key          string `json:"key"`
+				Project      string `json:"project"`
+				Projectid    string `json:"projectid"`
+				Resourceid   string `json:"resourceid"`
+				Resourcetype string `json:"resourcetype"`
+				Value        string `json:"value"`
+			} `json:"tags"`
+		} `json:"egressrule"`
+		Id          string `json:"id"`
+		Ingressrule []struct {
+			Account           string `json:"account"`
+			Cidr              string `json:"cidr"`
+			Endport           int    `json:"endport"`
+			Icmpcode          int    `json:"icmpcode"`
+			Icmptype          int    `json:"icmptype"`
+			Protocol          string `json:"protocol"`
+			Ruleid            string `json:"ruleid"`
+			Securitygroupname string `json:"securitygroupname"`
+			Startport         int    `json:"startport"`
+			Tags              []struct {
+				Account      string `json:"account"`
+				Customer     string `json:"customer"`
+				Domain       string `json:"domain"`
+				Domainid     string `json:"domainid"`
+				Key          string `json:"key"`
+				Project      string `json:"project"`
+				Projectid    string `json:"projectid"`
+				Resourceid   string `json:"resourceid"`
+				Resourcetype string `json:"resourcetype"`
+				Value        string `json:"value"`
+			} `json:"tags"`
+		} `json:"ingressrule"`
+		Name      string `json:"name"`
+		Project   string `json:"project"`
+		Projectid string `json:"projectid"`
+		Tags      []struct {
+			Account      string `json:"account"`
+			Customer     string `json:"customer"`
+			Domain       string `json:"domain"`
+			Domainid     string `json:"domainid"`
+			Key          string `json:"key"`
+			Project      string `json:"project"`
+			Projectid    string `json:"projectid"`
+			Resourceid   string `json:"resourceid"`
+			Resourcetype string `json:"resourcetype"`
+			Value        string `json:"value"`
+		} `json:"tags"`
+		Virtualmachinecount int           `json:"virtualmachinecount"`
+		Virtualmachineids   []interface{} `json:"virtualmachineids"`
+	} `json:"securitygroup"`
+	Serviceofferingid   string `json:"serviceofferingid"`
+	Serviceofferingname string `json:"serviceofferingname"`
+	Servicestate        string `json:"servicestate"`
+	State               string `json:"state"`
+	Templatedisplaytext string `json:"templatedisplaytext"`
+	Templateid          string `json:"templateid"`
+	Templatename        string `json:"templatename"`
+	Userid              string `json:"userid"`
+	Username            string `json:"username"`
+	Vgpu                string `json:"vgpu"`
+	Zoneid              string `json:"zoneid"`
+	Zonename            string `json:"zonename"`
+}
diff --git a/vendor/github.com/xanzy/go-cloudstack/cloudstack/NiciraNVPService.go b/vendor/github.com/xanzy/go-cloudstack/cloudstack/NiciraNVPService.go
new file mode 100644
index 0000000..ec90845
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/cloudstack/NiciraNVPService.go
@@ -0,0 +1,348 @@
+//
+// Copyright 2018, Sander van Harmelen
+//
+// Licensed 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 cloudstack
+
+import (
+	"encoding/json"
+	"net/url"
+	"strconv"
+)
+
+type AddNiciraNvpDeviceParams struct {
+	p map[string]interface{}
+}
+
+func (p *AddNiciraNvpDeviceParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["hostname"]; found {
+		u.Set("hostname", v.(string))
+	}
+	if v, found := p.p["l2gatewayserviceuuid"]; found {
+		u.Set("l2gatewayserviceuuid", v.(string))
+	}
+	if v, found := p.p["l3gatewayserviceuuid"]; found {
+		u.Set("l3gatewayserviceuuid", v.(string))
+	}
+	if v, found := p.p["password"]; found {
+		u.Set("password", v.(string))
+	}
+	if v, found := p.p["physicalnetworkid"]; found {
+		u.Set("physicalnetworkid", v.(string))
+	}
+	if v, found := p.p["transportzoneuuid"]; found {
+		u.Set("transportzoneuuid", v.(string))
+	}
+	if v, found := p.p["username"]; found {
+		u.Set("username", v.(string))
+	}
+	return u
+}
+
+func (p *AddNiciraNvpDeviceParams) SetHostname(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["hostname"] = v
+	return
+}
+
+func (p *AddNiciraNvpDeviceParams) SetL2gatewayserviceuuid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["l2gatewayserviceuuid"] = v
+	return
+}
+
+func (p *AddNiciraNvpDeviceParams) SetL3gatewayserviceuuid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["l3gatewayserviceuuid"] = v
+	return
+}
+
+func (p *AddNiciraNvpDeviceParams) SetPassword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["password"] = v
+	return
+}
+
+func (p *AddNiciraNvpDeviceParams) SetPhysicalnetworkid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["physicalnetworkid"] = v
+	return
+}
+
+func (p *AddNiciraNvpDeviceParams) SetTransportzoneuuid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["transportzoneuuid"] = v
+	return
+}
+
+func (p *AddNiciraNvpDeviceParams) SetUsername(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["username"] = v
+	return
+}
+
+// You should always use this function to get a new AddNiciraNvpDeviceParams instance,
+// as then you are sure you have configured all required params
+func (s *NiciraNVPService) NewAddNiciraNvpDeviceParams(hostname string, password string, physicalnetworkid string, transportzoneuuid string, username string) *AddNiciraNvpDeviceParams {
+	p := &AddNiciraNvpDeviceParams{}
+	p.p = make(map[string]interface{})
+	p.p["hostname"] = hostname
+	p.p["password"] = password
+	p.p["physicalnetworkid"] = physicalnetworkid
+	p.p["transportzoneuuid"] = transportzoneuuid
+	p.p["username"] = username
+	return p
+}
+
+// Adds a Nicira NVP device
+func (s *NiciraNVPService) AddNiciraNvpDevice(p *AddNiciraNvpDeviceParams) (*AddNiciraNvpDeviceResponse, error) {
+	resp, err := s.cs.newRequest("addNiciraNvpDevice", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r AddNiciraNvpDeviceResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type AddNiciraNvpDeviceResponse struct {
+	JobID                string `json:"jobid"`
+	Hostname             string `json:"hostname"`
+	L2gatewayserviceuuid string `json:"l2gatewayserviceuuid"`
+	L3gatewayserviceuuid string `json:"l3gatewayserviceuuid"`
+	Niciradevicename     string `json:"niciradevicename"`
+	Nvpdeviceid          string `json:"nvpdeviceid"`
+	Physicalnetworkid    string `json:"physicalnetworkid"`
+	Provider             string `json:"provider"`
+	Transportzoneuuid    string `json:"transportzoneuuid"`
+}
+
+type DeleteNiciraNvpDeviceParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeleteNiciraNvpDeviceParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["nvpdeviceid"]; found {
+		u.Set("nvpdeviceid", v.(string))
+	}
+	return u
+}
+
+func (p *DeleteNiciraNvpDeviceParams) SetNvpdeviceid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["nvpdeviceid"] = v
+	return
+}
+
+// You should always use this function to get a new DeleteNiciraNvpDeviceParams instance,
+// as then you are sure you have configured all required params
+func (s *NiciraNVPService) NewDeleteNiciraNvpDeviceParams(nvpdeviceid string) *DeleteNiciraNvpDeviceParams {
+	p := &DeleteNiciraNvpDeviceParams{}
+	p.p = make(map[string]interface{})
+	p.p["nvpdeviceid"] = nvpdeviceid
+	return p
+}
+
+//  delete a nicira nvp device
+func (s *NiciraNVPService) DeleteNiciraNvpDevice(p *DeleteNiciraNvpDeviceParams) (*DeleteNiciraNvpDeviceResponse, error) {
+	resp, err := s.cs.newRequest("deleteNiciraNvpDevice", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeleteNiciraNvpDeviceResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type DeleteNiciraNvpDeviceResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
+
+type ListNiciraNvpDevicesParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListNiciraNvpDevicesParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["nvpdeviceid"]; found {
+		u.Set("nvpdeviceid", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["physicalnetworkid"]; found {
+		u.Set("physicalnetworkid", v.(string))
+	}
+	return u
+}
+
+func (p *ListNiciraNvpDevicesParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListNiciraNvpDevicesParams) SetNvpdeviceid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["nvpdeviceid"] = v
+	return
+}
+
+func (p *ListNiciraNvpDevicesParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListNiciraNvpDevicesParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListNiciraNvpDevicesParams) SetPhysicalnetworkid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["physicalnetworkid"] = v
+	return
+}
+
+// You should always use this function to get a new ListNiciraNvpDevicesParams instance,
+// as then you are sure you have configured all required params
+func (s *NiciraNVPService) NewListNiciraNvpDevicesParams() *ListNiciraNvpDevicesParams {
+	p := &ListNiciraNvpDevicesParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// Lists Nicira NVP devices
+func (s *NiciraNVPService) ListNiciraNvpDevices(p *ListNiciraNvpDevicesParams) (*ListNiciraNvpDevicesResponse, error) {
+	resp, err := s.cs.newRequest("listNiciraNvpDevices", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListNiciraNvpDevicesResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListNiciraNvpDevicesResponse struct {
+	Count            int                `json:"count"`
+	NiciraNvpDevices []*NiciraNvpDevice `json:"niciranvpdevice"`
+}
+
+type NiciraNvpDevice struct {
+	Hostname             string `json:"hostname"`
+	L2gatewayserviceuuid string `json:"l2gatewayserviceuuid"`
+	L3gatewayserviceuuid string `json:"l3gatewayserviceuuid"`
+	Niciradevicename     string `json:"niciradevicename"`
+	Nvpdeviceid          string `json:"nvpdeviceid"`
+	Physicalnetworkid    string `json:"physicalnetworkid"`
+	Provider             string `json:"provider"`
+	Transportzoneuuid    string `json:"transportzoneuuid"`
+}
diff --git a/vendor/github.com/xanzy/go-cloudstack/cloudstack/NuageVSPService.go b/vendor/github.com/xanzy/go-cloudstack/cloudstack/NuageVSPService.go
new file mode 100644
index 0000000..31f4df2
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/cloudstack/NuageVSPService.go
@@ -0,0 +1,527 @@
+//
+// Copyright 2018, Sander van Harmelen
+//
+// Licensed 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 cloudstack
+
+import (
+	"encoding/json"
+	"net/url"
+	"strconv"
+)
+
+type AddNuageVspDeviceParams struct {
+	p map[string]interface{}
+}
+
+func (p *AddNuageVspDeviceParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["apiversion"]; found {
+		u.Set("apiversion", v.(string))
+	}
+	if v, found := p.p["hostname"]; found {
+		u.Set("hostname", v.(string))
+	}
+	if v, found := p.p["password"]; found {
+		u.Set("password", v.(string))
+	}
+	if v, found := p.p["physicalnetworkid"]; found {
+		u.Set("physicalnetworkid", v.(string))
+	}
+	if v, found := p.p["port"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("port", vv)
+	}
+	if v, found := p.p["retrycount"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("retrycount", vv)
+	}
+	if v, found := p.p["retryinterval"]; found {
+		vv := strconv.FormatInt(v.(int64), 10)
+		u.Set("retryinterval", vv)
+	}
+	if v, found := p.p["username"]; found {
+		u.Set("username", v.(string))
+	}
+	return u
+}
+
+func (p *AddNuageVspDeviceParams) SetApiversion(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["apiversion"] = v
+	return
+}
+
+func (p *AddNuageVspDeviceParams) SetHostname(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["hostname"] = v
+	return
+}
+
+func (p *AddNuageVspDeviceParams) SetPassword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["password"] = v
+	return
+}
+
+func (p *AddNuageVspDeviceParams) SetPhysicalnetworkid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["physicalnetworkid"] = v
+	return
+}
+
+func (p *AddNuageVspDeviceParams) SetPort(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["port"] = v
+	return
+}
+
+func (p *AddNuageVspDeviceParams) SetRetrycount(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["retrycount"] = v
+	return
+}
+
+func (p *AddNuageVspDeviceParams) SetRetryinterval(v int64) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["retryinterval"] = v
+	return
+}
+
+func (p *AddNuageVspDeviceParams) SetUsername(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["username"] = v
+	return
+}
+
+// You should always use this function to get a new AddNuageVspDeviceParams instance,
+// as then you are sure you have configured all required params
+func (s *NuageVSPService) NewAddNuageVspDeviceParams(hostname string, password string, physicalnetworkid string, port int, username string) *AddNuageVspDeviceParams {
+	p := &AddNuageVspDeviceParams{}
+	p.p = make(map[string]interface{})
+	p.p["hostname"] = hostname
+	p.p["password"] = password
+	p.p["physicalnetworkid"] = physicalnetworkid
+	p.p["port"] = port
+	p.p["username"] = username
+	return p
+}
+
+// Adds a Nuage VSP device
+func (s *NuageVSPService) AddNuageVspDevice(p *AddNuageVspDeviceParams) (*AddNuageVspDeviceResponse, error) {
+	resp, err := s.cs.newRequest("addNuageVspDevice", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r AddNuageVspDeviceResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type AddNuageVspDeviceResponse struct {
+	JobID             string `json:"jobid"`
+	Apiversion        string `json:"apiversion"`
+	Cmsid             string `json:"cmsid"`
+	Hostname          string `json:"hostname"`
+	Nuagedevicename   string `json:"nuagedevicename"`
+	Physicalnetworkid string `json:"physicalnetworkid"`
+	Port              int    `json:"port"`
+	Provider          string `json:"provider"`
+	Retrycount        int    `json:"retrycount"`
+	Retryinterval     int64  `json:"retryinterval"`
+	Vspdeviceid       string `json:"vspdeviceid"`
+}
+
+type DeleteNuageVspDeviceParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeleteNuageVspDeviceParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["vspdeviceid"]; found {
+		u.Set("vspdeviceid", v.(string))
+	}
+	return u
+}
+
+func (p *DeleteNuageVspDeviceParams) SetVspdeviceid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["vspdeviceid"] = v
+	return
+}
+
+// You should always use this function to get a new DeleteNuageVspDeviceParams instance,
+// as then you are sure you have configured all required params
+func (s *NuageVSPService) NewDeleteNuageVspDeviceParams(vspdeviceid string) *DeleteNuageVspDeviceParams {
+	p := &DeleteNuageVspDeviceParams{}
+	p.p = make(map[string]interface{})
+	p.p["vspdeviceid"] = vspdeviceid
+	return p
+}
+
+// delete a nuage vsp device
+func (s *NuageVSPService) DeleteNuageVspDevice(p *DeleteNuageVspDeviceParams) (*DeleteNuageVspDeviceResponse, error) {
+	resp, err := s.cs.newRequest("deleteNuageVspDevice", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeleteNuageVspDeviceResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type DeleteNuageVspDeviceResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
+
+type ListNuageVspDevicesParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListNuageVspDevicesParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["physicalnetworkid"]; found {
+		u.Set("physicalnetworkid", v.(string))
+	}
+	if v, found := p.p["vspdeviceid"]; found {
+		u.Set("vspdeviceid", v.(string))
+	}
+	return u
+}
+
+func (p *ListNuageVspDevicesParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListNuageVspDevicesParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListNuageVspDevicesParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListNuageVspDevicesParams) SetPhysicalnetworkid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["physicalnetworkid"] = v
+	return
+}
+
+func (p *ListNuageVspDevicesParams) SetVspdeviceid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["vspdeviceid"] = v
+	return
+}
+
+// You should always use this function to get a new ListNuageVspDevicesParams instance,
+// as then you are sure you have configured all required params
+func (s *NuageVSPService) NewListNuageVspDevicesParams() *ListNuageVspDevicesParams {
+	p := &ListNuageVspDevicesParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// Lists Nuage VSP devices
+func (s *NuageVSPService) ListNuageVspDevices(p *ListNuageVspDevicesParams) (*ListNuageVspDevicesResponse, error) {
+	resp, err := s.cs.newRequest("listNuageVspDevices", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListNuageVspDevicesResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListNuageVspDevicesResponse struct {
+	Count           int               `json:"count"`
+	NuageVspDevices []*NuageVspDevice `json:"nuagevspdevice"`
+}
+
+type NuageVspDevice struct {
+	Apiversion        string `json:"apiversion"`
+	Cmsid             string `json:"cmsid"`
+	Hostname          string `json:"hostname"`
+	Nuagedevicename   string `json:"nuagedevicename"`
+	Physicalnetworkid string `json:"physicalnetworkid"`
+	Port              int    `json:"port"`
+	Provider          string `json:"provider"`
+	Retrycount        int    `json:"retrycount"`
+	Retryinterval     int64  `json:"retryinterval"`
+	Vspdeviceid       string `json:"vspdeviceid"`
+}
+
+type UpdateNuageVspDeviceParams struct {
+	p map[string]interface{}
+}
+
+func (p *UpdateNuageVspDeviceParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["apiversion"]; found {
+		u.Set("apiversion", v.(string))
+	}
+	if v, found := p.p["hostname"]; found {
+		u.Set("hostname", v.(string))
+	}
+	if v, found := p.p["password"]; found {
+		u.Set("password", v.(string))
+	}
+	if v, found := p.p["physicalnetworkid"]; found {
+		u.Set("physicalnetworkid", v.(string))
+	}
+	if v, found := p.p["port"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("port", vv)
+	}
+	if v, found := p.p["retrycount"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("retrycount", vv)
+	}
+	if v, found := p.p["retryinterval"]; found {
+		vv := strconv.FormatInt(v.(int64), 10)
+		u.Set("retryinterval", vv)
+	}
+	if v, found := p.p["username"]; found {
+		u.Set("username", v.(string))
+	}
+	return u
+}
+
+func (p *UpdateNuageVspDeviceParams) SetApiversion(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["apiversion"] = v
+	return
+}
+
+func (p *UpdateNuageVspDeviceParams) SetHostname(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["hostname"] = v
+	return
+}
+
+func (p *UpdateNuageVspDeviceParams) SetPassword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["password"] = v
+	return
+}
+
+func (p *UpdateNuageVspDeviceParams) SetPhysicalnetworkid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["physicalnetworkid"] = v
+	return
+}
+
+func (p *UpdateNuageVspDeviceParams) SetPort(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["port"] = v
+	return
+}
+
+func (p *UpdateNuageVspDeviceParams) SetRetrycount(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["retrycount"] = v
+	return
+}
+
+func (p *UpdateNuageVspDeviceParams) SetRetryinterval(v int64) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["retryinterval"] = v
+	return
+}
+
+func (p *UpdateNuageVspDeviceParams) SetUsername(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["username"] = v
+	return
+}
+
+// You should always use this function to get a new UpdateNuageVspDeviceParams instance,
+// as then you are sure you have configured all required params
+func (s *NuageVSPService) NewUpdateNuageVspDeviceParams(physicalnetworkid string) *UpdateNuageVspDeviceParams {
+	p := &UpdateNuageVspDeviceParams{}
+	p.p = make(map[string]interface{})
+	p.p["physicalnetworkid"] = physicalnetworkid
+	return p
+}
+
+// Update a Nuage VSP device
+func (s *NuageVSPService) UpdateNuageVspDevice(p *UpdateNuageVspDeviceParams) (*UpdateNuageVspDeviceResponse, error) {
+	resp, err := s.cs.newRequest("updateNuageVspDevice", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r UpdateNuageVspDeviceResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type UpdateNuageVspDeviceResponse struct {
+	JobID             string `json:"jobid"`
+	Apiversion        string `json:"apiversion"`
+	Cmsid             string `json:"cmsid"`
+	Hostname          string `json:"hostname"`
+	Nuagedevicename   string `json:"nuagedevicename"`
+	Physicalnetworkid string `json:"physicalnetworkid"`
+	Port              int    `json:"port"`
+	Provider          string `json:"provider"`
+	Retrycount        int    `json:"retrycount"`
+	Retryinterval     int64  `json:"retryinterval"`
+	Vspdeviceid       string `json:"vspdeviceid"`
+}
diff --git a/vendor/github.com/xanzy/go-cloudstack/cloudstack/OutofbandManagementService.go b/vendor/github.com/xanzy/go-cloudstack/cloudstack/OutofbandManagementService.go
new file mode 100644
index 0000000..eb12c45
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/cloudstack/OutofbandManagementService.go
@@ -0,0 +1,343 @@
+//
+// Copyright 2018, Sander van Harmelen
+//
+// Licensed 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 cloudstack
+
+import (
+	"encoding/json"
+	"net/url"
+	"strconv"
+)
+
+type ChangeOutOfBandManagementPasswordParams struct {
+	p map[string]interface{}
+}
+
+func (p *ChangeOutOfBandManagementPasswordParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["hostid"]; found {
+		u.Set("hostid", v.(string))
+	}
+	if v, found := p.p["password"]; found {
+		u.Set("password", v.(string))
+	}
+	return u
+}
+
+func (p *ChangeOutOfBandManagementPasswordParams) SetHostid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["hostid"] = v
+	return
+}
+
+func (p *ChangeOutOfBandManagementPasswordParams) SetPassword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["password"] = v
+	return
+}
+
+// You should always use this function to get a new ChangeOutOfBandManagementPasswordParams instance,
+// as then you are sure you have configured all required params
+func (s *OutofbandManagementService) NewChangeOutOfBandManagementPasswordParams(hostid string) *ChangeOutOfBandManagementPasswordParams {
+	p := &ChangeOutOfBandManagementPasswordParams{}
+	p.p = make(map[string]interface{})
+	p.p["hostid"] = hostid
+	return p
+}
+
+// Changes out-of-band management interface password on the host and updates the interface configuration in CloudStack if the operation succeeds, else reverts the old password
+func (s *OutofbandManagementService) ChangeOutOfBandManagementPassword(p *ChangeOutOfBandManagementPasswordParams) (*ChangeOutOfBandManagementPasswordResponse, error) {
+	resp, err := s.cs.newRequest("changeOutOfBandManagementPassword", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ChangeOutOfBandManagementPasswordResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type ChangeOutOfBandManagementPasswordResponse struct {
+	JobID       string `json:"jobid"`
+	Action      string `json:"action"`
+	Address     string `json:"address"`
+	Description string `json:"description"`
+	Driver      string `json:"driver"`
+	Enabled     bool   `json:"enabled"`
+	Hostid      string `json:"hostid"`
+	Password    string `json:"password"`
+	Port        string `json:"port"`
+	Powerstate  string `json:"powerstate"`
+	Status      bool   `json:"status"`
+	Username    string `json:"username"`
+}
+
+type ConfigureOutOfBandManagementParams struct {
+	p map[string]interface{}
+}
+
+func (p *ConfigureOutOfBandManagementParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["address"]; found {
+		u.Set("address", v.(string))
+	}
+	if v, found := p.p["driver"]; found {
+		u.Set("driver", v.(string))
+	}
+	if v, found := p.p["hostid"]; found {
+		u.Set("hostid", v.(string))
+	}
+	if v, found := p.p["password"]; found {
+		u.Set("password", v.(string))
+	}
+	if v, found := p.p["port"]; found {
+		u.Set("port", v.(string))
+	}
+	if v, found := p.p["username"]; found {
+		u.Set("username", v.(string))
+	}
+	return u
+}
+
+func (p *ConfigureOutOfBandManagementParams) SetAddress(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["address"] = v
+	return
+}
+
+func (p *ConfigureOutOfBandManagementParams) SetDriver(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["driver"] = v
+	return
+}
+
+func (p *ConfigureOutOfBandManagementParams) SetHostid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["hostid"] = v
+	return
+}
+
+func (p *ConfigureOutOfBandManagementParams) SetPassword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["password"] = v
+	return
+}
+
+func (p *ConfigureOutOfBandManagementParams) SetPort(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["port"] = v
+	return
+}
+
+func (p *ConfigureOutOfBandManagementParams) SetUsername(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["username"] = v
+	return
+}
+
+// You should always use this function to get a new ConfigureOutOfBandManagementParams instance,
+// as then you are sure you have configured all required params
+func (s *OutofbandManagementService) NewConfigureOutOfBandManagementParams(address string, driver string, hostid string, password string, port string, username string) *ConfigureOutOfBandManagementParams {
+	p := &ConfigureOutOfBandManagementParams{}
+	p.p = make(map[string]interface{})
+	p.p["address"] = address
+	p.p["driver"] = driver
+	p.p["hostid"] = hostid
+	p.p["password"] = password
+	p.p["port"] = port
+	p.p["username"] = username
+	return p
+}
+
+// Configures a host's out-of-band management interface
+func (s *OutofbandManagementService) ConfigureOutOfBandManagement(p *ConfigureOutOfBandManagementParams) (*OutOfBandManagementResponse, error) {
+	resp, err := s.cs.newRequest("configureOutOfBandManagement", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r OutOfBandManagementResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type OutOfBandManagementResponse struct {
+	Action      string `json:"action"`
+	Address     string `json:"address"`
+	Description string `json:"description"`
+	Driver      string `json:"driver"`
+	Enabled     bool   `json:"enabled"`
+	Hostid      string `json:"hostid"`
+	Password    string `json:"password"`
+	Port        string `json:"port"`
+	Powerstate  string `json:"powerstate"`
+	Status      bool   `json:"status"`
+	Username    string `json:"username"`
+}
+
+type IssueOutOfBandManagementPowerActionParams struct {
+	p map[string]interface{}
+}
+
+func (p *IssueOutOfBandManagementPowerActionParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["action"]; found {
+		u.Set("action", v.(string))
+	}
+	if v, found := p.p["hostid"]; found {
+		u.Set("hostid", v.(string))
+	}
+	if v, found := p.p["timeout"]; found {
+		vv := strconv.FormatInt(v.(int64), 10)
+		u.Set("timeout", vv)
+	}
+	return u
+}
+
+func (p *IssueOutOfBandManagementPowerActionParams) SetAction(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["action"] = v
+	return
+}
+
+func (p *IssueOutOfBandManagementPowerActionParams) SetHostid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["hostid"] = v
+	return
+}
+
+func (p *IssueOutOfBandManagementPowerActionParams) SetTimeout(v int64) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["timeout"] = v
+	return
+}
+
+// You should always use this function to get a new IssueOutOfBandManagementPowerActionParams instance,
+// as then you are sure you have configured all required params
+func (s *OutofbandManagementService) NewIssueOutOfBandManagementPowerActionParams(action string, hostid string) *IssueOutOfBandManagementPowerActionParams {
+	p := &IssueOutOfBandManagementPowerActionParams{}
+	p.p = make(map[string]interface{})
+	p.p["action"] = action
+	p.p["hostid"] = hostid
+	return p
+}
+
+// Initiates the specified power action to the host's out-of-band management interface
+func (s *OutofbandManagementService) IssueOutOfBandManagementPowerAction(p *IssueOutOfBandManagementPowerActionParams) (*IssueOutOfBandManagementPowerActionResponse, error) {
+	resp, err := s.cs.newRequest("issueOutOfBandManagementPowerAction", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r IssueOutOfBandManagementPowerActionResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type IssueOutOfBandManagementPowerActionResponse struct {
+	JobID       string `json:"jobid"`
+	Action      string `json:"action"`
+	Address     string `json:"address"`
+	Description string `json:"description"`
+	Driver      string `json:"driver"`
+	Enabled     bool   `json:"enabled"`
+	Hostid      string `json:"hostid"`
+	Password    string `json:"password"`
+	Port        string `json:"port"`
+	Powerstate  string `json:"powerstate"`
+	Status      bool   `json:"status"`
+	Username    string `json:"username"`
+}
diff --git a/vendor/github.com/xanzy/go-cloudstack/cloudstack/OvsElementService.go b/vendor/github.com/xanzy/go-cloudstack/cloudstack/OvsElementService.go
new file mode 100644
index 0000000..cd5b22e
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/cloudstack/OvsElementService.go
@@ -0,0 +1,270 @@
+//
+// Copyright 2018, Sander van Harmelen
+//
+// Licensed 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 cloudstack
+
+import (
+	"encoding/json"
+	"fmt"
+	"net/url"
+	"strconv"
+	"strings"
+)
+
+type ConfigureOvsElementParams struct {
+	p map[string]interface{}
+}
+
+func (p *ConfigureOvsElementParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["enabled"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("enabled", vv)
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *ConfigureOvsElementParams) SetEnabled(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["enabled"] = v
+	return
+}
+
+func (p *ConfigureOvsElementParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new ConfigureOvsElementParams instance,
+// as then you are sure you have configured all required params
+func (s *OvsElementService) NewConfigureOvsElementParams(enabled bool, id string) *ConfigureOvsElementParams {
+	p := &ConfigureOvsElementParams{}
+	p.p = make(map[string]interface{})
+	p.p["enabled"] = enabled
+	p.p["id"] = id
+	return p
+}
+
+// Configures an ovs element.
+func (s *OvsElementService) ConfigureOvsElement(p *ConfigureOvsElementParams) (*OvsElementResponse, error) {
+	resp, err := s.cs.newRequest("configureOvsElement", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r OvsElementResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type OvsElementResponse struct {
+	JobID     string `json:"jobid"`
+	Account   string `json:"account"`
+	Domain    string `json:"domain"`
+	Domainid  string `json:"domainid"`
+	Enabled   bool   `json:"enabled"`
+	Id        string `json:"id"`
+	Nspid     string `json:"nspid"`
+	Project   string `json:"project"`
+	Projectid string `json:"projectid"`
+}
+
+type ListOvsElementsParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListOvsElementsParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["enabled"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("enabled", vv)
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["nspid"]; found {
+		u.Set("nspid", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	return u
+}
+
+func (p *ListOvsElementsParams) SetEnabled(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["enabled"] = v
+	return
+}
+
+func (p *ListOvsElementsParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ListOvsElementsParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListOvsElementsParams) SetNspid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["nspid"] = v
+	return
+}
+
+func (p *ListOvsElementsParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListOvsElementsParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+// You should always use this function to get a new ListOvsElementsParams instance,
+// as then you are sure you have configured all required params
+func (s *OvsElementService) NewListOvsElementsParams() *ListOvsElementsParams {
+	p := &ListOvsElementsParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *OvsElementService) GetOvsElementByID(id string, opts ...OptionFunc) (*OvsElement, int, error) {
+	p := &ListOvsElementsParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["id"] = id
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return nil, -1, err
+		}
+	}
+
+	l, err := s.ListOvsElements(p)
+	if err != nil {
+		if strings.Contains(err.Error(), fmt.Sprintf(
+			"Invalid parameter id value=%s due to incorrect long value format, "+
+				"or entity does not exist", id)) {
+			return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
+		}
+		return nil, -1, err
+	}
+
+	if l.Count == 0 {
+		return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
+	}
+
+	if l.Count == 1 {
+		return l.OvsElements[0], l.Count, nil
+	}
+	return nil, l.Count, fmt.Errorf("There is more then one result for OvsElement UUID: %s!", id)
+}
+
+// Lists all available ovs elements.
+func (s *OvsElementService) ListOvsElements(p *ListOvsElementsParams) (*ListOvsElementsResponse, error) {
+	resp, err := s.cs.newRequest("listOvsElements", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListOvsElementsResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListOvsElementsResponse struct {
+	Count       int           `json:"count"`
+	OvsElements []*OvsElement `json:"ovselement"`
+}
+
+type OvsElement struct {
+	Account   string `json:"account"`
+	Domain    string `json:"domain"`
+	Domainid  string `json:"domainid"`
+	Enabled   bool   `json:"enabled"`
+	Id        string `json:"id"`
+	Nspid     string `json:"nspid"`
+	Project   string `json:"project"`
+	Projectid string `json:"projectid"`
+}
diff --git a/vendor/github.com/xanzy/go-cloudstack/cloudstack/PodService.go b/vendor/github.com/xanzy/go-cloudstack/cloudstack/PodService.go
new file mode 100644
index 0000000..e16a688
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/cloudstack/PodService.go
@@ -0,0 +1,889 @@
+//
+// Copyright 2018, Sander van Harmelen
+//
+// Licensed 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 cloudstack
+
+import (
+	"encoding/json"
+	"fmt"
+	"net/url"
+	"strconv"
+	"strings"
+)
+
+type CreatePodParams struct {
+	p map[string]interface{}
+}
+
+func (p *CreatePodParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["allocationstate"]; found {
+		u.Set("allocationstate", v.(string))
+	}
+	if v, found := p.p["endip"]; found {
+		u.Set("endip", v.(string))
+	}
+	if v, found := p.p["gateway"]; found {
+		u.Set("gateway", v.(string))
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["netmask"]; found {
+		u.Set("netmask", v.(string))
+	}
+	if v, found := p.p["startip"]; found {
+		u.Set("startip", v.(string))
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *CreatePodParams) SetAllocationstate(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["allocationstate"] = v
+	return
+}
+
+func (p *CreatePodParams) SetEndip(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["endip"] = v
+	return
+}
+
+func (p *CreatePodParams) SetGateway(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["gateway"] = v
+	return
+}
+
+func (p *CreatePodParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *CreatePodParams) SetNetmask(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["netmask"] = v
+	return
+}
+
+func (p *CreatePodParams) SetStartip(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["startip"] = v
+	return
+}
+
+func (p *CreatePodParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new CreatePodParams instance,
+// as then you are sure you have configured all required params
+func (s *PodService) NewCreatePodParams(gateway string, name string, netmask string, startip string, zoneid string) *CreatePodParams {
+	p := &CreatePodParams{}
+	p.p = make(map[string]interface{})
+	p.p["gateway"] = gateway
+	p.p["name"] = name
+	p.p["netmask"] = netmask
+	p.p["startip"] = startip
+	p.p["zoneid"] = zoneid
+	return p
+}
+
+// Creates a new Pod.
+func (s *PodService) CreatePod(p *CreatePodParams) (*CreatePodResponse, error) {
+	resp, err := s.cs.newRequest("createPod", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r CreatePodResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type CreatePodResponse struct {
+	Allocationstate string `json:"allocationstate"`
+	Capacity        []struct {
+		Capacitytotal int64  `json:"capacitytotal"`
+		Capacityused  int64  `json:"capacityused"`
+		Clusterid     string `json:"clusterid"`
+		Clustername   string `json:"clustername"`
+		Percentused   string `json:"percentused"`
+		Podid         string `json:"podid"`
+		Podname       string `json:"podname"`
+		Type          int    `json:"type"`
+		Zoneid        string `json:"zoneid"`
+		Zonename      string `json:"zonename"`
+	} `json:"capacity"`
+	Endip    string `json:"endip"`
+	Gateway  string `json:"gateway"`
+	Id       string `json:"id"`
+	Name     string `json:"name"`
+	Netmask  string `json:"netmask"`
+	Startip  string `json:"startip"`
+	Zoneid   string `json:"zoneid"`
+	Zonename string `json:"zonename"`
+}
+
+type DedicatePodParams struct {
+	p map[string]interface{}
+}
+
+func (p *DedicatePodParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["podid"]; found {
+		u.Set("podid", v.(string))
+	}
+	return u
+}
+
+func (p *DedicatePodParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *DedicatePodParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *DedicatePodParams) SetPodid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["podid"] = v
+	return
+}
+
+// You should always use this function to get a new DedicatePodParams instance,
+// as then you are sure you have configured all required params
+func (s *PodService) NewDedicatePodParams(domainid string, podid string) *DedicatePodParams {
+	p := &DedicatePodParams{}
+	p.p = make(map[string]interface{})
+	p.p["domainid"] = domainid
+	p.p["podid"] = podid
+	return p
+}
+
+// Dedicates a Pod.
+func (s *PodService) DedicatePod(p *DedicatePodParams) (*DedicatePodResponse, error) {
+	resp, err := s.cs.newRequest("dedicatePod", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DedicatePodResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type DedicatePodResponse struct {
+	JobID           string `json:"jobid"`
+	Accountid       string `json:"accountid"`
+	Affinitygroupid string `json:"affinitygroupid"`
+	Domainid        string `json:"domainid"`
+	Id              string `json:"id"`
+	Podid           string `json:"podid"`
+	Podname         string `json:"podname"`
+}
+
+type DeletePodParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeletePodParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *DeletePodParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new DeletePodParams instance,
+// as then you are sure you have configured all required params
+func (s *PodService) NewDeletePodParams(id string) *DeletePodParams {
+	p := &DeletePodParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Deletes a Pod.
+func (s *PodService) DeletePod(p *DeletePodParams) (*DeletePodResponse, error) {
+	resp, err := s.cs.newRequest("deletePod", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeletePodResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type DeletePodResponse struct {
+	Displaytext string `json:"displaytext"`
+	Success     string `json:"success"`
+}
+
+type ListDedicatedPodsParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListDedicatedPodsParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["affinitygroupid"]; found {
+		u.Set("affinitygroupid", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["podid"]; found {
+		u.Set("podid", v.(string))
+	}
+	return u
+}
+
+func (p *ListDedicatedPodsParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *ListDedicatedPodsParams) SetAffinitygroupid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["affinitygroupid"] = v
+	return
+}
+
+func (p *ListDedicatedPodsParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *ListDedicatedPodsParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListDedicatedPodsParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListDedicatedPodsParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListDedicatedPodsParams) SetPodid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["podid"] = v
+	return
+}
+
+// You should always use this function to get a new ListDedicatedPodsParams instance,
+// as then you are sure you have configured all required params
+func (s *PodService) NewListDedicatedPodsParams() *ListDedicatedPodsParams {
+	p := &ListDedicatedPodsParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// Lists dedicated pods.
+func (s *PodService) ListDedicatedPods(p *ListDedicatedPodsParams) (*ListDedicatedPodsResponse, error) {
+	resp, err := s.cs.newRequest("listDedicatedPods", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListDedicatedPodsResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListDedicatedPodsResponse struct {
+	Count         int             `json:"count"`
+	DedicatedPods []*DedicatedPod `json:"dedicatedpod"`
+}
+
+type DedicatedPod struct {
+	Accountid       string `json:"accountid"`
+	Affinitygroupid string `json:"affinitygroupid"`
+	Domainid        string `json:"domainid"`
+	Id              string `json:"id"`
+	Podid           string `json:"podid"`
+	Podname         string `json:"podname"`
+}
+
+type ListPodsParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListPodsParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["allocationstate"]; found {
+		u.Set("allocationstate", v.(string))
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["showcapacities"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("showcapacities", vv)
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *ListPodsParams) SetAllocationstate(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["allocationstate"] = v
+	return
+}
+
+func (p *ListPodsParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ListPodsParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListPodsParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *ListPodsParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListPodsParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListPodsParams) SetShowcapacities(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["showcapacities"] = v
+	return
+}
+
+func (p *ListPodsParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new ListPodsParams instance,
+// as then you are sure you have configured all required params
+func (s *PodService) NewListPodsParams() *ListPodsParams {
+	p := &ListPodsParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *PodService) GetPodID(name string, opts ...OptionFunc) (string, int, error) {
+	p := &ListPodsParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["name"] = name
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return "", -1, err
+		}
+	}
+
+	l, err := s.ListPods(p)
+	if err != nil {
+		return "", -1, err
+	}
+
+	if l.Count == 0 {
+		return "", l.Count, fmt.Errorf("No match found for %s: %+v", name, l)
+	}
+
+	if l.Count == 1 {
+		return l.Pods[0].Id, l.Count, nil
+	}
+
+	if l.Count > 1 {
+		for _, v := range l.Pods {
+			if v.Name == name {
+				return v.Id, l.Count, nil
+			}
+		}
+	}
+	return "", l.Count, fmt.Errorf("Could not find an exact match for %s: %+v", name, l)
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *PodService) GetPodByName(name string, opts ...OptionFunc) (*Pod, int, error) {
+	id, count, err := s.GetPodID(name, opts...)
+	if err != nil {
+		return nil, count, err
+	}
+
+	r, count, err := s.GetPodByID(id, opts...)
+	if err != nil {
+		return nil, count, err
+	}
+	return r, count, nil
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *PodService) GetPodByID(id string, opts ...OptionFunc) (*Pod, int, error) {
+	p := &ListPodsParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["id"] = id
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return nil, -1, err
+		}
+	}
+
+	l, err := s.ListPods(p)
+	if err != nil {
+		if strings.Contains(err.Error(), fmt.Sprintf(
+			"Invalid parameter id value=%s due to incorrect long value format, "+
+				"or entity does not exist", id)) {
+			return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
+		}
+		return nil, -1, err
+	}
+
+	if l.Count == 0 {
+		return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
+	}
+
+	if l.Count == 1 {
+		return l.Pods[0], l.Count, nil
+	}
+	return nil, l.Count, fmt.Errorf("There is more then one result for Pod UUID: %s!", id)
+}
+
+// Lists all Pods.
+func (s *PodService) ListPods(p *ListPodsParams) (*ListPodsResponse, error) {
+	resp, err := s.cs.newRequest("listPods", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListPodsResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListPodsResponse struct {
+	Count int    `json:"count"`
+	Pods  []*Pod `json:"pod"`
+}
+
+type Pod struct {
+	Allocationstate string `json:"allocationstate"`
+	Capacity        []struct {
+		Capacitytotal int64  `json:"capacitytotal"`
+		Capacityused  int64  `json:"capacityused"`
+		Clusterid     string `json:"clusterid"`
+		Clustername   string `json:"clustername"`
+		Percentused   string `json:"percentused"`
+		Podid         string `json:"podid"`
+		Podname       string `json:"podname"`
+		Type          int    `json:"type"`
+		Zoneid        string `json:"zoneid"`
+		Zonename      string `json:"zonename"`
+	} `json:"capacity"`
+	Endip    string `json:"endip"`
+	Gateway  string `json:"gateway"`
+	Id       string `json:"id"`
+	Name     string `json:"name"`
+	Netmask  string `json:"netmask"`
+	Startip  string `json:"startip"`
+	Zoneid   string `json:"zoneid"`
+	Zonename string `json:"zonename"`
+}
+
+type ReleaseDedicatedPodParams struct {
+	p map[string]interface{}
+}
+
+func (p *ReleaseDedicatedPodParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["podid"]; found {
+		u.Set("podid", v.(string))
+	}
+	return u
+}
+
+func (p *ReleaseDedicatedPodParams) SetPodid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["podid"] = v
+	return
+}
+
+// You should always use this function to get a new ReleaseDedicatedPodParams instance,
+// as then you are sure you have configured all required params
+func (s *PodService) NewReleaseDedicatedPodParams(podid string) *ReleaseDedicatedPodParams {
+	p := &ReleaseDedicatedPodParams{}
+	p.p = make(map[string]interface{})
+	p.p["podid"] = podid
+	return p
+}
+
+// Release the dedication for the pod
+func (s *PodService) ReleaseDedicatedPod(p *ReleaseDedicatedPodParams) (*ReleaseDedicatedPodResponse, error) {
+	resp, err := s.cs.newRequest("releaseDedicatedPod", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ReleaseDedicatedPodResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type ReleaseDedicatedPodResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
+
+type UpdatePodParams struct {
+	p map[string]interface{}
+}
+
+func (p *UpdatePodParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["allocationstate"]; found {
+		u.Set("allocationstate", v.(string))
+	}
+	if v, found := p.p["endip"]; found {
+		u.Set("endip", v.(string))
+	}
+	if v, found := p.p["gateway"]; found {
+		u.Set("gateway", v.(string))
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["netmask"]; found {
+		u.Set("netmask", v.(string))
+	}
+	if v, found := p.p["startip"]; found {
+		u.Set("startip", v.(string))
+	}
+	return u
+}
+
+func (p *UpdatePodParams) SetAllocationstate(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["allocationstate"] = v
+	return
+}
+
+func (p *UpdatePodParams) SetEndip(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["endip"] = v
+	return
+}
+
+func (p *UpdatePodParams) SetGateway(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["gateway"] = v
+	return
+}
+
+func (p *UpdatePodParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *UpdatePodParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *UpdatePodParams) SetNetmask(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["netmask"] = v
+	return
+}
+
+func (p *UpdatePodParams) SetStartip(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["startip"] = v
+	return
+}
+
+// You should always use this function to get a new UpdatePodParams instance,
+// as then you are sure you have configured all required params
+func (s *PodService) NewUpdatePodParams(id string) *UpdatePodParams {
+	p := &UpdatePodParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Updates a Pod.
+func (s *PodService) UpdatePod(p *UpdatePodParams) (*UpdatePodResponse, error) {
+	resp, err := s.cs.newRequest("updatePod", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r UpdatePodResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type UpdatePodResponse struct {
+	Allocationstate string `json:"allocationstate"`
+	Capacity        []struct {
+		Capacitytotal int64  `json:"capacitytotal"`
+		Capacityused  int64  `json:"capacityused"`
+		Clusterid     string `json:"clusterid"`
+		Clustername   string `json:"clustername"`
+		Percentused   string `json:"percentused"`
+		Podid         string `json:"podid"`
+		Podname       string `json:"podname"`
+		Type          int    `json:"type"`
+		Zoneid        string `json:"zoneid"`
+		Zonename      string `json:"zonename"`
+	} `json:"capacity"`
+	Endip    string `json:"endip"`
+	Gateway  string `json:"gateway"`
+	Id       string `json:"id"`
+	Name     string `json:"name"`
+	Netmask  string `json:"netmask"`
+	Startip  string `json:"startip"`
+	Zoneid   string `json:"zoneid"`
+	Zonename string `json:"zonename"`
+}
diff --git a/vendor/github.com/xanzy/go-cloudstack/cloudstack/PoolService.go b/vendor/github.com/xanzy/go-cloudstack/cloudstack/PoolService.go
new file mode 100644
index 0000000..cdd8e59
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/cloudstack/PoolService.go
@@ -0,0 +1,804 @@
+//
+// Copyright 2018, Sander van Harmelen
+//
+// Licensed 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 cloudstack
+
+import (
+	"encoding/json"
+	"fmt"
+	"net/url"
+	"strconv"
+	"strings"
+)
+
+type CreateStoragePoolParams struct {
+	p map[string]interface{}
+}
+
+func (p *CreateStoragePoolParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["capacitybytes"]; found {
+		vv := strconv.FormatInt(v.(int64), 10)
+		u.Set("capacitybytes", vv)
+	}
+	if v, found := p.p["capacityiops"]; found {
+		vv := strconv.FormatInt(v.(int64), 10)
+		u.Set("capacityiops", vv)
+	}
+	if v, found := p.p["clusterid"]; found {
+		u.Set("clusterid", v.(string))
+	}
+	if v, found := p.p["details"]; found {
+		i := 0
+		for k, vv := range v.(map[string]string) {
+			u.Set(fmt.Sprintf("details[%d].%s", i, k), vv)
+			i++
+		}
+	}
+	if v, found := p.p["hypervisor"]; found {
+		u.Set("hypervisor", v.(string))
+	}
+	if v, found := p.p["managed"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("managed", vv)
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["podid"]; found {
+		u.Set("podid", v.(string))
+	}
+	if v, found := p.p["provider"]; found {
+		u.Set("provider", v.(string))
+	}
+	if v, found := p.p["scope"]; found {
+		u.Set("scope", v.(string))
+	}
+	if v, found := p.p["tags"]; found {
+		u.Set("tags", v.(string))
+	}
+	if v, found := p.p["url"]; found {
+		u.Set("url", v.(string))
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *CreateStoragePoolParams) SetCapacitybytes(v int64) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["capacitybytes"] = v
+	return
+}
+
+func (p *CreateStoragePoolParams) SetCapacityiops(v int64) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["capacityiops"] = v
+	return
+}
+
+func (p *CreateStoragePoolParams) SetClusterid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["clusterid"] = v
+	return
+}
+
+func (p *CreateStoragePoolParams) SetDetails(v map[string]string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["details"] = v
+	return
+}
+
+func (p *CreateStoragePoolParams) SetHypervisor(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["hypervisor"] = v
+	return
+}
+
+func (p *CreateStoragePoolParams) SetManaged(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["managed"] = v
+	return
+}
+
+func (p *CreateStoragePoolParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *CreateStoragePoolParams) SetPodid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["podid"] = v
+	return
+}
+
+func (p *CreateStoragePoolParams) SetProvider(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["provider"] = v
+	return
+}
+
+func (p *CreateStoragePoolParams) SetScope(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["scope"] = v
+	return
+}
+
+func (p *CreateStoragePoolParams) SetTags(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["tags"] = v
+	return
+}
+
+func (p *CreateStoragePoolParams) SetUrl(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["url"] = v
+	return
+}
+
+func (p *CreateStoragePoolParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new CreateStoragePoolParams instance,
+// as then you are sure you have configured all required params
+func (s *PoolService) NewCreateStoragePoolParams(name string, url string, zoneid string) *CreateStoragePoolParams {
+	p := &CreateStoragePoolParams{}
+	p.p = make(map[string]interface{})
+	p.p["name"] = name
+	p.p["url"] = url
+	p.p["zoneid"] = zoneid
+	return p
+}
+
+// Creates a storage pool.
+func (s *PoolService) CreateStoragePool(p *CreateStoragePoolParams) (*CreateStoragePoolResponse, error) {
+	resp, err := s.cs.newRequest("createStoragePool", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r CreateStoragePoolResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type CreateStoragePoolResponse struct {
+	Capacityiops         int64             `json:"capacityiops"`
+	Clusterid            string            `json:"clusterid"`
+	Clustername          string            `json:"clustername"`
+	Created              string            `json:"created"`
+	Disksizeallocated    int64             `json:"disksizeallocated"`
+	Disksizetotal        int64             `json:"disksizetotal"`
+	Disksizeused         int64             `json:"disksizeused"`
+	Hypervisor           string            `json:"hypervisor"`
+	Id                   string            `json:"id"`
+	Ipaddress            string            `json:"ipaddress"`
+	Name                 string            `json:"name"`
+	Overprovisionfactor  string            `json:"overprovisionfactor"`
+	Path                 string            `json:"path"`
+	Podid                string            `json:"podid"`
+	Podname              string            `json:"podname"`
+	Scope                string            `json:"scope"`
+	State                string            `json:"state"`
+	Storagecapabilities  map[string]string `json:"storagecapabilities"`
+	Suitableformigration bool              `json:"suitableformigration"`
+	Tags                 string            `json:"tags"`
+	Type                 string            `json:"type"`
+	Zoneid               string            `json:"zoneid"`
+	Zonename             string            `json:"zonename"`
+}
+
+type DeleteStoragePoolParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeleteStoragePoolParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["forced"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("forced", vv)
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *DeleteStoragePoolParams) SetForced(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["forced"] = v
+	return
+}
+
+func (p *DeleteStoragePoolParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new DeleteStoragePoolParams instance,
+// as then you are sure you have configured all required params
+func (s *PoolService) NewDeleteStoragePoolParams(id string) *DeleteStoragePoolParams {
+	p := &DeleteStoragePoolParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Deletes a storage pool.
+func (s *PoolService) DeleteStoragePool(p *DeleteStoragePoolParams) (*DeleteStoragePoolResponse, error) {
+	resp, err := s.cs.newRequest("deleteStoragePool", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeleteStoragePoolResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type DeleteStoragePoolResponse struct {
+	Displaytext string `json:"displaytext"`
+	Success     string `json:"success"`
+}
+
+type FindStoragePoolsForMigrationParams struct {
+	p map[string]interface{}
+}
+
+func (p *FindStoragePoolsForMigrationParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	return u
+}
+
+func (p *FindStoragePoolsForMigrationParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *FindStoragePoolsForMigrationParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *FindStoragePoolsForMigrationParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *FindStoragePoolsForMigrationParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+// You should always use this function to get a new FindStoragePoolsForMigrationParams instance,
+// as then you are sure you have configured all required params
+func (s *PoolService) NewFindStoragePoolsForMigrationParams(id string) *FindStoragePoolsForMigrationParams {
+	p := &FindStoragePoolsForMigrationParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Lists storage pools available for migration of a volume.
+func (s *PoolService) FindStoragePoolsForMigration(p *FindStoragePoolsForMigrationParams) (*FindStoragePoolsForMigrationResponse, error) {
+	resp, err := s.cs.newRequest("findStoragePoolsForMigration", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r FindStoragePoolsForMigrationResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type FindStoragePoolsForMigrationResponse struct {
+	Capacityiops         int64             `json:"capacityiops"`
+	Clusterid            string            `json:"clusterid"`
+	Clustername          string            `json:"clustername"`
+	Created              string            `json:"created"`
+	Disksizeallocated    int64             `json:"disksizeallocated"`
+	Disksizetotal        int64             `json:"disksizetotal"`
+	Disksizeused         int64             `json:"disksizeused"`
+	Hypervisor           string            `json:"hypervisor"`
+	Id                   string            `json:"id"`
+	Ipaddress            string            `json:"ipaddress"`
+	Name                 string            `json:"name"`
+	Overprovisionfactor  string            `json:"overprovisionfactor"`
+	Path                 string            `json:"path"`
+	Podid                string            `json:"podid"`
+	Podname              string            `json:"podname"`
+	Scope                string            `json:"scope"`
+	State                string            `json:"state"`
+	Storagecapabilities  map[string]string `json:"storagecapabilities"`
+	Suitableformigration bool              `json:"suitableformigration"`
+	Tags                 string            `json:"tags"`
+	Type                 string            `json:"type"`
+	Zoneid               string            `json:"zoneid"`
+	Zonename             string            `json:"zonename"`
+}
+
+type ListStoragePoolsParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListStoragePoolsParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["clusterid"]; found {
+		u.Set("clusterid", v.(string))
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["ipaddress"]; found {
+		u.Set("ipaddress", v.(string))
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["path"]; found {
+		u.Set("path", v.(string))
+	}
+	if v, found := p.p["podid"]; found {
+		u.Set("podid", v.(string))
+	}
+	if v, found := p.p["scope"]; found {
+		u.Set("scope", v.(string))
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *ListStoragePoolsParams) SetClusterid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["clusterid"] = v
+	return
+}
+
+func (p *ListStoragePoolsParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ListStoragePoolsParams) SetIpaddress(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["ipaddress"] = v
+	return
+}
+
+func (p *ListStoragePoolsParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListStoragePoolsParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *ListStoragePoolsParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListStoragePoolsParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListStoragePoolsParams) SetPath(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["path"] = v
+	return
+}
+
+func (p *ListStoragePoolsParams) SetPodid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["podid"] = v
+	return
+}
+
+func (p *ListStoragePoolsParams) SetScope(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["scope"] = v
+	return
+}
+
+func (p *ListStoragePoolsParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new ListStoragePoolsParams instance,
+// as then you are sure you have configured all required params
+func (s *PoolService) NewListStoragePoolsParams() *ListStoragePoolsParams {
+	p := &ListStoragePoolsParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *PoolService) GetStoragePoolID(name string, opts ...OptionFunc) (string, int, error) {
+	p := &ListStoragePoolsParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["name"] = name
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return "", -1, err
+		}
+	}
+
+	l, err := s.ListStoragePools(p)
+	if err != nil {
+		return "", -1, err
+	}
+
+	if l.Count == 0 {
+		return "", l.Count, fmt.Errorf("No match found for %s: %+v", name, l)
+	}
+
+	if l.Count == 1 {
+		return l.StoragePools[0].Id, l.Count, nil
+	}
+
+	if l.Count > 1 {
+		for _, v := range l.StoragePools {
+			if v.Name == name {
+				return v.Id, l.Count, nil
+			}
+		}
+	}
+	return "", l.Count, fmt.Errorf("Could not find an exact match for %s: %+v", name, l)
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *PoolService) GetStoragePoolByName(name string, opts ...OptionFunc) (*StoragePool, int, error) {
+	id, count, err := s.GetStoragePoolID(name, opts...)
+	if err != nil {
+		return nil, count, err
+	}
+
+	r, count, err := s.GetStoragePoolByID(id, opts...)
+	if err != nil {
+		return nil, count, err
+	}
+	return r, count, nil
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *PoolService) GetStoragePoolByID(id string, opts ...OptionFunc) (*StoragePool, int, error) {
+	p := &ListStoragePoolsParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["id"] = id
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return nil, -1, err
+		}
+	}
+
+	l, err := s.ListStoragePools(p)
+	if err != nil {
+		if strings.Contains(err.Error(), fmt.Sprintf(
+			"Invalid parameter id value=%s due to incorrect long value format, "+
+				"or entity does not exist", id)) {
+			return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
+		}
+		return nil, -1, err
+	}
+
+	if l.Count == 0 {
+		return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
+	}
+
+	if l.Count == 1 {
+		return l.StoragePools[0], l.Count, nil
+	}
+	return nil, l.Count, fmt.Errorf("There is more then one result for StoragePool UUID: %s!", id)
+}
+
+// Lists storage pools.
+func (s *PoolService) ListStoragePools(p *ListStoragePoolsParams) (*ListStoragePoolsResponse, error) {
+	resp, err := s.cs.newRequest("listStoragePools", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListStoragePoolsResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListStoragePoolsResponse struct {
+	Count        int            `json:"count"`
+	StoragePools []*StoragePool `json:"storagepool"`
+}
+
+type StoragePool struct {
+	Capacityiops         int64             `json:"capacityiops"`
+	Clusterid            string            `json:"clusterid"`
+	Clustername          string            `json:"clustername"`
+	Created              string            `json:"created"`
+	Disksizeallocated    int64             `json:"disksizeallocated"`
+	Disksizetotal        int64             `json:"disksizetotal"`
+	Disksizeused         int64             `json:"disksizeused"`
+	Hypervisor           string            `json:"hypervisor"`
+	Id                   string            `json:"id"`
+	Ipaddress            string            `json:"ipaddress"`
+	Name                 string            `json:"name"`
+	Overprovisionfactor  string            `json:"overprovisionfactor"`
+	Path                 string            `json:"path"`
+	Podid                string            `json:"podid"`
+	Podname              string            `json:"podname"`
+	Scope                string            `json:"scope"`
+	State                string            `json:"state"`
+	Storagecapabilities  map[string]string `json:"storagecapabilities"`
+	Suitableformigration bool              `json:"suitableformigration"`
+	Tags                 string            `json:"tags"`
+	Type                 string            `json:"type"`
+	Zoneid               string            `json:"zoneid"`
+	Zonename             string            `json:"zonename"`
+}
+
+type UpdateStoragePoolParams struct {
+	p map[string]interface{}
+}
+
+func (p *UpdateStoragePoolParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["capacitybytes"]; found {
+		vv := strconv.FormatInt(v.(int64), 10)
+		u.Set("capacitybytes", vv)
+	}
+	if v, found := p.p["capacityiops"]; found {
+		vv := strconv.FormatInt(v.(int64), 10)
+		u.Set("capacityiops", vv)
+	}
+	if v, found := p.p["enabled"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("enabled", vv)
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["tags"]; found {
+		vv := strings.Join(v.([]string), ",")
+		u.Set("tags", vv)
+	}
+	return u
+}
+
+func (p *UpdateStoragePoolParams) SetCapacitybytes(v int64) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["capacitybytes"] = v
+	return
+}
+
+func (p *UpdateStoragePoolParams) SetCapacityiops(v int64) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["capacityiops"] = v
+	return
+}
+
+func (p *UpdateStoragePoolParams) SetEnabled(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["enabled"] = v
+	return
+}
+
+func (p *UpdateStoragePoolParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *UpdateStoragePoolParams) SetTags(v []string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["tags"] = v
+	return
+}
+
+// You should always use this function to get a new UpdateStoragePoolParams instance,
+// as then you are sure you have configured all required params
+func (s *PoolService) NewUpdateStoragePoolParams(id string) *UpdateStoragePoolParams {
+	p := &UpdateStoragePoolParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Updates a storage pool.
+func (s *PoolService) UpdateStoragePool(p *UpdateStoragePoolParams) (*UpdateStoragePoolResponse, error) {
+	resp, err := s.cs.newRequest("updateStoragePool", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r UpdateStoragePoolResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type UpdateStoragePoolResponse struct {
+	Capacityiops         int64             `json:"capacityiops"`
+	Clusterid            string            `json:"clusterid"`
+	Clustername          string            `json:"clustername"`
+	Created              string            `json:"created"`
+	Disksizeallocated    int64             `json:"disksizeallocated"`
+	Disksizetotal        int64             `json:"disksizetotal"`
+	Disksizeused         int64             `json:"disksizeused"`
+	Hypervisor           string            `json:"hypervisor"`
+	Id                   string            `json:"id"`
+	Ipaddress            string            `json:"ipaddress"`
+	Name                 string            `json:"name"`
+	Overprovisionfactor  string            `json:"overprovisionfactor"`
+	Path                 string            `json:"path"`
+	Podid                string            `json:"podid"`
+	Podname              string            `json:"podname"`
+	Scope                string            `json:"scope"`
+	State                string            `json:"state"`
+	Storagecapabilities  map[string]string `json:"storagecapabilities"`
+	Suitableformigration bool              `json:"suitableformigration"`
+	Tags                 string            `json:"tags"`
+	Type                 string            `json:"type"`
+	Zoneid               string            `json:"zoneid"`
+	Zonename             string            `json:"zonename"`
+}
diff --git a/vendor/github.com/xanzy/go-cloudstack/cloudstack/PortableIPService.go b/vendor/github.com/xanzy/go-cloudstack/cloudstack/PortableIPService.go
new file mode 100644
index 0000000..bf7bfa6
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/cloudstack/PortableIPService.go
@@ -0,0 +1,396 @@
+//
+// Copyright 2018, Sander van Harmelen
+//
+// Licensed 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 cloudstack
+
+import (
+	"encoding/json"
+	"fmt"
+	"net/url"
+	"strconv"
+	"strings"
+)
+
+type CreatePortableIpRangeParams struct {
+	p map[string]interface{}
+}
+
+func (p *CreatePortableIpRangeParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["endip"]; found {
+		u.Set("endip", v.(string))
+	}
+	if v, found := p.p["gateway"]; found {
+		u.Set("gateway", v.(string))
+	}
+	if v, found := p.p["netmask"]; found {
+		u.Set("netmask", v.(string))
+	}
+	if v, found := p.p["regionid"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("regionid", vv)
+	}
+	if v, found := p.p["startip"]; found {
+		u.Set("startip", v.(string))
+	}
+	if v, found := p.p["vlan"]; found {
+		u.Set("vlan", v.(string))
+	}
+	return u
+}
+
+func (p *CreatePortableIpRangeParams) SetEndip(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["endip"] = v
+	return
+}
+
+func (p *CreatePortableIpRangeParams) SetGateway(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["gateway"] = v
+	return
+}
+
+func (p *CreatePortableIpRangeParams) SetNetmask(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["netmask"] = v
+	return
+}
+
+func (p *CreatePortableIpRangeParams) SetRegionid(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["regionid"] = v
+	return
+}
+
+func (p *CreatePortableIpRangeParams) SetStartip(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["startip"] = v
+	return
+}
+
+func (p *CreatePortableIpRangeParams) SetVlan(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["vlan"] = v
+	return
+}
+
+// You should always use this function to get a new CreatePortableIpRangeParams instance,
+// as then you are sure you have configured all required params
+func (s *PortableIPService) NewCreatePortableIpRangeParams(endip string, gateway string, netmask string, regionid int, startip string) *CreatePortableIpRangeParams {
+	p := &CreatePortableIpRangeParams{}
+	p.p = make(map[string]interface{})
+	p.p["endip"] = endip
+	p.p["gateway"] = gateway
+	p.p["netmask"] = netmask
+	p.p["regionid"] = regionid
+	p.p["startip"] = startip
+	return p
+}
+
+// adds a range of portable public IP's to a region
+func (s *PortableIPService) CreatePortableIpRange(p *CreatePortableIpRangeParams) (*CreatePortableIpRangeResponse, error) {
+	resp, err := s.cs.newRequest("createPortableIpRange", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r CreatePortableIpRangeResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type CreatePortableIpRangeResponse struct {
+	JobID             string `json:"jobid"`
+	Endip             string `json:"endip"`
+	Gateway           string `json:"gateway"`
+	Id                string `json:"id"`
+	Netmask           string `json:"netmask"`
+	Portableipaddress []struct {
+		Accountid         string `json:"accountid"`
+		Allocated         string `json:"allocated"`
+		Domainid          string `json:"domainid"`
+		Ipaddress         string `json:"ipaddress"`
+		Networkid         string `json:"networkid"`
+		Physicalnetworkid string `json:"physicalnetworkid"`
+		Regionid          int    `json:"regionid"`
+		State             string `json:"state"`
+		Vpcid             string `json:"vpcid"`
+		Zoneid            string `json:"zoneid"`
+	} `json:"portableipaddress"`
+	Regionid int    `json:"regionid"`
+	Startip  string `json:"startip"`
+	Vlan     string `json:"vlan"`
+}
+
+type DeletePortableIpRangeParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeletePortableIpRangeParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *DeletePortableIpRangeParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new DeletePortableIpRangeParams instance,
+// as then you are sure you have configured all required params
+func (s *PortableIPService) NewDeletePortableIpRangeParams(id string) *DeletePortableIpRangeParams {
+	p := &DeletePortableIpRangeParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// deletes a range of portable public IP's associated with a region
+func (s *PortableIPService) DeletePortableIpRange(p *DeletePortableIpRangeParams) (*DeletePortableIpRangeResponse, error) {
+	resp, err := s.cs.newRequest("deletePortableIpRange", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeletePortableIpRangeResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type DeletePortableIpRangeResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
+
+type ListPortableIpRangesParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListPortableIpRangesParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["regionid"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("regionid", vv)
+	}
+	return u
+}
+
+func (p *ListPortableIpRangesParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ListPortableIpRangesParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListPortableIpRangesParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListPortableIpRangesParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListPortableIpRangesParams) SetRegionid(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["regionid"] = v
+	return
+}
+
+// You should always use this function to get a new ListPortableIpRangesParams instance,
+// as then you are sure you have configured all required params
+func (s *PortableIPService) NewListPortableIpRangesParams() *ListPortableIpRangesParams {
+	p := &ListPortableIpRangesParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *PortableIPService) GetPortableIpRangeByID(id string, opts ...OptionFunc) (*PortableIpRange, int, error) {
+	p := &ListPortableIpRangesParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["id"] = id
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return nil, -1, err
+		}
+	}
+
+	l, err := s.ListPortableIpRanges(p)
+	if err != nil {
+		if strings.Contains(err.Error(), fmt.Sprintf(
+			"Invalid parameter id value=%s due to incorrect long value format, "+
+				"or entity does not exist", id)) {
+			return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
+		}
+		return nil, -1, err
+	}
+
+	if l.Count == 0 {
+		return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
+	}
+
+	if l.Count == 1 {
+		return l.PortableIpRanges[0], l.Count, nil
+	}
+	return nil, l.Count, fmt.Errorf("There is more then one result for PortableIpRange UUID: %s!", id)
+}
+
+// list portable IP ranges
+func (s *PortableIPService) ListPortableIpRanges(p *ListPortableIpRangesParams) (*ListPortableIpRangesResponse, error) {
+	resp, err := s.cs.newRequest("listPortableIpRanges", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListPortableIpRangesResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListPortableIpRangesResponse struct {
+	Count            int                `json:"count"`
+	PortableIpRanges []*PortableIpRange `json:"portableiprange"`
+}
+
+type PortableIpRange struct {
+	Endip             string `json:"endip"`
+	Gateway           string `json:"gateway"`
+	Id                string `json:"id"`
+	Netmask           string `json:"netmask"`
+	Portableipaddress []struct {
+		Accountid         string `json:"accountid"`
+		Allocated         string `json:"allocated"`
+		Domainid          string `json:"domainid"`
+		Ipaddress         string `json:"ipaddress"`
+		Networkid         string `json:"networkid"`
+		Physicalnetworkid string `json:"physicalnetworkid"`
+		Regionid          int    `json:"regionid"`
+		State             string `json:"state"`
+		Vpcid             string `json:"vpcid"`
+		Zoneid            string `json:"zoneid"`
+	} `json:"portableipaddress"`
+	Regionid int    `json:"regionid"`
+	Startip  string `json:"startip"`
+	Vlan     string `json:"vlan"`
+}
diff --git a/vendor/github.com/xanzy/go-cloudstack/cloudstack/ProjectService.go b/vendor/github.com/xanzy/go-cloudstack/cloudstack/ProjectService.go
new file mode 100644
index 0000000..926ddcf
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/cloudstack/ProjectService.go
@@ -0,0 +1,1350 @@
+//
+// Copyright 2018, Sander van Harmelen
+//
+// Licensed 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 cloudstack
+
+import (
+	"encoding/json"
+	"fmt"
+	"net/url"
+	"strconv"
+	"strings"
+)
+
+type ActivateProjectParams struct {
+	p map[string]interface{}
+}
+
+func (p *ActivateProjectParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *ActivateProjectParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new ActivateProjectParams instance,
+// as then you are sure you have configured all required params
+func (s *ProjectService) NewActivateProjectParams(id string) *ActivateProjectParams {
+	p := &ActivateProjectParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Activates a project
+func (s *ProjectService) ActivateProject(p *ActivateProjectParams) (*ActivateProjectResponse, error) {
+	resp, err := s.cs.newRequest("activateProject", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ActivateProjectResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type ActivateProjectResponse struct {
+	JobID                     string `json:"jobid"`
+	Account                   string `json:"account"`
+	Cpuavailable              string `json:"cpuavailable"`
+	Cpulimit                  string `json:"cpulimit"`
+	Cputotal                  int64  `json:"cputotal"`
+	Displaytext               string `json:"displaytext"`
+	Domain                    string `json:"domain"`
+	Domainid                  string `json:"domainid"`
+	Id                        string `json:"id"`
+	Ipavailable               string `json:"ipavailable"`
+	Iplimit                   string `json:"iplimit"`
+	Iptotal                   int64  `json:"iptotal"`
+	Memoryavailable           string `json:"memoryavailable"`
+	Memorylimit               string `json:"memorylimit"`
+	Memorytotal               int64  `json:"memorytotal"`
+	Name                      string `json:"name"`
+	Networkavailable          string `json:"networkavailable"`
+	Networklimit              string `json:"networklimit"`
+	Networktotal              int64  `json:"networktotal"`
+	Primarystorageavailable   string `json:"primarystorageavailable"`
+	Primarystoragelimit       string `json:"primarystoragelimit"`
+	Primarystoragetotal       int64  `json:"primarystoragetotal"`
+	Secondarystorageavailable string `json:"secondarystorageavailable"`
+	Secondarystoragelimit     string `json:"secondarystoragelimit"`
+	Secondarystoragetotal     int64  `json:"secondarystoragetotal"`
+	Snapshotavailable         string `json:"snapshotavailable"`
+	Snapshotlimit             string `json:"snapshotlimit"`
+	Snapshottotal             int64  `json:"snapshottotal"`
+	State                     string `json:"state"`
+	Tags                      []struct {
+		Account      string `json:"account"`
+		Customer     string `json:"customer"`
+		Domain       string `json:"domain"`
+		Domainid     string `json:"domainid"`
+		Key          string `json:"key"`
+		Project      string `json:"project"`
+		Projectid    string `json:"projectid"`
+		Resourceid   string `json:"resourceid"`
+		Resourcetype string `json:"resourcetype"`
+		Value        string `json:"value"`
+	} `json:"tags"`
+	Templateavailable string `json:"templateavailable"`
+	Templatelimit     string `json:"templatelimit"`
+	Templatetotal     int64  `json:"templatetotal"`
+	Vmavailable       string `json:"vmavailable"`
+	Vmlimit           string `json:"vmlimit"`
+	Vmrunning         int    `json:"vmrunning"`
+	Vmstopped         int    `json:"vmstopped"`
+	Vmtotal           int64  `json:"vmtotal"`
+	Volumeavailable   string `json:"volumeavailable"`
+	Volumelimit       string `json:"volumelimit"`
+	Volumetotal       int64  `json:"volumetotal"`
+	Vpcavailable      string `json:"vpcavailable"`
+	Vpclimit          string `json:"vpclimit"`
+	Vpctotal          int64  `json:"vpctotal"`
+}
+
+type CreateProjectParams struct {
+	p map[string]interface{}
+}
+
+func (p *CreateProjectParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["displaytext"]; found {
+		u.Set("displaytext", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	return u
+}
+
+func (p *CreateProjectParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *CreateProjectParams) SetDisplaytext(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["displaytext"] = v
+	return
+}
+
+func (p *CreateProjectParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *CreateProjectParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+// You should always use this function to get a new CreateProjectParams instance,
+// as then you are sure you have configured all required params
+func (s *ProjectService) NewCreateProjectParams(displaytext string, name string) *CreateProjectParams {
+	p := &CreateProjectParams{}
+	p.p = make(map[string]interface{})
+	p.p["displaytext"] = displaytext
+	p.p["name"] = name
+	return p
+}
+
+// Creates a project
+func (s *ProjectService) CreateProject(p *CreateProjectParams) (*CreateProjectResponse, error) {
+	resp, err := s.cs.newRequest("createProject", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r CreateProjectResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type CreateProjectResponse struct {
+	JobID                     string `json:"jobid"`
+	Account                   string `json:"account"`
+	Cpuavailable              string `json:"cpuavailable"`
+	Cpulimit                  string `json:"cpulimit"`
+	Cputotal                  int64  `json:"cputotal"`
+	Displaytext               string `json:"displaytext"`
+	Domain                    string `json:"domain"`
+	Domainid                  string `json:"domainid"`
+	Id                        string `json:"id"`
+	Ipavailable               string `json:"ipavailable"`
+	Iplimit                   string `json:"iplimit"`
+	Iptotal                   int64  `json:"iptotal"`
+	Memoryavailable           string `json:"memoryavailable"`
+	Memorylimit               string `json:"memorylimit"`
+	Memorytotal               int64  `json:"memorytotal"`
+	Name                      string `json:"name"`
+	Networkavailable          string `json:"networkavailable"`
+	Networklimit              string `json:"networklimit"`
+	Networktotal              int64  `json:"networktotal"`
+	Primarystorageavailable   string `json:"primarystorageavailable"`
+	Primarystoragelimit       string `json:"primarystoragelimit"`
+	Primarystoragetotal       int64  `json:"primarystoragetotal"`
+	Secondarystorageavailable string `json:"secondarystorageavailable"`
+	Secondarystoragelimit     string `json:"secondarystoragelimit"`
+	Secondarystoragetotal     int64  `json:"secondarystoragetotal"`
+	Snapshotavailable         string `json:"snapshotavailable"`
+	Snapshotlimit             string `json:"snapshotlimit"`
+	Snapshottotal             int64  `json:"snapshottotal"`
+	State                     string `json:"state"`
+	Tags                      []struct {
+		Account      string `json:"account"`
+		Customer     string `json:"customer"`
+		Domain       string `json:"domain"`
+		Domainid     string `json:"domainid"`
+		Key          string `json:"key"`
+		Project      string `json:"project"`
+		Projectid    string `json:"projectid"`
+		Resourceid   string `json:"resourceid"`
+		Resourcetype string `json:"resourcetype"`
+		Value        string `json:"value"`
+	} `json:"tags"`
+	Templateavailable string `json:"templateavailable"`
+	Templatelimit     string `json:"templatelimit"`
+	Templatetotal     int64  `json:"templatetotal"`
+	Vmavailable       string `json:"vmavailable"`
+	Vmlimit           string `json:"vmlimit"`
+	Vmrunning         int    `json:"vmrunning"`
+	Vmstopped         int    `json:"vmstopped"`
+	Vmtotal           int64  `json:"vmtotal"`
+	Volumeavailable   string `json:"volumeavailable"`
+	Volumelimit       string `json:"volumelimit"`
+	Volumetotal       int64  `json:"volumetotal"`
+	Vpcavailable      string `json:"vpcavailable"`
+	Vpclimit          string `json:"vpclimit"`
+	Vpctotal          int64  `json:"vpctotal"`
+}
+
+type DeleteProjectParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeleteProjectParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *DeleteProjectParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new DeleteProjectParams instance,
+// as then you are sure you have configured all required params
+func (s *ProjectService) NewDeleteProjectParams(id string) *DeleteProjectParams {
+	p := &DeleteProjectParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Deletes a project
+func (s *ProjectService) DeleteProject(p *DeleteProjectParams) (*DeleteProjectResponse, error) {
+	resp, err := s.cs.newRequest("deleteProject", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeleteProjectResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type DeleteProjectResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
+
+type DeleteProjectInvitationParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeleteProjectInvitationParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *DeleteProjectInvitationParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new DeleteProjectInvitationParams instance,
+// as then you are sure you have configured all required params
+func (s *ProjectService) NewDeleteProjectInvitationParams(id string) *DeleteProjectInvitationParams {
+	p := &DeleteProjectInvitationParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Deletes project invitation
+func (s *ProjectService) DeleteProjectInvitation(p *DeleteProjectInvitationParams) (*DeleteProjectInvitationResponse, error) {
+	resp, err := s.cs.newRequest("deleteProjectInvitation", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeleteProjectInvitationResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type DeleteProjectInvitationResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
+
+type ListProjectInvitationsParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListProjectInvitationsParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["activeonly"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("activeonly", vv)
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["isrecursive"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("isrecursive", vv)
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["listall"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("listall", vv)
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["projectid"]; found {
+		u.Set("projectid", v.(string))
+	}
+	if v, found := p.p["state"]; found {
+		u.Set("state", v.(string))
+	}
+	return u
+}
+
+func (p *ListProjectInvitationsParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *ListProjectInvitationsParams) SetActiveonly(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["activeonly"] = v
+	return
+}
+
+func (p *ListProjectInvitationsParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *ListProjectInvitationsParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ListProjectInvitationsParams) SetIsrecursive(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isrecursive"] = v
+	return
+}
+
+func (p *ListProjectInvitationsParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListProjectInvitationsParams) SetListall(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["listall"] = v
+	return
+}
+
+func (p *ListProjectInvitationsParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListProjectInvitationsParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListProjectInvitationsParams) SetProjectid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectid"] = v
+	return
+}
+
+func (p *ListProjectInvitationsParams) SetState(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["state"] = v
+	return
+}
+
+// You should always use this function to get a new ListProjectInvitationsParams instance,
+// as then you are sure you have configured all required params
+func (s *ProjectService) NewListProjectInvitationsParams() *ListProjectInvitationsParams {
+	p := &ListProjectInvitationsParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *ProjectService) GetProjectInvitationByID(id string, opts ...OptionFunc) (*ProjectInvitation, int, error) {
+	p := &ListProjectInvitationsParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["id"] = id
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return nil, -1, err
+		}
+	}
+
+	l, err := s.ListProjectInvitations(p)
+	if err != nil {
+		if strings.Contains(err.Error(), fmt.Sprintf(
+			"Invalid parameter id value=%s due to incorrect long value format, "+
+				"or entity does not exist", id)) {
+			return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
+		}
+		return nil, -1, err
+	}
+
+	if l.Count == 0 {
+		return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
+	}
+
+	if l.Count == 1 {
+		return l.ProjectInvitations[0], l.Count, nil
+	}
+	return nil, l.Count, fmt.Errorf("There is more then one result for ProjectInvitation UUID: %s!", id)
+}
+
+// Lists project invitations and provides detailed information for listed invitations
+func (s *ProjectService) ListProjectInvitations(p *ListProjectInvitationsParams) (*ListProjectInvitationsResponse, error) {
+	resp, err := s.cs.newRequest("listProjectInvitations", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListProjectInvitationsResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListProjectInvitationsResponse struct {
+	Count              int                  `json:"count"`
+	ProjectInvitations []*ProjectInvitation `json:"projectinvitation"`
+}
+
+type ProjectInvitation struct {
+	Account   string `json:"account"`
+	Domain    string `json:"domain"`
+	Domainid  string `json:"domainid"`
+	Email     string `json:"email"`
+	Id        string `json:"id"`
+	Project   string `json:"project"`
+	Projectid string `json:"projectid"`
+	State     string `json:"state"`
+}
+
+type ListProjectsParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListProjectsParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["displaytext"]; found {
+		u.Set("displaytext", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["isrecursive"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("isrecursive", vv)
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["listall"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("listall", vv)
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["state"]; found {
+		u.Set("state", v.(string))
+	}
+	if v, found := p.p["tags"]; found {
+		i := 0
+		for k, vv := range v.(map[string]string) {
+			u.Set(fmt.Sprintf("tags[%d].key", i), k)
+			u.Set(fmt.Sprintf("tags[%d].value", i), vv)
+			i++
+		}
+	}
+	return u
+}
+
+func (p *ListProjectsParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *ListProjectsParams) SetDisplaytext(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["displaytext"] = v
+	return
+}
+
+func (p *ListProjectsParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *ListProjectsParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ListProjectsParams) SetIsrecursive(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isrecursive"] = v
+	return
+}
+
+func (p *ListProjectsParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListProjectsParams) SetListall(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["listall"] = v
+	return
+}
+
+func (p *ListProjectsParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *ListProjectsParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListProjectsParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListProjectsParams) SetState(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["state"] = v
+	return
+}
+
+func (p *ListProjectsParams) SetTags(v map[string]string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["tags"] = v
+	return
+}
+
+// You should always use this function to get a new ListProjectsParams instance,
+// as then you are sure you have configured all required params
+func (s *ProjectService) NewListProjectsParams() *ListProjectsParams {
+	p := &ListProjectsParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *ProjectService) GetProjectID(name string, opts ...OptionFunc) (string, int, error) {
+	p := &ListProjectsParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["name"] = name
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return "", -1, err
+		}
+	}
+
+	l, err := s.ListProjects(p)
+	if err != nil {
+		return "", -1, err
+	}
+
+	if l.Count == 0 {
+		return "", l.Count, fmt.Errorf("No match found for %s: %+v", name, l)
+	}
+
+	if l.Count == 1 {
+		return l.Projects[0].Id, l.Count, nil
+	}
+
+	if l.Count > 1 {
+		for _, v := range l.Projects {
+			if v.Name == name {
+				return v.Id, l.Count, nil
+			}
+		}
+	}
+	return "", l.Count, fmt.Errorf("Could not find an exact match for %s: %+v", name, l)
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *ProjectService) GetProjectByName(name string, opts ...OptionFunc) (*Project, int, error) {
+	id, count, err := s.GetProjectID(name, opts...)
+	if err != nil {
+		return nil, count, err
+	}
+
+	r, count, err := s.GetProjectByID(id, opts...)
+	if err != nil {
+		return nil, count, err
+	}
+	return r, count, nil
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *ProjectService) GetProjectByID(id string, opts ...OptionFunc) (*Project, int, error) {
+	p := &ListProjectsParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["id"] = id
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return nil, -1, err
+		}
+	}
+
+	l, err := s.ListProjects(p)
+	if err != nil {
+		if strings.Contains(err.Error(), fmt.Sprintf(
+			"Invalid parameter id value=%s due to incorrect long value format, "+
+				"or entity does not exist", id)) {
+			return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
+		}
+		return nil, -1, err
+	}
+
+	if l.Count == 0 {
+		return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
+	}
+
+	if l.Count == 1 {
+		return l.Projects[0], l.Count, nil
+	}
+	return nil, l.Count, fmt.Errorf("There is more then one result for Project UUID: %s!", id)
+}
+
+// Lists projects and provides detailed information for listed projects
+func (s *ProjectService) ListProjects(p *ListProjectsParams) (*ListProjectsResponse, error) {
+	resp, err := s.cs.newRequest("listProjects", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListProjectsResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListProjectsResponse struct {
+	Count    int        `json:"count"`
+	Projects []*Project `json:"project"`
+}
+
+type Project struct {
+	Account                   string `json:"account"`
+	Cpuavailable              string `json:"cpuavailable"`
+	Cpulimit                  string `json:"cpulimit"`
+	Cputotal                  int64  `json:"cputotal"`
+	Displaytext               string `json:"displaytext"`
+	Domain                    string `json:"domain"`
+	Domainid                  string `json:"domainid"`
+	Id                        string `json:"id"`
+	Ipavailable               string `json:"ipavailable"`
+	Iplimit                   string `json:"iplimit"`
+	Iptotal                   int64  `json:"iptotal"`
+	Memoryavailable           string `json:"memoryavailable"`
+	Memorylimit               string `json:"memorylimit"`
+	Memorytotal               int64  `json:"memorytotal"`
+	Name                      string `json:"name"`
+	Networkavailable          string `json:"networkavailable"`
+	Networklimit              string `json:"networklimit"`
+	Networktotal              int64  `json:"networktotal"`
+	Primarystorageavailable   string `json:"primarystorageavailable"`
+	Primarystoragelimit       string `json:"primarystoragelimit"`
+	Primarystoragetotal       int64  `json:"primarystoragetotal"`
+	Secondarystorageavailable string `json:"secondarystorageavailable"`
+	Secondarystoragelimit     string `json:"secondarystoragelimit"`
+	Secondarystoragetotal     int64  `json:"secondarystoragetotal"`
+	Snapshotavailable         string `json:"snapshotavailable"`
+	Snapshotlimit             string `json:"snapshotlimit"`
+	Snapshottotal             int64  `json:"snapshottotal"`
+	State                     string `json:"state"`
+	Tags                      []struct {
+		Account      string `json:"account"`
+		Customer     string `json:"customer"`
+		Domain       string `json:"domain"`
+		Domainid     string `json:"domainid"`
+		Key          string `json:"key"`
+		Project      string `json:"project"`
+		Projectid    string `json:"projectid"`
+		Resourceid   string `json:"resourceid"`
+		Resourcetype string `json:"resourcetype"`
+		Value        string `json:"value"`
+	} `json:"tags"`
+	Templateavailable string `json:"templateavailable"`
+	Templatelimit     string `json:"templatelimit"`
+	Templatetotal     int64  `json:"templatetotal"`
+	Vmavailable       string `json:"vmavailable"`
+	Vmlimit           string `json:"vmlimit"`
+	Vmrunning         int    `json:"vmrunning"`
+	Vmstopped         int    `json:"vmstopped"`
+	Vmtotal           int64  `json:"vmtotal"`
+	Volumeavailable   string `json:"volumeavailable"`
+	Volumelimit       string `json:"volumelimit"`
+	Volumetotal       int64  `json:"volumetotal"`
+	Vpcavailable      string `json:"vpcavailable"`
+	Vpclimit          string `json:"vpclimit"`
+	Vpctotal          int64  `json:"vpctotal"`
+}
+
+type SuspendProjectParams struct {
+	p map[string]interface{}
+}
+
+func (p *SuspendProjectParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *SuspendProjectParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new SuspendProjectParams instance,
+// as then you are sure you have configured all required params
+func (s *ProjectService) NewSuspendProjectParams(id string) *SuspendProjectParams {
+	p := &SuspendProjectParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Suspends a project
+func (s *ProjectService) SuspendProject(p *SuspendProjectParams) (*SuspendProjectResponse, error) {
+	resp, err := s.cs.newRequest("suspendProject", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r SuspendProjectResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type SuspendProjectResponse struct {
+	JobID                     string `json:"jobid"`
+	Account                   string `json:"account"`
+	Cpuavailable              string `json:"cpuavailable"`
+	Cpulimit                  string `json:"cpulimit"`
+	Cputotal                  int64  `json:"cputotal"`
+	Displaytext               string `json:"displaytext"`
+	Domain                    string `json:"domain"`
+	Domainid                  string `json:"domainid"`
+	Id                        string `json:"id"`
+	Ipavailable               string `json:"ipavailable"`
+	Iplimit                   string `json:"iplimit"`
+	Iptotal                   int64  `json:"iptotal"`
+	Memoryavailable           string `json:"memoryavailable"`
+	Memorylimit               string `json:"memorylimit"`
+	Memorytotal               int64  `json:"memorytotal"`
+	Name                      string `json:"name"`
+	Networkavailable          string `json:"networkavailable"`
+	Networklimit              string `json:"networklimit"`
+	Networktotal              int64  `json:"networktotal"`
+	Primarystorageavailable   string `json:"primarystorageavailable"`
+	Primarystoragelimit       string `json:"primarystoragelimit"`
+	Primarystoragetotal       int64  `json:"primarystoragetotal"`
+	Secondarystorageavailable string `json:"secondarystorageavailable"`
+	Secondarystoragelimit     string `json:"secondarystoragelimit"`
+	Secondarystoragetotal     int64  `json:"secondarystoragetotal"`
+	Snapshotavailable         string `json:"snapshotavailable"`
+	Snapshotlimit             string `json:"snapshotlimit"`
+	Snapshottotal             int64  `json:"snapshottotal"`
+	State                     string `json:"state"`
+	Tags                      []struct {
+		Account      string `json:"account"`
+		Customer     string `json:"customer"`
+		Domain       string `json:"domain"`
+		Domainid     string `json:"domainid"`
+		Key          string `json:"key"`
+		Project      string `json:"project"`
+		Projectid    string `json:"projectid"`
+		Resourceid   string `json:"resourceid"`
+		Resourcetype string `json:"resourcetype"`
+		Value        string `json:"value"`
+	} `json:"tags"`
+	Templateavailable string `json:"templateavailable"`
+	Templatelimit     string `json:"templatelimit"`
+	Templatetotal     int64  `json:"templatetotal"`
+	Vmavailable       string `json:"vmavailable"`
+	Vmlimit           string `json:"vmlimit"`
+	Vmrunning         int    `json:"vmrunning"`
+	Vmstopped         int    `json:"vmstopped"`
+	Vmtotal           int64  `json:"vmtotal"`
+	Volumeavailable   string `json:"volumeavailable"`
+	Volumelimit       string `json:"volumelimit"`
+	Volumetotal       int64  `json:"volumetotal"`
+	Vpcavailable      string `json:"vpcavailable"`
+	Vpclimit          string `json:"vpclimit"`
+	Vpctotal          int64  `json:"vpctotal"`
+}
+
+type UpdateProjectParams struct {
+	p map[string]interface{}
+}
+
+func (p *UpdateProjectParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["displaytext"]; found {
+		u.Set("displaytext", v.(string))
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *UpdateProjectParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *UpdateProjectParams) SetDisplaytext(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["displaytext"] = v
+	return
+}
+
+func (p *UpdateProjectParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new UpdateProjectParams instance,
+// as then you are sure you have configured all required params
+func (s *ProjectService) NewUpdateProjectParams(id string) *UpdateProjectParams {
+	p := &UpdateProjectParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Updates a project
+func (s *ProjectService) UpdateProject(p *UpdateProjectParams) (*UpdateProjectResponse, error) {
+	resp, err := s.cs.newRequest("updateProject", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r UpdateProjectResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type UpdateProjectResponse struct {
+	JobID                     string `json:"jobid"`
+	Account                   string `json:"account"`
+	Cpuavailable              string `json:"cpuavailable"`
+	Cpulimit                  string `json:"cpulimit"`
+	Cputotal                  int64  `json:"cputotal"`
+	Displaytext               string `json:"displaytext"`
+	Domain                    string `json:"domain"`
+	Domainid                  string `json:"domainid"`
+	Id                        string `json:"id"`
+	Ipavailable               string `json:"ipavailable"`
+	Iplimit                   string `json:"iplimit"`
+	Iptotal                   int64  `json:"iptotal"`
+	Memoryavailable           string `json:"memoryavailable"`
+	Memorylimit               string `json:"memorylimit"`
+	Memorytotal               int64  `json:"memorytotal"`
+	Name                      string `json:"name"`
+	Networkavailable          string `json:"networkavailable"`
+	Networklimit              string `json:"networklimit"`
+	Networktotal              int64  `json:"networktotal"`
+	Primarystorageavailable   string `json:"primarystorageavailable"`
+	Primarystoragelimit       string `json:"primarystoragelimit"`
+	Primarystoragetotal       int64  `json:"primarystoragetotal"`
+	Secondarystorageavailable string `json:"secondarystorageavailable"`
+	Secondarystoragelimit     string `json:"secondarystoragelimit"`
+	Secondarystoragetotal     int64  `json:"secondarystoragetotal"`
+	Snapshotavailable         string `json:"snapshotavailable"`
+	Snapshotlimit             string `json:"snapshotlimit"`
+	Snapshottotal             int64  `json:"snapshottotal"`
+	State                     string `json:"state"`
+	Tags                      []struct {
+		Account      string `json:"account"`
+		Customer     string `json:"customer"`
+		Domain       string `json:"domain"`
+		Domainid     string `json:"domainid"`
+		Key          string `json:"key"`
+		Project      string `json:"project"`
+		Projectid    string `json:"projectid"`
+		Resourceid   string `json:"resourceid"`
+		Resourcetype string `json:"resourcetype"`
+		Value        string `json:"value"`
+	} `json:"tags"`
+	Templateavailable string `json:"templateavailable"`
+	Templatelimit     string `json:"templatelimit"`
+	Templatetotal     int64  `json:"templatetotal"`
+	Vmavailable       string `json:"vmavailable"`
+	Vmlimit           string `json:"vmlimit"`
+	Vmrunning         int    `json:"vmrunning"`
+	Vmstopped         int    `json:"vmstopped"`
+	Vmtotal           int64  `json:"vmtotal"`
+	Volumeavailable   string `json:"volumeavailable"`
+	Volumelimit       string `json:"volumelimit"`
+	Volumetotal       int64  `json:"volumetotal"`
+	Vpcavailable      string `json:"vpcavailable"`
+	Vpclimit          string `json:"vpclimit"`
+	Vpctotal          int64  `json:"vpctotal"`
+}
+
+type UpdateProjectInvitationParams struct {
+	p map[string]interface{}
+}
+
+func (p *UpdateProjectInvitationParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["accept"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("accept", vv)
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["projectid"]; found {
+		u.Set("projectid", v.(string))
+	}
+	if v, found := p.p["token"]; found {
+		u.Set("token", v.(string))
+	}
+	return u
+}
+
+func (p *UpdateProjectInvitationParams) SetAccept(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["accept"] = v
+	return
+}
+
+func (p *UpdateProjectInvitationParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *UpdateProjectInvitationParams) SetProjectid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectid"] = v
+	return
+}
+
+func (p *UpdateProjectInvitationParams) SetToken(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["token"] = v
+	return
+}
+
+// You should always use this function to get a new UpdateProjectInvitationParams instance,
+// as then you are sure you have configured all required params
+func (s *ProjectService) NewUpdateProjectInvitationParams(projectid string) *UpdateProjectInvitationParams {
+	p := &UpdateProjectInvitationParams{}
+	p.p = make(map[string]interface{})
+	p.p["projectid"] = projectid
+	return p
+}
+
+// Accepts or declines project invitation
+func (s *ProjectService) UpdateProjectInvitation(p *UpdateProjectInvitationParams) (*UpdateProjectInvitationResponse, error) {
+	resp, err := s.cs.newRequest("updateProjectInvitation", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r UpdateProjectInvitationResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type UpdateProjectInvitationResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
diff --git a/vendor/github.com/xanzy/go-cloudstack/cloudstack/QuotaService.go b/vendor/github.com/xanzy/go-cloudstack/cloudstack/QuotaService.go
new file mode 100644
index 0000000..2e2f26a
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/cloudstack/QuotaService.go
@@ -0,0 +1,61 @@
+//
+// Copyright 2018, Sander van Harmelen
+//
+// Licensed 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 cloudstack
+
+import (
+	"encoding/json"
+	"net/url"
+)
+
+type QuotaIsEnabledParams struct {
+	p map[string]interface{}
+}
+
+func (p *QuotaIsEnabledParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	return u
+}
+
+// You should always use this function to get a new QuotaIsEnabledParams instance,
+// as then you are sure you have configured all required params
+func (s *QuotaService) NewQuotaIsEnabledParams() *QuotaIsEnabledParams {
+	p := &QuotaIsEnabledParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// Return true if the plugin is enabled
+func (s *QuotaService) QuotaIsEnabled(p *QuotaIsEnabledParams) (*QuotaIsEnabledResponse, error) {
+	resp, err := s.cs.newRequest("quotaIsEnabled", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r QuotaIsEnabledResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type QuotaIsEnabledResponse struct {
+	Isenabled bool `json:"isenabled"`
+}
diff --git a/vendor/github.com/xanzy/go-cloudstack/cloudstack/RegionService.go b/vendor/github.com/xanzy/go-cloudstack/cloudstack/RegionService.go
new file mode 100644
index 0000000..00f8c70
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/cloudstack/RegionService.go
@@ -0,0 +1,340 @@
+//
+// Copyright 2018, Sander van Harmelen
+//
+// Licensed 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 cloudstack
+
+import (
+	"encoding/json"
+	"net/url"
+	"strconv"
+)
+
+type AddRegionParams struct {
+	p map[string]interface{}
+}
+
+func (p *AddRegionParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["endpoint"]; found {
+		u.Set("endpoint", v.(string))
+	}
+	if v, found := p.p["id"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("id", vv)
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	return u
+}
+
+func (p *AddRegionParams) SetEndpoint(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["endpoint"] = v
+	return
+}
+
+func (p *AddRegionParams) SetId(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *AddRegionParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+// You should always use this function to get a new AddRegionParams instance,
+// as then you are sure you have configured all required params
+func (s *RegionService) NewAddRegionParams(endpoint string, id int, name string) *AddRegionParams {
+	p := &AddRegionParams{}
+	p.p = make(map[string]interface{})
+	p.p["endpoint"] = endpoint
+	p.p["id"] = id
+	p.p["name"] = name
+	return p
+}
+
+// Adds a Region
+func (s *RegionService) AddRegion(p *AddRegionParams) (*AddRegionResponse, error) {
+	resp, err := s.cs.newRequest("addRegion", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r AddRegionResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type AddRegionResponse struct {
+	Endpoint                 string `json:"endpoint"`
+	Gslbserviceenabled       bool   `json:"gslbserviceenabled"`
+	Id                       int    `json:"id"`
+	Name                     string `json:"name"`
+	Portableipserviceenabled bool   `json:"portableipserviceenabled"`
+}
+
+type ListRegionsParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListRegionsParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("id", vv)
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	return u
+}
+
+func (p *ListRegionsParams) SetId(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ListRegionsParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListRegionsParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *ListRegionsParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListRegionsParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+// You should always use this function to get a new ListRegionsParams instance,
+// as then you are sure you have configured all required params
+func (s *RegionService) NewListRegionsParams() *ListRegionsParams {
+	p := &ListRegionsParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// Lists Regions
+func (s *RegionService) ListRegions(p *ListRegionsParams) (*ListRegionsResponse, error) {
+	resp, err := s.cs.newRequest("listRegions", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListRegionsResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListRegionsResponse struct {
+	Count   int       `json:"count"`
+	Regions []*Region `json:"region"`
+}
+
+type Region struct {
+	Endpoint                 string `json:"endpoint"`
+	Gslbserviceenabled       bool   `json:"gslbserviceenabled"`
+	Id                       int    `json:"id"`
+	Name                     string `json:"name"`
+	Portableipserviceenabled bool   `json:"portableipserviceenabled"`
+}
+
+type RemoveRegionParams struct {
+	p map[string]interface{}
+}
+
+func (p *RemoveRegionParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("id", vv)
+	}
+	return u
+}
+
+func (p *RemoveRegionParams) SetId(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new RemoveRegionParams instance,
+// as then you are sure you have configured all required params
+func (s *RegionService) NewRemoveRegionParams(id int) *RemoveRegionParams {
+	p := &RemoveRegionParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Removes specified region
+func (s *RegionService) RemoveRegion(p *RemoveRegionParams) (*RemoveRegionResponse, error) {
+	resp, err := s.cs.newRequest("removeRegion", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r RemoveRegionResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type RemoveRegionResponse struct {
+	Displaytext string `json:"displaytext"`
+	Success     string `json:"success"`
+}
+
+type UpdateRegionParams struct {
+	p map[string]interface{}
+}
+
+func (p *UpdateRegionParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["endpoint"]; found {
+		u.Set("endpoint", v.(string))
+	}
+	if v, found := p.p["id"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("id", vv)
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	return u
+}
+
+func (p *UpdateRegionParams) SetEndpoint(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["endpoint"] = v
+	return
+}
+
+func (p *UpdateRegionParams) SetId(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *UpdateRegionParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+// You should always use this function to get a new UpdateRegionParams instance,
+// as then you are sure you have configured all required params
+func (s *RegionService) NewUpdateRegionParams(id int) *UpdateRegionParams {
+	p := &UpdateRegionParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Updates a region
+func (s *RegionService) UpdateRegion(p *UpdateRegionParams) (*UpdateRegionResponse, error) {
+	resp, err := s.cs.newRequest("updateRegion", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r UpdateRegionResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type UpdateRegionResponse struct {
+	Endpoint                 string `json:"endpoint"`
+	Gslbserviceenabled       bool   `json:"gslbserviceenabled"`
+	Id                       int    `json:"id"`
+	Name                     string `json:"name"`
+	Portableipserviceenabled bool   `json:"portableipserviceenabled"`
+}
diff --git a/vendor/github.com/xanzy/go-cloudstack/cloudstack/ResourcemetadataService.go b/vendor/github.com/xanzy/go-cloudstack/cloudstack/ResourcemetadataService.go
new file mode 100644
index 0000000..6eef886
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/cloudstack/ResourcemetadataService.go
@@ -0,0 +1,476 @@
+//
+// Copyright 2018, Sander van Harmelen
+//
+// Licensed 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 cloudstack
+
+import (
+	"encoding/json"
+	"fmt"
+	"net/url"
+	"strconv"
+)
+
+type AddResourceDetailParams struct {
+	p map[string]interface{}
+}
+
+func (p *AddResourceDetailParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["details"]; found {
+		i := 0
+		for k, vv := range v.(map[string]string) {
+			u.Set(fmt.Sprintf("details[%d].%s", i, k), vv)
+			i++
+		}
+	}
+	if v, found := p.p["fordisplay"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("fordisplay", vv)
+	}
+	if v, found := p.p["resourceid"]; found {
+		u.Set("resourceid", v.(string))
+	}
+	if v, found := p.p["resourcetype"]; found {
+		u.Set("resourcetype", v.(string))
+	}
+	return u
+}
+
+func (p *AddResourceDetailParams) SetDetails(v map[string]string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["details"] = v
+	return
+}
+
+func (p *AddResourceDetailParams) SetFordisplay(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["fordisplay"] = v
+	return
+}
+
+func (p *AddResourceDetailParams) SetResourceid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["resourceid"] = v
+	return
+}
+
+func (p *AddResourceDetailParams) SetResourcetype(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["resourcetype"] = v
+	return
+}
+
+// You should always use this function to get a new AddResourceDetailParams instance,
+// as then you are sure you have configured all required params
+func (s *ResourcemetadataService) NewAddResourceDetailParams(details map[string]string, resourceid string, resourcetype string) *AddResourceDetailParams {
+	p := &AddResourceDetailParams{}
+	p.p = make(map[string]interface{})
+	p.p["details"] = details
+	p.p["resourceid"] = resourceid
+	p.p["resourcetype"] = resourcetype
+	return p
+}
+
+// Adds detail for the Resource.
+func (s *ResourcemetadataService) AddResourceDetail(p *AddResourceDetailParams) (*AddResourceDetailResponse, error) {
+	resp, err := s.cs.newRequest("addResourceDetail", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r AddResourceDetailResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type AddResourceDetailResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
+
+type GetVolumeSnapshotDetailsParams struct {
+	p map[string]interface{}
+}
+
+func (p *GetVolumeSnapshotDetailsParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["snapshotid"]; found {
+		u.Set("snapshotid", v.(string))
+	}
+	return u
+}
+
+func (p *GetVolumeSnapshotDetailsParams) SetSnapshotid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["snapshotid"] = v
+	return
+}
+
+// You should always use this function to get a new GetVolumeSnapshotDetailsParams instance,
+// as then you are sure you have configured all required params
+func (s *ResourcemetadataService) NewGetVolumeSnapshotDetailsParams(snapshotid string) *GetVolumeSnapshotDetailsParams {
+	p := &GetVolumeSnapshotDetailsParams{}
+	p.p = make(map[string]interface{})
+	p.p["snapshotid"] = snapshotid
+	return p
+}
+
+// Get Volume Snapshot Details
+func (s *ResourcemetadataService) GetVolumeSnapshotDetails(p *GetVolumeSnapshotDetailsParams) (*GetVolumeSnapshotDetailsResponse, error) {
+	resp, err := s.cs.newRequest("getVolumeSnapshotDetails", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r GetVolumeSnapshotDetailsResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type GetVolumeSnapshotDetailsResponse struct {
+	VolumeiScsiName string `json:"volumeiScsiName"`
+}
+
+type ListResourceDetailsParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListResourceDetailsParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["fordisplay"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("fordisplay", vv)
+	}
+	if v, found := p.p["isrecursive"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("isrecursive", vv)
+	}
+	if v, found := p.p["key"]; found {
+		u.Set("key", v.(string))
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["listall"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("listall", vv)
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["projectid"]; found {
+		u.Set("projectid", v.(string))
+	}
+	if v, found := p.p["resourceid"]; found {
+		u.Set("resourceid", v.(string))
+	}
+	if v, found := p.p["resourcetype"]; found {
+		u.Set("resourcetype", v.(string))
+	}
+	if v, found := p.p["value"]; found {
+		u.Set("value", v.(string))
+	}
+	return u
+}
+
+func (p *ListResourceDetailsParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *ListResourceDetailsParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *ListResourceDetailsParams) SetFordisplay(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["fordisplay"] = v
+	return
+}
+
+func (p *ListResourceDetailsParams) SetIsrecursive(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isrecursive"] = v
+	return
+}
+
+func (p *ListResourceDetailsParams) SetKey(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["key"] = v
+	return
+}
+
+func (p *ListResourceDetailsParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListResourceDetailsParams) SetListall(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["listall"] = v
+	return
+}
+
+func (p *ListResourceDetailsParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListResourceDetailsParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListResourceDetailsParams) SetProjectid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectid"] = v
+	return
+}
+
+func (p *ListResourceDetailsParams) SetResourceid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["resourceid"] = v
+	return
+}
+
+func (p *ListResourceDetailsParams) SetResourcetype(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["resourcetype"] = v
+	return
+}
+
+func (p *ListResourceDetailsParams) SetValue(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["value"] = v
+	return
+}
+
+// You should always use this function to get a new ListResourceDetailsParams instance,
+// as then you are sure you have configured all required params
+func (s *ResourcemetadataService) NewListResourceDetailsParams(resourcetype string) *ListResourceDetailsParams {
+	p := &ListResourceDetailsParams{}
+	p.p = make(map[string]interface{})
+	p.p["resourcetype"] = resourcetype
+	return p
+}
+
+// List resource detail(s)
+func (s *ResourcemetadataService) ListResourceDetails(p *ListResourceDetailsParams) (*ListResourceDetailsResponse, error) {
+	resp, err := s.cs.newRequest("listResourceDetails", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListResourceDetailsResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListResourceDetailsResponse struct {
+	Count           int               `json:"count"`
+	ResourceDetails []*ResourceDetail `json:"resourcedetail"`
+}
+
+type ResourceDetail struct {
+	Account      string `json:"account"`
+	Customer     string `json:"customer"`
+	Domain       string `json:"domain"`
+	Domainid     string `json:"domainid"`
+	Key          string `json:"key"`
+	Project      string `json:"project"`
+	Projectid    string `json:"projectid"`
+	Resourceid   string `json:"resourceid"`
+	Resourcetype string `json:"resourcetype"`
+	Value        string `json:"value"`
+}
+
+type RemoveResourceDetailParams struct {
+	p map[string]interface{}
+}
+
+func (p *RemoveResourceDetailParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["key"]; found {
+		u.Set("key", v.(string))
+	}
+	if v, found := p.p["resourceid"]; found {
+		u.Set("resourceid", v.(string))
+	}
+	if v, found := p.p["resourcetype"]; found {
+		u.Set("resourcetype", v.(string))
+	}
+	return u
+}
+
+func (p *RemoveResourceDetailParams) SetKey(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["key"] = v
+	return
+}
+
+func (p *RemoveResourceDetailParams) SetResourceid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["resourceid"] = v
+	return
+}
+
+func (p *RemoveResourceDetailParams) SetResourcetype(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["resourcetype"] = v
+	return
+}
+
+// You should always use this function to get a new RemoveResourceDetailParams instance,
+// as then you are sure you have configured all required params
+func (s *ResourcemetadataService) NewRemoveResourceDetailParams(resourceid string, resourcetype string) *RemoveResourceDetailParams {
+	p := &RemoveResourceDetailParams{}
+	p.p = make(map[string]interface{})
+	p.p["resourceid"] = resourceid
+	p.p["resourcetype"] = resourcetype
+	return p
+}
+
+// Removes detail for the Resource.
+func (s *ResourcemetadataService) RemoveResourceDetail(p *RemoveResourceDetailParams) (*RemoveResourceDetailResponse, error) {
+	resp, err := s.cs.newRequest("removeResourceDetail", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r RemoveResourceDetailResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type RemoveResourceDetailResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
diff --git a/vendor/github.com/xanzy/go-cloudstack/cloudstack/ResourcetagsService.go b/vendor/github.com/xanzy/go-cloudstack/cloudstack/ResourcetagsService.go
new file mode 100644
index 0000000..e49d265
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/cloudstack/ResourcetagsService.go
@@ -0,0 +1,548 @@
+//
+// Copyright 2018, Sander van Harmelen
+//
+// Licensed 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 cloudstack
+
+import (
+	"encoding/json"
+	"fmt"
+	"net/url"
+	"strconv"
+	"strings"
+)
+
+type CreateTagsParams struct {
+	p map[string]interface{}
+}
+
+func (p *CreateTagsParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["customer"]; found {
+		u.Set("customer", v.(string))
+	}
+	if v, found := p.p["resourceids"]; found {
+		vv := strings.Join(v.([]string), ",")
+		u.Set("resourceids", vv)
+	}
+	if v, found := p.p["resourcetype"]; found {
+		u.Set("resourcetype", v.(string))
+	}
+	if v, found := p.p["tags"]; found {
+		i := 0
+		for k, vv := range v.(map[string]string) {
+			u.Set(fmt.Sprintf("tags[%d].key", i), k)
+			u.Set(fmt.Sprintf("tags[%d].value", i), vv)
+			i++
+		}
+	}
+	return u
+}
+
+func (p *CreateTagsParams) SetCustomer(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["customer"] = v
+	return
+}
+
+func (p *CreateTagsParams) SetResourceids(v []string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["resourceids"] = v
+	return
+}
+
+func (p *CreateTagsParams) SetResourcetype(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["resourcetype"] = v
+	return
+}
+
+func (p *CreateTagsParams) SetTags(v map[string]string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["tags"] = v
+	return
+}
+
+// You should always use this function to get a new CreateTagsParams instance,
+// as then you are sure you have configured all required params
+func (s *ResourcetagsService) NewCreateTagsParams(resourceids []string, resourcetype string, tags map[string]string) *CreateTagsParams {
+	p := &CreateTagsParams{}
+	p.p = make(map[string]interface{})
+	p.p["resourceids"] = resourceids
+	p.p["resourcetype"] = resourcetype
+	p.p["tags"] = tags
+	return p
+}
+
+// Creates resource tag(s)
+func (s *ResourcetagsService) CreateTags(p *CreateTagsParams) (*CreateTagsResponse, error) {
+	resp, err := s.cs.newRequest("createTags", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r CreateTagsResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type CreateTagsResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
+
+type DeleteTagsParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeleteTagsParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["resourceids"]; found {
+		vv := strings.Join(v.([]string), ",")
+		u.Set("resourceids", vv)
+	}
+	if v, found := p.p["resourcetype"]; found {
+		u.Set("resourcetype", v.(string))
+	}
+	if v, found := p.p["tags"]; found {
+		i := 0
+		for k, vv := range v.(map[string]string) {
+			u.Set(fmt.Sprintf("tags[%d].key", i), k)
+			u.Set(fmt.Sprintf("tags[%d].value", i), vv)
+			i++
+		}
+	}
+	return u
+}
+
+func (p *DeleteTagsParams) SetResourceids(v []string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["resourceids"] = v
+	return
+}
+
+func (p *DeleteTagsParams) SetResourcetype(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["resourcetype"] = v
+	return
+}
+
+func (p *DeleteTagsParams) SetTags(v map[string]string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["tags"] = v
+	return
+}
+
+// You should always use this function to get a new DeleteTagsParams instance,
+// as then you are sure you have configured all required params
+func (s *ResourcetagsService) NewDeleteTagsParams(resourceids []string, resourcetype string) *DeleteTagsParams {
+	p := &DeleteTagsParams{}
+	p.p = make(map[string]interface{})
+	p.p["resourceids"] = resourceids
+	p.p["resourcetype"] = resourcetype
+	return p
+}
+
+// Deleting resource tag(s)
+func (s *ResourcetagsService) DeleteTags(p *DeleteTagsParams) (*DeleteTagsResponse, error) {
+	resp, err := s.cs.newRequest("deleteTags", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeleteTagsResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type DeleteTagsResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
+
+type ListStorageTagsParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListStorageTagsParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	return u
+}
+
+func (p *ListStorageTagsParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListStorageTagsParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListStorageTagsParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+// You should always use this function to get a new ListStorageTagsParams instance,
+// as then you are sure you have configured all required params
+func (s *ResourcetagsService) NewListStorageTagsParams() *ListStorageTagsParams {
+	p := &ListStorageTagsParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *ResourcetagsService) GetStorageTagID(keyword string, opts ...OptionFunc) (string, int, error) {
+	p := &ListStorageTagsParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["keyword"] = keyword
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return "", -1, err
+		}
+	}
+
+	l, err := s.ListStorageTags(p)
+	if err != nil {
+		return "", -1, err
+	}
+
+	if l.Count == 0 {
+		return "", l.Count, fmt.Errorf("No match found for %s: %+v", keyword, l)
+	}
+
+	if l.Count == 1 {
+		return l.StorageTags[0].Id, l.Count, nil
+	}
+
+	if l.Count > 1 {
+		for _, v := range l.StorageTags {
+			if v.Name == keyword {
+				return v.Id, l.Count, nil
+			}
+		}
+	}
+	return "", l.Count, fmt.Errorf("Could not find an exact match for %s: %+v", keyword, l)
+}
+
+// Lists storage tags
+func (s *ResourcetagsService) ListStorageTags(p *ListStorageTagsParams) (*ListStorageTagsResponse, error) {
+	resp, err := s.cs.newRequest("listStorageTags", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListStorageTagsResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListStorageTagsResponse struct {
+	Count       int           `json:"count"`
+	StorageTags []*StorageTag `json:"storagetag"`
+}
+
+type StorageTag struct {
+	Id     string `json:"id"`
+	Name   string `json:"name"`
+	Poolid int64  `json:"poolid"`
+}
+
+type ListTagsParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListTagsParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["customer"]; found {
+		u.Set("customer", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["isrecursive"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("isrecursive", vv)
+	}
+	if v, found := p.p["key"]; found {
+		u.Set("key", v.(string))
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["listall"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("listall", vv)
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["projectid"]; found {
+		u.Set("projectid", v.(string))
+	}
+	if v, found := p.p["resourceid"]; found {
+		u.Set("resourceid", v.(string))
+	}
+	if v, found := p.p["resourcetype"]; found {
+		u.Set("resourcetype", v.(string))
+	}
+	if v, found := p.p["value"]; found {
+		u.Set("value", v.(string))
+	}
+	return u
+}
+
+func (p *ListTagsParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *ListTagsParams) SetCustomer(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["customer"] = v
+	return
+}
+
+func (p *ListTagsParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *ListTagsParams) SetIsrecursive(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isrecursive"] = v
+	return
+}
+
+func (p *ListTagsParams) SetKey(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["key"] = v
+	return
+}
+
+func (p *ListTagsParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListTagsParams) SetListall(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["listall"] = v
+	return
+}
+
+func (p *ListTagsParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListTagsParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListTagsParams) SetProjectid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectid"] = v
+	return
+}
+
+func (p *ListTagsParams) SetResourceid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["resourceid"] = v
+	return
+}
+
+func (p *ListTagsParams) SetResourcetype(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["resourcetype"] = v
+	return
+}
+
+func (p *ListTagsParams) SetValue(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["value"] = v
+	return
+}
+
+// You should always use this function to get a new ListTagsParams instance,
+// as then you are sure you have configured all required params
+func (s *ResourcetagsService) NewListTagsParams() *ListTagsParams {
+	p := &ListTagsParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// List resource tag(s)
+func (s *ResourcetagsService) ListTags(p *ListTagsParams) (*ListTagsResponse, error) {
+	resp, err := s.cs.newRequest("listTags", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListTagsResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListTagsResponse struct {
+	Count int    `json:"count"`
+	Tags  []*Tag `json:"tag"`
+}
+
+type Tag struct {
+	Account      string `json:"account"`
+	Customer     string `json:"customer"`
+	Domain       string `json:"domain"`
+	Domainid     string `json:"domainid"`
+	Key          string `json:"key"`
+	Project      string `json:"project"`
+	Projectid    string `json:"projectid"`
+	Resourceid   string `json:"resourceid"`
+	Resourcetype string `json:"resourcetype"`
+	Value        string `json:"value"`
+}
diff --git a/vendor/github.com/xanzy/go-cloudstack/cloudstack/RoleService.go b/vendor/github.com/xanzy/go-cloudstack/cloudstack/RoleService.go
new file mode 100644
index 0000000..486e116
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/cloudstack/RoleService.go
@@ -0,0 +1,669 @@
+//
+// Copyright 2018, Sander van Harmelen
+//
+// Licensed 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 cloudstack
+
+import (
+	"encoding/json"
+	"fmt"
+	"net/url"
+	"strings"
+)
+
+type CreateRoleParams struct {
+	p map[string]interface{}
+}
+
+func (p *CreateRoleParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["description"]; found {
+		u.Set("description", v.(string))
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["type"]; found {
+		u.Set("type", v.(string))
+	}
+	return u
+}
+
+func (p *CreateRoleParams) SetDescription(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["description"] = v
+	return
+}
+
+func (p *CreateRoleParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *CreateRoleParams) SetType(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["type"] = v
+	return
+}
+
+// You should always use this function to get a new CreateRoleParams instance,
+// as then you are sure you have configured all required params
+func (s *RoleService) NewCreateRoleParams(name string, roleType string) *CreateRoleParams {
+	p := &CreateRoleParams{}
+	p.p = make(map[string]interface{})
+	p.p["name"] = name
+	p.p["type"] = roleType
+	return p
+}
+
+// Creates a role
+func (s *RoleService) CreateRole(p *CreateRoleParams) (*CreateRoleResponse, error) {
+	resp, err := s.cs.newRequest("createRole", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r CreateRoleResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type CreateRoleResponse struct {
+	Description string `json:"description"`
+	Id          string `json:"id"`
+	Name        string `json:"name"`
+	Type        string `json:"type"`
+}
+
+type CreateRolePermissionParams struct {
+	p map[string]interface{}
+}
+
+func (p *CreateRolePermissionParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["description"]; found {
+		u.Set("description", v.(string))
+	}
+	if v, found := p.p["permission"]; found {
+		u.Set("permission", v.(string))
+	}
+	if v, found := p.p["roleid"]; found {
+		u.Set("roleid", v.(string))
+	}
+	if v, found := p.p["rule"]; found {
+		u.Set("rule", v.(string))
+	}
+	return u
+}
+
+func (p *CreateRolePermissionParams) SetDescription(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["description"] = v
+	return
+}
+
+func (p *CreateRolePermissionParams) SetPermission(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["permission"] = v
+	return
+}
+
+func (p *CreateRolePermissionParams) SetRoleid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["roleid"] = v
+	return
+}
+
+func (p *CreateRolePermissionParams) SetRule(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["rule"] = v
+	return
+}
+
+// You should always use this function to get a new CreateRolePermissionParams instance,
+// as then you are sure you have configured all required params
+func (s *RoleService) NewCreateRolePermissionParams(permission string, roleid string, rule string) *CreateRolePermissionParams {
+	p := &CreateRolePermissionParams{}
+	p.p = make(map[string]interface{})
+	p.p["permission"] = permission
+	p.p["roleid"] = roleid
+	p.p["rule"] = rule
+	return p
+}
+
+// Adds a API permission to a role
+func (s *RoleService) CreateRolePermission(p *CreateRolePermissionParams) (*CreateRolePermissionResponse, error) {
+	resp, err := s.cs.newRequest("createRolePermission", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r CreateRolePermissionResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type CreateRolePermissionResponse struct {
+	Description string `json:"description"`
+	Id          string `json:"id"`
+	Permission  string `json:"permission"`
+	Roleid      string `json:"roleid"`
+	Rolename    string `json:"rolename"`
+	Rule        string `json:"rule"`
+}
+
+type DeleteRoleParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeleteRoleParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *DeleteRoleParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new DeleteRoleParams instance,
+// as then you are sure you have configured all required params
+func (s *RoleService) NewDeleteRoleParams(id string) *DeleteRoleParams {
+	p := &DeleteRoleParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Deletes a role
+func (s *RoleService) DeleteRole(p *DeleteRoleParams) (*DeleteRoleResponse, error) {
+	resp, err := s.cs.newRequest("deleteRole", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeleteRoleResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type DeleteRoleResponse struct {
+	Displaytext string `json:"displaytext"`
+	Success     string `json:"success"`
+}
+
+type DeleteRolePermissionParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeleteRolePermissionParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *DeleteRolePermissionParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new DeleteRolePermissionParams instance,
+// as then you are sure you have configured all required params
+func (s *RoleService) NewDeleteRolePermissionParams(id string) *DeleteRolePermissionParams {
+	p := &DeleteRolePermissionParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Deletes a role permission
+func (s *RoleService) DeleteRolePermission(p *DeleteRolePermissionParams) (*DeleteRolePermissionResponse, error) {
+	resp, err := s.cs.newRequest("deleteRolePermission", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeleteRolePermissionResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type DeleteRolePermissionResponse struct {
+	Displaytext string `json:"displaytext"`
+	Success     string `json:"success"`
+}
+
+type ListRolePermissionsParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListRolePermissionsParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["roleid"]; found {
+		u.Set("roleid", v.(string))
+	}
+	return u
+}
+
+func (p *ListRolePermissionsParams) SetRoleid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["roleid"] = v
+	return
+}
+
+// You should always use this function to get a new ListRolePermissionsParams instance,
+// as then you are sure you have configured all required params
+func (s *RoleService) NewListRolePermissionsParams() *ListRolePermissionsParams {
+	p := &ListRolePermissionsParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// Lists role permissions
+func (s *RoleService) ListRolePermissions(p *ListRolePermissionsParams) (*ListRolePermissionsResponse, error) {
+	resp, err := s.cs.newRequest("listRolePermissions", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListRolePermissionsResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListRolePermissionsResponse struct {
+	Count           int               `json:"count"`
+	RolePermissions []*RolePermission `json:"rolepermission"`
+}
+
+type RolePermission struct {
+	Description string `json:"description"`
+	Id          string `json:"id"`
+	Permission  string `json:"permission"`
+	Roleid      string `json:"roleid"`
+	Rolename    string `json:"rolename"`
+	Rule        string `json:"rule"`
+}
+
+type ListRolesParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListRolesParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["type"]; found {
+		u.Set("type", v.(string))
+	}
+	return u
+}
+
+func (p *ListRolesParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ListRolesParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *ListRolesParams) SetType(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["type"] = v
+	return
+}
+
+// You should always use this function to get a new ListRolesParams instance,
+// as then you are sure you have configured all required params
+func (s *RoleService) NewListRolesParams() *ListRolesParams {
+	p := &ListRolesParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *RoleService) GetRoleID(name string, opts ...OptionFunc) (string, int, error) {
+	p := &ListRolesParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["name"] = name
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return "", -1, err
+		}
+	}
+
+	l, err := s.ListRoles(p)
+	if err != nil {
+		return "", -1, err
+	}
+
+	if l.Count == 0 {
+		return "", l.Count, fmt.Errorf("No match found for %s: %+v", name, l)
+	}
+
+	if l.Count == 1 {
+		return l.Roles[0].Id, l.Count, nil
+	}
+
+	if l.Count > 1 {
+		for _, v := range l.Roles {
+			if v.Name == name {
+				return v.Id, l.Count, nil
+			}
+		}
+	}
+	return "", l.Count, fmt.Errorf("Could not find an exact match for %s: %+v", name, l)
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *RoleService) GetRoleByName(name string, opts ...OptionFunc) (*Role, int, error) {
+	id, count, err := s.GetRoleID(name, opts...)
+	if err != nil {
+		return nil, count, err
+	}
+
+	r, count, err := s.GetRoleByID(id, opts...)
+	if err != nil {
+		return nil, count, err
+	}
+	return r, count, nil
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *RoleService) GetRoleByID(id string, opts ...OptionFunc) (*Role, int, error) {
+	p := &ListRolesParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["id"] = id
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return nil, -1, err
+		}
+	}
+
+	l, err := s.ListRoles(p)
+	if err != nil {
+		if strings.Contains(err.Error(), fmt.Sprintf(
+			"Invalid parameter id value=%s due to incorrect long value format, "+
+				"or entity does not exist", id)) {
+			return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
+		}
+		return nil, -1, err
+	}
+
+	if l.Count == 0 {
+		return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
+	}
+
+	if l.Count == 1 {
+		return l.Roles[0], l.Count, nil
+	}
+	return nil, l.Count, fmt.Errorf("There is more then one result for Role UUID: %s!", id)
+}
+
+// Lists dynamic roles in CloudStack
+func (s *RoleService) ListRoles(p *ListRolesParams) (*ListRolesResponse, error) {
+	resp, err := s.cs.newRequest("listRoles", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListRolesResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListRolesResponse struct {
+	Count int     `json:"count"`
+	Roles []*Role `json:"role"`
+}
+
+type Role struct {
+	Description string `json:"description"`
+	Id          string `json:"id"`
+	Name        string `json:"name"`
+	Type        string `json:"type"`
+}
+
+type UpdateRoleParams struct {
+	p map[string]interface{}
+}
+
+func (p *UpdateRoleParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["description"]; found {
+		u.Set("description", v.(string))
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["type"]; found {
+		u.Set("type", v.(string))
+	}
+	return u
+}
+
+func (p *UpdateRoleParams) SetDescription(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["description"] = v
+	return
+}
+
+func (p *UpdateRoleParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *UpdateRoleParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *UpdateRoleParams) SetType(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["type"] = v
+	return
+}
+
+// You should always use this function to get a new UpdateRoleParams instance,
+// as then you are sure you have configured all required params
+func (s *RoleService) NewUpdateRoleParams(id string) *UpdateRoleParams {
+	p := &UpdateRoleParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Updates a role
+func (s *RoleService) UpdateRole(p *UpdateRoleParams) (*UpdateRoleResponse, error) {
+	resp, err := s.cs.newRequest("updateRole", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r UpdateRoleResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type UpdateRoleResponse struct {
+	Displaytext string `json:"displaytext"`
+	Success     string `json:"success"`
+}
+
+type UpdateRolePermissionParams struct {
+	p map[string]interface{}
+}
+
+func (p *UpdateRolePermissionParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["roleid"]; found {
+		u.Set("roleid", v.(string))
+	}
+	if v, found := p.p["ruleorder"]; found {
+		vv := strings.Join(v.([]string), ",")
+		u.Set("ruleorder", vv)
+	}
+	return u
+}
+
+func (p *UpdateRolePermissionParams) SetRoleid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["roleid"] = v
+	return
+}
+
+func (p *UpdateRolePermissionParams) SetRuleorder(v []string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["ruleorder"] = v
+	return
+}
+
+// You should always use this function to get a new UpdateRolePermissionParams instance,
+// as then you are sure you have configured all required params
+func (s *RoleService) NewUpdateRolePermissionParams(roleid string, ruleorder []string) *UpdateRolePermissionParams {
+	p := &UpdateRolePermissionParams{}
+	p.p = make(map[string]interface{})
+	p.p["roleid"] = roleid
+	p.p["ruleorder"] = ruleorder
+	return p
+}
+
+// Updates a role permission order
+func (s *RoleService) UpdateRolePermission(p *UpdateRolePermissionParams) (*UpdateRolePermissionResponse, error) {
+	resp, err := s.cs.newRequest("updateRolePermission", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r UpdateRolePermissionResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type UpdateRolePermissionResponse struct {
+	Displaytext string `json:"displaytext"`
+	Success     string `json:"success"`
+}
diff --git a/vendor/github.com/xanzy/go-cloudstack/cloudstack/RouterService.go b/vendor/github.com/xanzy/go-cloudstack/cloudstack/RouterService.go
new file mode 100644
index 0000000..ec34cd3
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/cloudstack/RouterService.go
@@ -0,0 +1,1478 @@
+//
+// Copyright 2018, Sander van Harmelen
+//
+// Licensed 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 cloudstack
+
+import (
+	"encoding/json"
+	"fmt"
+	"net/url"
+	"strconv"
+	"strings"
+)
+
+type ChangeServiceForRouterParams struct {
+	p map[string]interface{}
+}
+
+func (p *ChangeServiceForRouterParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["serviceofferingid"]; found {
+		u.Set("serviceofferingid", v.(string))
+	}
+	return u
+}
+
+func (p *ChangeServiceForRouterParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ChangeServiceForRouterParams) SetServiceofferingid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["serviceofferingid"] = v
+	return
+}
+
+// You should always use this function to get a new ChangeServiceForRouterParams instance,
+// as then you are sure you have configured all required params
+func (s *RouterService) NewChangeServiceForRouterParams(id string, serviceofferingid string) *ChangeServiceForRouterParams {
+	p := &ChangeServiceForRouterParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	p.p["serviceofferingid"] = serviceofferingid
+	return p
+}
+
+// Upgrades domain router to a new service offering
+func (s *RouterService) ChangeServiceForRouter(p *ChangeServiceForRouterParams) (*ChangeServiceForRouterResponse, error) {
+	resp, err := s.cs.newRequest("changeServiceForRouter", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ChangeServiceForRouterResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ChangeServiceForRouterResponse struct {
+	Account             string `json:"account"`
+	Created             string `json:"created"`
+	Dns1                string `json:"dns1"`
+	Dns2                string `json:"dns2"`
+	Domain              string `json:"domain"`
+	Domainid            string `json:"domainid"`
+	Gateway             string `json:"gateway"`
+	Guestipaddress      string `json:"guestipaddress"`
+	Guestmacaddress     string `json:"guestmacaddress"`
+	Guestnetmask        string `json:"guestnetmask"`
+	Guestnetworkid      string `json:"guestnetworkid"`
+	Guestnetworkname    string `json:"guestnetworkname"`
+	Hostid              string `json:"hostid"`
+	Hostname            string `json:"hostname"`
+	Hypervisor          string `json:"hypervisor"`
+	Id                  string `json:"id"`
+	Ip6dns1             string `json:"ip6dns1"`
+	Ip6dns2             string `json:"ip6dns2"`
+	Isredundantrouter   bool   `json:"isredundantrouter"`
+	Linklocalip         string `json:"linklocalip"`
+	Linklocalmacaddress string `json:"linklocalmacaddress"`
+	Linklocalnetmask    string `json:"linklocalnetmask"`
+	Linklocalnetworkid  string `json:"linklocalnetworkid"`
+	Name                string `json:"name"`
+	Networkdomain       string `json:"networkdomain"`
+	Nic                 []struct {
+		Broadcasturi         string `json:"broadcasturi"`
+		Deviceid             string `json:"deviceid"`
+		Gateway              string `json:"gateway"`
+		Id                   string `json:"id"`
+		Ip6address           string `json:"ip6address"`
+		Ip6cidr              string `json:"ip6cidr"`
+		Ip6gateway           string `json:"ip6gateway"`
+		Ipaddress            string `json:"ipaddress"`
+		Isdefault            bool   `json:"isdefault"`
+		Isolationuri         string `json:"isolationuri"`
+		Macaddress           string `json:"macaddress"`
+		Netmask              string `json:"netmask"`
+		Networkid            string `json:"networkid"`
+		Networkname          string `json:"networkname"`
+		Nsxlogicalswitch     string `json:"nsxlogicalswitch"`
+		Nsxlogicalswitchport string `json:"nsxlogicalswitchport"`
+		Secondaryip          []struct {
+			Id        string `json:"id"`
+			Ipaddress string `json:"ipaddress"`
+		} `json:"secondaryip"`
+		Traffictype      string `json:"traffictype"`
+		Type             string `json:"type"`
+		Virtualmachineid string `json:"virtualmachineid"`
+	} `json:"nic"`
+	Podid               string `json:"podid"`
+	Project             string `json:"project"`
+	Projectid           string `json:"projectid"`
+	Publicip            string `json:"publicip"`
+	Publicmacaddress    string `json:"publicmacaddress"`
+	Publicnetmask       string `json:"publicnetmask"`
+	Publicnetworkid     string `json:"publicnetworkid"`
+	Redundantstate      string `json:"redundantstate"`
+	Requiresupgrade     bool   `json:"requiresupgrade"`
+	Role                string `json:"role"`
+	Scriptsversion      string `json:"scriptsversion"`
+	Serviceofferingid   string `json:"serviceofferingid"`
+	Serviceofferingname string `json:"serviceofferingname"`
+	State               string `json:"state"`
+	Templateid          string `json:"templateid"`
+	Version             string `json:"version"`
+	Vpcid               string `json:"vpcid"`
+	Vpcname             string `json:"vpcname"`
+	Zoneid              string `json:"zoneid"`
+	Zonename            string `json:"zonename"`
+}
+
+type ConfigureVirtualRouterElementParams struct {
+	p map[string]interface{}
+}
+
+func (p *ConfigureVirtualRouterElementParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["enabled"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("enabled", vv)
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *ConfigureVirtualRouterElementParams) SetEnabled(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["enabled"] = v
+	return
+}
+
+func (p *ConfigureVirtualRouterElementParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new ConfigureVirtualRouterElementParams instance,
+// as then you are sure you have configured all required params
+func (s *RouterService) NewConfigureVirtualRouterElementParams(enabled bool, id string) *ConfigureVirtualRouterElementParams {
+	p := &ConfigureVirtualRouterElementParams{}
+	p.p = make(map[string]interface{})
+	p.p["enabled"] = enabled
+	p.p["id"] = id
+	return p
+}
+
+// Configures a virtual router element.
+func (s *RouterService) ConfigureVirtualRouterElement(p *ConfigureVirtualRouterElementParams) (*VirtualRouterElementResponse, error) {
+	resp, err := s.cs.newRequest("configureVirtualRouterElement", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r VirtualRouterElementResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type VirtualRouterElementResponse struct {
+	JobID     string `json:"jobid"`
+	Account   string `json:"account"`
+	Domain    string `json:"domain"`
+	Domainid  string `json:"domainid"`
+	Enabled   bool   `json:"enabled"`
+	Id        string `json:"id"`
+	Nspid     string `json:"nspid"`
+	Project   string `json:"project"`
+	Projectid string `json:"projectid"`
+}
+
+type CreateVirtualRouterElementParams struct {
+	p map[string]interface{}
+}
+
+func (p *CreateVirtualRouterElementParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["nspid"]; found {
+		u.Set("nspid", v.(string))
+	}
+	if v, found := p.p["providertype"]; found {
+		u.Set("providertype", v.(string))
+	}
+	return u
+}
+
+func (p *CreateVirtualRouterElementParams) SetNspid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["nspid"] = v
+	return
+}
+
+func (p *CreateVirtualRouterElementParams) SetProvidertype(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["providertype"] = v
+	return
+}
+
+// You should always use this function to get a new CreateVirtualRouterElementParams instance,
+// as then you are sure you have configured all required params
+func (s *RouterService) NewCreateVirtualRouterElementParams(nspid string) *CreateVirtualRouterElementParams {
+	p := &CreateVirtualRouterElementParams{}
+	p.p = make(map[string]interface{})
+	p.p["nspid"] = nspid
+	return p
+}
+
+// Create a virtual router element.
+func (s *RouterService) CreateVirtualRouterElement(p *CreateVirtualRouterElementParams) (*CreateVirtualRouterElementResponse, error) {
+	resp, err := s.cs.newRequest("createVirtualRouterElement", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r CreateVirtualRouterElementResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type CreateVirtualRouterElementResponse struct {
+	JobID     string `json:"jobid"`
+	Account   string `json:"account"`
+	Domain    string `json:"domain"`
+	Domainid  string `json:"domainid"`
+	Enabled   bool   `json:"enabled"`
+	Id        string `json:"id"`
+	Nspid     string `json:"nspid"`
+	Project   string `json:"project"`
+	Projectid string `json:"projectid"`
+}
+
+type DestroyRouterParams struct {
+	p map[string]interface{}
+}
+
+func (p *DestroyRouterParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *DestroyRouterParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new DestroyRouterParams instance,
+// as then you are sure you have configured all required params
+func (s *RouterService) NewDestroyRouterParams(id string) *DestroyRouterParams {
+	p := &DestroyRouterParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Destroys a router.
+func (s *RouterService) DestroyRouter(p *DestroyRouterParams) (*DestroyRouterResponse, error) {
+	resp, err := s.cs.newRequest("destroyRouter", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DestroyRouterResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type DestroyRouterResponse struct {
+	JobID               string `json:"jobid"`
+	Account             string `json:"account"`
+	Created             string `json:"created"`
+	Dns1                string `json:"dns1"`
+	Dns2                string `json:"dns2"`
+	Domain              string `json:"domain"`
+	Domainid            string `json:"domainid"`
+	Gateway             string `json:"gateway"`
+	Guestipaddress      string `json:"guestipaddress"`
+	Guestmacaddress     string `json:"guestmacaddress"`
+	Guestnetmask        string `json:"guestnetmask"`
+	Guestnetworkid      string `json:"guestnetworkid"`
+	Guestnetworkname    string `json:"guestnetworkname"`
+	Hostid              string `json:"hostid"`
+	Hostname            string `json:"hostname"`
+	Hypervisor          string `json:"hypervisor"`
+	Id                  string `json:"id"`
+	Ip6dns1             string `json:"ip6dns1"`
+	Ip6dns2             string `json:"ip6dns2"`
+	Isredundantrouter   bool   `json:"isredundantrouter"`
+	Linklocalip         string `json:"linklocalip"`
+	Linklocalmacaddress string `json:"linklocalmacaddress"`
+	Linklocalnetmask    string `json:"linklocalnetmask"`
+	Linklocalnetworkid  string `json:"linklocalnetworkid"`
+	Name                string `json:"name"`
+	Networkdomain       string `json:"networkdomain"`
+	Nic                 []struct {
+		Broadcasturi         string `json:"broadcasturi"`
+		Deviceid             string `json:"deviceid"`
+		Gateway              string `json:"gateway"`
+		Id                   string `json:"id"`
+		Ip6address           string `json:"ip6address"`
+		Ip6cidr              string `json:"ip6cidr"`
+		Ip6gateway           string `json:"ip6gateway"`
+		Ipaddress            string `json:"ipaddress"`
+		Isdefault            bool   `json:"isdefault"`
+		Isolationuri         string `json:"isolationuri"`
+		Macaddress           string `json:"macaddress"`
+		Netmask              string `json:"netmask"`
+		Networkid            string `json:"networkid"`
+		Networkname          string `json:"networkname"`
+		Nsxlogicalswitch     string `json:"nsxlogicalswitch"`
+		Nsxlogicalswitchport string `json:"nsxlogicalswitchport"`
+		Secondaryip          []struct {
+			Id        string `json:"id"`
+			Ipaddress string `json:"ipaddress"`
+		} `json:"secondaryip"`
+		Traffictype      string `json:"traffictype"`
+		Type             string `json:"type"`
+		Virtualmachineid string `json:"virtualmachineid"`
+	} `json:"nic"`
+	Podid               string `json:"podid"`
+	Project             string `json:"project"`
+	Projectid           string `json:"projectid"`
+	Publicip            string `json:"publicip"`
+	Publicmacaddress    string `json:"publicmacaddress"`
+	Publicnetmask       string `json:"publicnetmask"`
+	Publicnetworkid     string `json:"publicnetworkid"`
+	Redundantstate      string `json:"redundantstate"`
+	Requiresupgrade     bool   `json:"requiresupgrade"`
+	Role                string `json:"role"`
+	Scriptsversion      string `json:"scriptsversion"`
+	Serviceofferingid   string `json:"serviceofferingid"`
+	Serviceofferingname string `json:"serviceofferingname"`
+	State               string `json:"state"`
+	Templateid          string `json:"templateid"`
+	Version             string `json:"version"`
+	Vpcid               string `json:"vpcid"`
+	Vpcname             string `json:"vpcname"`
+	Zoneid              string `json:"zoneid"`
+	Zonename            string `json:"zonename"`
+}
+
+type ListRoutersParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListRoutersParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["clusterid"]; found {
+		u.Set("clusterid", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["forvpc"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("forvpc", vv)
+	}
+	if v, found := p.p["hostid"]; found {
+		u.Set("hostid", v.(string))
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["isrecursive"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("isrecursive", vv)
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["listall"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("listall", vv)
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["networkid"]; found {
+		u.Set("networkid", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["podid"]; found {
+		u.Set("podid", v.(string))
+	}
+	if v, found := p.p["projectid"]; found {
+		u.Set("projectid", v.(string))
+	}
+	if v, found := p.p["state"]; found {
+		u.Set("state", v.(string))
+	}
+	if v, found := p.p["version"]; found {
+		u.Set("version", v.(string))
+	}
+	if v, found := p.p["vpcid"]; found {
+		u.Set("vpcid", v.(string))
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *ListRoutersParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *ListRoutersParams) SetClusterid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["clusterid"] = v
+	return
+}
+
+func (p *ListRoutersParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *ListRoutersParams) SetForvpc(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["forvpc"] = v
+	return
+}
+
+func (p *ListRoutersParams) SetHostid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["hostid"] = v
+	return
+}
+
+func (p *ListRoutersParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ListRoutersParams) SetIsrecursive(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isrecursive"] = v
+	return
+}
+
+func (p *ListRoutersParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListRoutersParams) SetListall(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["listall"] = v
+	return
+}
+
+func (p *ListRoutersParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *ListRoutersParams) SetNetworkid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["networkid"] = v
+	return
+}
+
+func (p *ListRoutersParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListRoutersParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListRoutersParams) SetPodid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["podid"] = v
+	return
+}
+
+func (p *ListRoutersParams) SetProjectid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectid"] = v
+	return
+}
+
+func (p *ListRoutersParams) SetState(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["state"] = v
+	return
+}
+
+func (p *ListRoutersParams) SetVersion(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["version"] = v
+	return
+}
+
+func (p *ListRoutersParams) SetVpcid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["vpcid"] = v
+	return
+}
+
+func (p *ListRoutersParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new ListRoutersParams instance,
+// as then you are sure you have configured all required params
+func (s *RouterService) NewListRoutersParams() *ListRoutersParams {
+	p := &ListRoutersParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *RouterService) GetRouterID(name string, opts ...OptionFunc) (string, int, error) {
+	p := &ListRoutersParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["name"] = name
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return "", -1, err
+		}
+	}
+
+	l, err := s.ListRouters(p)
+	if err != nil {
+		return "", -1, err
+	}
+
+	if l.Count == 0 {
+		return "", l.Count, fmt.Errorf("No match found for %s: %+v", name, l)
+	}
+
+	if l.Count == 1 {
+		return l.Routers[0].Id, l.Count, nil
+	}
+
+	if l.Count > 1 {
+		for _, v := range l.Routers {
+			if v.Name == name {
+				return v.Id, l.Count, nil
+			}
+		}
+	}
+	return "", l.Count, fmt.Errorf("Could not find an exact match for %s: %+v", name, l)
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *RouterService) GetRouterByName(name string, opts ...OptionFunc) (*Router, int, error) {
+	id, count, err := s.GetRouterID(name, opts...)
+	if err != nil {
+		return nil, count, err
+	}
+
+	r, count, err := s.GetRouterByID(id, opts...)
+	if err != nil {
+		return nil, count, err
+	}
+	return r, count, nil
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *RouterService) GetRouterByID(id string, opts ...OptionFunc) (*Router, int, error) {
+	p := &ListRoutersParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["id"] = id
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return nil, -1, err
+		}
+	}
+
+	l, err := s.ListRouters(p)
+	if err != nil {
+		if strings.Contains(err.Error(), fmt.Sprintf(
+			"Invalid parameter id value=%s due to incorrect long value format, "+
+				"or entity does not exist", id)) {
+			return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
+		}
+		return nil, -1, err
+	}
+
+	if l.Count == 0 {
+		return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
+	}
+
+	if l.Count == 1 {
+		return l.Routers[0], l.Count, nil
+	}
+	return nil, l.Count, fmt.Errorf("There is more then one result for Router UUID: %s!", id)
+}
+
+// List routers.
+func (s *RouterService) ListRouters(p *ListRoutersParams) (*ListRoutersResponse, error) {
+	resp, err := s.cs.newRequest("listRouters", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListRoutersResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListRoutersResponse struct {
+	Count   int       `json:"count"`
+	Routers []*Router `json:"router"`
+}
+
+type Router struct {
+	Account             string `json:"account"`
+	Created             string `json:"created"`
+	Dns1                string `json:"dns1"`
+	Dns2                string `json:"dns2"`
+	Domain              string `json:"domain"`
+	Domainid            string `json:"domainid"`
+	Gateway             string `json:"gateway"`
+	Guestipaddress      string `json:"guestipaddress"`
+	Guestmacaddress     string `json:"guestmacaddress"`
+	Guestnetmask        string `json:"guestnetmask"`
+	Guestnetworkid      string `json:"guestnetworkid"`
+	Guestnetworkname    string `json:"guestnetworkname"`
+	Hostid              string `json:"hostid"`
+	Hostname            string `json:"hostname"`
+	Hypervisor          string `json:"hypervisor"`
+	Id                  string `json:"id"`
+	Ip6dns1             string `json:"ip6dns1"`
+	Ip6dns2             string `json:"ip6dns2"`
+	Isredundantrouter   bool   `json:"isredundantrouter"`
+	Linklocalip         string `json:"linklocalip"`
+	Linklocalmacaddress string `json:"linklocalmacaddress"`
+	Linklocalnetmask    string `json:"linklocalnetmask"`
+	Linklocalnetworkid  string `json:"linklocalnetworkid"`
+	Name                string `json:"name"`
+	Networkdomain       string `json:"networkdomain"`
+	Nic                 []struct {
+		Broadcasturi         string `json:"broadcasturi"`
+		Deviceid             string `json:"deviceid"`
+		Gateway              string `json:"gateway"`
+		Id                   string `json:"id"`
+		Ip6address           string `json:"ip6address"`
+		Ip6cidr              string `json:"ip6cidr"`
+		Ip6gateway           string `json:"ip6gateway"`
+		Ipaddress            string `json:"ipaddress"`
+		Isdefault            bool   `json:"isdefault"`
+		Isolationuri         string `json:"isolationuri"`
+		Macaddress           string `json:"macaddress"`
+		Netmask              string `json:"netmask"`
+		Networkid            string `json:"networkid"`
+		Networkname          string `json:"networkname"`
+		Nsxlogicalswitch     string `json:"nsxlogicalswitch"`
+		Nsxlogicalswitchport string `json:"nsxlogicalswitchport"`
+		Secondaryip          []struct {
+			Id        string `json:"id"`
+			Ipaddress string `json:"ipaddress"`
+		} `json:"secondaryip"`
+		Traffictype      string `json:"traffictype"`
+		Type             string `json:"type"`
+		Virtualmachineid string `json:"virtualmachineid"`
+	} `json:"nic"`
+	Podid               string `json:"podid"`
+	Project             string `json:"project"`
+	Projectid           string `json:"projectid"`
+	Publicip            string `json:"publicip"`
+	Publicmacaddress    string `json:"publicmacaddress"`
+	Publicnetmask       string `json:"publicnetmask"`
+	Publicnetworkid     string `json:"publicnetworkid"`
+	Redundantstate      string `json:"redundantstate"`
+	Requiresupgrade     bool   `json:"requiresupgrade"`
+	Role                string `json:"role"`
+	Scriptsversion      string `json:"scriptsversion"`
+	Serviceofferingid   string `json:"serviceofferingid"`
+	Serviceofferingname string `json:"serviceofferingname"`
+	State               string `json:"state"`
+	Templateid          string `json:"templateid"`
+	Version             string `json:"version"`
+	Vpcid               string `json:"vpcid"`
+	Vpcname             string `json:"vpcname"`
+	Zoneid              string `json:"zoneid"`
+	Zonename            string `json:"zonename"`
+}
+
+type ListVirtualRouterElementsParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListVirtualRouterElementsParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["enabled"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("enabled", vv)
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["nspid"]; found {
+		u.Set("nspid", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	return u
+}
+
+func (p *ListVirtualRouterElementsParams) SetEnabled(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["enabled"] = v
+	return
+}
+
+func (p *ListVirtualRouterElementsParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ListVirtualRouterElementsParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListVirtualRouterElementsParams) SetNspid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["nspid"] = v
+	return
+}
+
+func (p *ListVirtualRouterElementsParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListVirtualRouterElementsParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+// You should always use this function to get a new ListVirtualRouterElementsParams instance,
+// as then you are sure you have configured all required params
+func (s *RouterService) NewListVirtualRouterElementsParams() *ListVirtualRouterElementsParams {
+	p := &ListVirtualRouterElementsParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *RouterService) GetVirtualRouterElementByID(id string, opts ...OptionFunc) (*VirtualRouterElement, int, error) {
+	p := &ListVirtualRouterElementsParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["id"] = id
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return nil, -1, err
+		}
+	}
+
+	l, err := s.ListVirtualRouterElements(p)
+	if err != nil {
+		if strings.Contains(err.Error(), fmt.Sprintf(
+			"Invalid parameter id value=%s due to incorrect long value format, "+
+				"or entity does not exist", id)) {
+			return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
+		}
+		return nil, -1, err
+	}
+
+	if l.Count == 0 {
+		return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
+	}
+
+	if l.Count == 1 {
+		return l.VirtualRouterElements[0], l.Count, nil
+	}
+	return nil, l.Count, fmt.Errorf("There is more then one result for VirtualRouterElement UUID: %s!", id)
+}
+
+// Lists all available virtual router elements.
+func (s *RouterService) ListVirtualRouterElements(p *ListVirtualRouterElementsParams) (*ListVirtualRouterElementsResponse, error) {
+	resp, err := s.cs.newRequest("listVirtualRouterElements", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListVirtualRouterElementsResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListVirtualRouterElementsResponse struct {
+	Count                 int                     `json:"count"`
+	VirtualRouterElements []*VirtualRouterElement `json:"virtualrouterelement"`
+}
+
+type VirtualRouterElement struct {
+	Account   string `json:"account"`
+	Domain    string `json:"domain"`
+	Domainid  string `json:"domainid"`
+	Enabled   bool   `json:"enabled"`
+	Id        string `json:"id"`
+	Nspid     string `json:"nspid"`
+	Project   string `json:"project"`
+	Projectid string `json:"projectid"`
+}
+
+type RebootRouterParams struct {
+	p map[string]interface{}
+}
+
+func (p *RebootRouterParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *RebootRouterParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new RebootRouterParams instance,
+// as then you are sure you have configured all required params
+func (s *RouterService) NewRebootRouterParams(id string) *RebootRouterParams {
+	p := &RebootRouterParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Starts a router.
+func (s *RouterService) RebootRouter(p *RebootRouterParams) (*RebootRouterResponse, error) {
+	resp, err := s.cs.newRequest("rebootRouter", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r RebootRouterResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type RebootRouterResponse struct {
+	JobID               string `json:"jobid"`
+	Account             string `json:"account"`
+	Created             string `json:"created"`
+	Dns1                string `json:"dns1"`
+	Dns2                string `json:"dns2"`
+	Domain              string `json:"domain"`
+	Domainid            string `json:"domainid"`
+	Gateway             string `json:"gateway"`
+	Guestipaddress      string `json:"guestipaddress"`
+	Guestmacaddress     string `json:"guestmacaddress"`
+	Guestnetmask        string `json:"guestnetmask"`
+	Guestnetworkid      string `json:"guestnetworkid"`
+	Guestnetworkname    string `json:"guestnetworkname"`
+	Hostid              string `json:"hostid"`
+	Hostname            string `json:"hostname"`
+	Hypervisor          string `json:"hypervisor"`
+	Id                  string `json:"id"`
+	Ip6dns1             string `json:"ip6dns1"`
+	Ip6dns2             string `json:"ip6dns2"`
+	Isredundantrouter   bool   `json:"isredundantrouter"`
+	Linklocalip         string `json:"linklocalip"`
+	Linklocalmacaddress string `json:"linklocalmacaddress"`
+	Linklocalnetmask    string `json:"linklocalnetmask"`
+	Linklocalnetworkid  string `json:"linklocalnetworkid"`
+	Name                string `json:"name"`
+	Networkdomain       string `json:"networkdomain"`
+	Nic                 []struct {
+		Broadcasturi         string `json:"broadcasturi"`
+		Deviceid             string `json:"deviceid"`
+		Gateway              string `json:"gateway"`
+		Id                   string `json:"id"`
+		Ip6address           string `json:"ip6address"`
+		Ip6cidr              string `json:"ip6cidr"`
+		Ip6gateway           string `json:"ip6gateway"`
+		Ipaddress            string `json:"ipaddress"`
+		Isdefault            bool   `json:"isdefault"`
+		Isolationuri         string `json:"isolationuri"`
+		Macaddress           string `json:"macaddress"`
+		Netmask              string `json:"netmask"`
+		Networkid            string `json:"networkid"`
+		Networkname          string `json:"networkname"`
+		Nsxlogicalswitch     string `json:"nsxlogicalswitch"`
+		Nsxlogicalswitchport string `json:"nsxlogicalswitchport"`
+		Secondaryip          []struct {
+			Id        string `json:"id"`
+			Ipaddress string `json:"ipaddress"`
+		} `json:"secondaryip"`
+		Traffictype      string `json:"traffictype"`
+		Type             string `json:"type"`
+		Virtualmachineid string `json:"virtualmachineid"`
+	} `json:"nic"`
+	Podid               string `json:"podid"`
+	Project             string `json:"project"`
+	Projectid           string `json:"projectid"`
+	Publicip            string `json:"publicip"`
+	Publicmacaddress    string `json:"publicmacaddress"`
+	Publicnetmask       string `json:"publicnetmask"`
+	Publicnetworkid     string `json:"publicnetworkid"`
+	Redundantstate      string `json:"redundantstate"`
+	Requiresupgrade     bool   `json:"requiresupgrade"`
+	Role                string `json:"role"`
+	Scriptsversion      string `json:"scriptsversion"`
+	Serviceofferingid   string `json:"serviceofferingid"`
+	Serviceofferingname string `json:"serviceofferingname"`
+	State               string `json:"state"`
+	Templateid          string `json:"templateid"`
+	Version             string `json:"version"`
+	Vpcid               string `json:"vpcid"`
+	Vpcname             string `json:"vpcname"`
+	Zoneid              string `json:"zoneid"`
+	Zonename            string `json:"zonename"`
+}
+
+type StartRouterParams struct {
+	p map[string]interface{}
+}
+
+func (p *StartRouterParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *StartRouterParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new StartRouterParams instance,
+// as then you are sure you have configured all required params
+func (s *RouterService) NewStartRouterParams(id string) *StartRouterParams {
+	p := &StartRouterParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Starts a router.
+func (s *RouterService) StartRouter(p *StartRouterParams) (*StartRouterResponse, error) {
+	resp, err := s.cs.newRequest("startRouter", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r StartRouterResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type StartRouterResponse struct {
+	JobID               string `json:"jobid"`
+	Account             string `json:"account"`
+	Created             string `json:"created"`
+	Dns1                string `json:"dns1"`
+	Dns2                string `json:"dns2"`
+	Domain              string `json:"domain"`
+	Domainid            string `json:"domainid"`
+	Gateway             string `json:"gateway"`
+	Guestipaddress      string `json:"guestipaddress"`
+	Guestmacaddress     string `json:"guestmacaddress"`
+	Guestnetmask        string `json:"guestnetmask"`
+	Guestnetworkid      string `json:"guestnetworkid"`
+	Guestnetworkname    string `json:"guestnetworkname"`
+	Hostid              string `json:"hostid"`
+	Hostname            string `json:"hostname"`
+	Hypervisor          string `json:"hypervisor"`
+	Id                  string `json:"id"`
+	Ip6dns1             string `json:"ip6dns1"`
+	Ip6dns2             string `json:"ip6dns2"`
+	Isredundantrouter   bool   `json:"isredundantrouter"`
+	Linklocalip         string `json:"linklocalip"`
+	Linklocalmacaddress string `json:"linklocalmacaddress"`
+	Linklocalnetmask    string `json:"linklocalnetmask"`
+	Linklocalnetworkid  string `json:"linklocalnetworkid"`
+	Name                string `json:"name"`
+	Networkdomain       string `json:"networkdomain"`
+	Nic                 []struct {
+		Broadcasturi         string `json:"broadcasturi"`
+		Deviceid             string `json:"deviceid"`
+		Gateway              string `json:"gateway"`
+		Id                   string `json:"id"`
+		Ip6address           string `json:"ip6address"`
+		Ip6cidr              string `json:"ip6cidr"`
+		Ip6gateway           string `json:"ip6gateway"`
+		Ipaddress            string `json:"ipaddress"`
+		Isdefault            bool   `json:"isdefault"`
+		Isolationuri         string `json:"isolationuri"`
+		Macaddress           string `json:"macaddress"`
+		Netmask              string `json:"netmask"`
+		Networkid            string `json:"networkid"`
+		Networkname          string `json:"networkname"`
+		Nsxlogicalswitch     string `json:"nsxlogicalswitch"`
+		Nsxlogicalswitchport string `json:"nsxlogicalswitchport"`
+		Secondaryip          []struct {
+			Id        string `json:"id"`
+			Ipaddress string `json:"ipaddress"`
+		} `json:"secondaryip"`
+		Traffictype      string `json:"traffictype"`
+		Type             string `json:"type"`
+		Virtualmachineid string `json:"virtualmachineid"`
+	} `json:"nic"`
+	Podid               string `json:"podid"`
+	Project             string `json:"project"`
+	Projectid           string `json:"projectid"`
+	Publicip            string `json:"publicip"`
+	Publicmacaddress    string `json:"publicmacaddress"`
+	Publicnetmask       string `json:"publicnetmask"`
+	Publicnetworkid     string `json:"publicnetworkid"`
+	Redundantstate      string `json:"redundantstate"`
+	Requiresupgrade     bool   `json:"requiresupgrade"`
+	Role                string `json:"role"`
+	Scriptsversion      string `json:"scriptsversion"`
+	Serviceofferingid   string `json:"serviceofferingid"`
+	Serviceofferingname string `json:"serviceofferingname"`
+	State               string `json:"state"`
+	Templateid          string `json:"templateid"`
+	Version             string `json:"version"`
+	Vpcid               string `json:"vpcid"`
+	Vpcname             string `json:"vpcname"`
+	Zoneid              string `json:"zoneid"`
+	Zonename            string `json:"zonename"`
+}
+
+type StopRouterParams struct {
+	p map[string]interface{}
+}
+
+func (p *StopRouterParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["forced"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("forced", vv)
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *StopRouterParams) SetForced(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["forced"] = v
+	return
+}
+
+func (p *StopRouterParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new StopRouterParams instance,
+// as then you are sure you have configured all required params
+func (s *RouterService) NewStopRouterParams(id string) *StopRouterParams {
+	p := &StopRouterParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Stops a router.
+func (s *RouterService) StopRouter(p *StopRouterParams) (*StopRouterResponse, error) {
+	resp, err := s.cs.newRequest("stopRouter", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r StopRouterResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type StopRouterResponse struct {
+	JobID               string `json:"jobid"`
+	Account             string `json:"account"`
+	Created             string `json:"created"`
+	Dns1                string `json:"dns1"`
+	Dns2                string `json:"dns2"`
+	Domain              string `json:"domain"`
+	Domainid            string `json:"domainid"`
+	Gateway             string `json:"gateway"`
+	Guestipaddress      string `json:"guestipaddress"`
+	Guestmacaddress     string `json:"guestmacaddress"`
+	Guestnetmask        string `json:"guestnetmask"`
+	Guestnetworkid      string `json:"guestnetworkid"`
+	Guestnetworkname    string `json:"guestnetworkname"`
+	Hostid              string `json:"hostid"`
+	Hostname            string `json:"hostname"`
+	Hypervisor          string `json:"hypervisor"`
+	Id                  string `json:"id"`
+	Ip6dns1             string `json:"ip6dns1"`
+	Ip6dns2             string `json:"ip6dns2"`
+	Isredundantrouter   bool   `json:"isredundantrouter"`
+	Linklocalip         string `json:"linklocalip"`
+	Linklocalmacaddress string `json:"linklocalmacaddress"`
+	Linklocalnetmask    string `json:"linklocalnetmask"`
+	Linklocalnetworkid  string `json:"linklocalnetworkid"`
+	Name                string `json:"name"`
+	Networkdomain       string `json:"networkdomain"`
+	Nic                 []struct {
+		Broadcasturi         string `json:"broadcasturi"`
+		Deviceid             string `json:"deviceid"`
+		Gateway              string `json:"gateway"`
+		Id                   string `json:"id"`
+		Ip6address           string `json:"ip6address"`
+		Ip6cidr              string `json:"ip6cidr"`
+		Ip6gateway           string `json:"ip6gateway"`
+		Ipaddress            string `json:"ipaddress"`
+		Isdefault            bool   `json:"isdefault"`
+		Isolationuri         string `json:"isolationuri"`
+		Macaddress           string `json:"macaddress"`
+		Netmask              string `json:"netmask"`
+		Networkid            string `json:"networkid"`
+		Networkname          string `json:"networkname"`
+		Nsxlogicalswitch     string `json:"nsxlogicalswitch"`
+		Nsxlogicalswitchport string `json:"nsxlogicalswitchport"`
+		Secondaryip          []struct {
+			Id        string `json:"id"`
+			Ipaddress string `json:"ipaddress"`
+		} `json:"secondaryip"`
+		Traffictype      string `json:"traffictype"`
+		Type             string `json:"type"`
+		Virtualmachineid string `json:"virtualmachineid"`
+	} `json:"nic"`
+	Podid               string `json:"podid"`
+	Project             string `json:"project"`
+	Projectid           string `json:"projectid"`
+	Publicip            string `json:"publicip"`
+	Publicmacaddress    string `json:"publicmacaddress"`
+	Publicnetmask       string `json:"publicnetmask"`
+	Publicnetworkid     string `json:"publicnetworkid"`
+	Redundantstate      string `json:"redundantstate"`
+	Requiresupgrade     bool   `json:"requiresupgrade"`
+	Role                string `json:"role"`
+	Scriptsversion      string `json:"scriptsversion"`
+	Serviceofferingid   string `json:"serviceofferingid"`
+	Serviceofferingname string `json:"serviceofferingname"`
+	State               string `json:"state"`
+	Templateid          string `json:"templateid"`
+	Version             string `json:"version"`
+	Vpcid               string `json:"vpcid"`
+	Vpcname             string `json:"vpcname"`
+	Zoneid              string `json:"zoneid"`
+	Zonename            string `json:"zonename"`
+}
diff --git a/vendor/github.com/xanzy/go-cloudstack/cloudstack/SSHService.go b/vendor/github.com/xanzy/go-cloudstack/cloudstack/SSHService.go
new file mode 100644
index 0000000..d03ba8a
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/cloudstack/SSHService.go
@@ -0,0 +1,744 @@
+//
+// Copyright 2018, Sander van Harmelen
+//
+// Licensed 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 cloudstack
+
+import (
+	"encoding/json"
+	"net/url"
+	"strconv"
+)
+
+type CreateSSHKeyPairParams struct {
+	p map[string]interface{}
+}
+
+func (p *CreateSSHKeyPairParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["projectid"]; found {
+		u.Set("projectid", v.(string))
+	}
+	return u
+}
+
+func (p *CreateSSHKeyPairParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *CreateSSHKeyPairParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *CreateSSHKeyPairParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *CreateSSHKeyPairParams) SetProjectid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectid"] = v
+	return
+}
+
+// You should always use this function to get a new CreateSSHKeyPairParams instance,
+// as then you are sure you have configured all required params
+func (s *SSHService) NewCreateSSHKeyPairParams(name string) *CreateSSHKeyPairParams {
+	p := &CreateSSHKeyPairParams{}
+	p.p = make(map[string]interface{})
+	p.p["name"] = name
+	return p
+}
+
+// Create a new keypair and returns the private key
+func (s *SSHService) CreateSSHKeyPair(p *CreateSSHKeyPairParams) (*CreateSSHKeyPairResponse, error) {
+	resp, err := s.cs.newRequest("createSSHKeyPair", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	if resp, err = getRawValue(resp); err != nil {
+		return nil, err
+	}
+
+	var r CreateSSHKeyPairResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type CreateSSHKeyPairResponse struct {
+	Privatekey string `json:"privatekey"`
+}
+
+type DeleteSSHKeyPairParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeleteSSHKeyPairParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["projectid"]; found {
+		u.Set("projectid", v.(string))
+	}
+	return u
+}
+
+func (p *DeleteSSHKeyPairParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *DeleteSSHKeyPairParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *DeleteSSHKeyPairParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *DeleteSSHKeyPairParams) SetProjectid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectid"] = v
+	return
+}
+
+// You should always use this function to get a new DeleteSSHKeyPairParams instance,
+// as then you are sure you have configured all required params
+func (s *SSHService) NewDeleteSSHKeyPairParams(name string) *DeleteSSHKeyPairParams {
+	p := &DeleteSSHKeyPairParams{}
+	p.p = make(map[string]interface{})
+	p.p["name"] = name
+	return p
+}
+
+// Deletes a keypair by name
+func (s *SSHService) DeleteSSHKeyPair(p *DeleteSSHKeyPairParams) (*DeleteSSHKeyPairResponse, error) {
+	resp, err := s.cs.newRequest("deleteSSHKeyPair", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeleteSSHKeyPairResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type DeleteSSHKeyPairResponse struct {
+	Displaytext string `json:"displaytext"`
+	Success     string `json:"success"`
+}
+
+type ListSSHKeyPairsParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListSSHKeyPairsParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["fingerprint"]; found {
+		u.Set("fingerprint", v.(string))
+	}
+	if v, found := p.p["isrecursive"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("isrecursive", vv)
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["listall"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("listall", vv)
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["projectid"]; found {
+		u.Set("projectid", v.(string))
+	}
+	return u
+}
+
+func (p *ListSSHKeyPairsParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *ListSSHKeyPairsParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *ListSSHKeyPairsParams) SetFingerprint(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["fingerprint"] = v
+	return
+}
+
+func (p *ListSSHKeyPairsParams) SetIsrecursive(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isrecursive"] = v
+	return
+}
+
+func (p *ListSSHKeyPairsParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListSSHKeyPairsParams) SetListall(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["listall"] = v
+	return
+}
+
+func (p *ListSSHKeyPairsParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *ListSSHKeyPairsParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListSSHKeyPairsParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListSSHKeyPairsParams) SetProjectid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectid"] = v
+	return
+}
+
+// You should always use this function to get a new ListSSHKeyPairsParams instance,
+// as then you are sure you have configured all required params
+func (s *SSHService) NewListSSHKeyPairsParams() *ListSSHKeyPairsParams {
+	p := &ListSSHKeyPairsParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// List registered keypairs
+func (s *SSHService) ListSSHKeyPairs(p *ListSSHKeyPairsParams) (*ListSSHKeyPairsResponse, error) {
+	resp, err := s.cs.newRequest("listSSHKeyPairs", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListSSHKeyPairsResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListSSHKeyPairsResponse struct {
+	Count       int           `json:"count"`
+	SSHKeyPairs []*SSHKeyPair `json:"sshkeypair"`
+}
+
+type SSHKeyPair struct {
+	Account     string `json:"account"`
+	Domain      string `json:"domain"`
+	Domainid    string `json:"domainid"`
+	Fingerprint string `json:"fingerprint"`
+	Name        string `json:"name"`
+}
+
+type RegisterSSHKeyPairParams struct {
+	p map[string]interface{}
+}
+
+func (p *RegisterSSHKeyPairParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["projectid"]; found {
+		u.Set("projectid", v.(string))
+	}
+	if v, found := p.p["publickey"]; found {
+		u.Set("publickey", v.(string))
+	}
+	return u
+}
+
+func (p *RegisterSSHKeyPairParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *RegisterSSHKeyPairParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *RegisterSSHKeyPairParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *RegisterSSHKeyPairParams) SetProjectid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectid"] = v
+	return
+}
+
+func (p *RegisterSSHKeyPairParams) SetPublickey(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["publickey"] = v
+	return
+}
+
+// You should always use this function to get a new RegisterSSHKeyPairParams instance,
+// as then you are sure you have configured all required params
+func (s *SSHService) NewRegisterSSHKeyPairParams(name string, publickey string) *RegisterSSHKeyPairParams {
+	p := &RegisterSSHKeyPairParams{}
+	p.p = make(map[string]interface{})
+	p.p["name"] = name
+	p.p["publickey"] = publickey
+	return p
+}
+
+// Register a public key in a keypair under a certain name
+func (s *SSHService) RegisterSSHKeyPair(p *RegisterSSHKeyPairParams) (*RegisterSSHKeyPairResponse, error) {
+	resp, err := s.cs.newRequest("registerSSHKeyPair", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	if resp, err = getRawValue(resp); err != nil {
+		return nil, err
+	}
+
+	var r RegisterSSHKeyPairResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type RegisterSSHKeyPairResponse struct {
+	Account     string `json:"account"`
+	Domain      string `json:"domain"`
+	Domainid    string `json:"domainid"`
+	Fingerprint string `json:"fingerprint"`
+	Name        string `json:"name"`
+}
+
+type ResetSSHKeyForVirtualMachineParams struct {
+	p map[string]interface{}
+}
+
+func (p *ResetSSHKeyForVirtualMachineParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["keypair"]; found {
+		u.Set("keypair", v.(string))
+	}
+	if v, found := p.p["projectid"]; found {
+		u.Set("projectid", v.(string))
+	}
+	return u
+}
+
+func (p *ResetSSHKeyForVirtualMachineParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *ResetSSHKeyForVirtualMachineParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *ResetSSHKeyForVirtualMachineParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ResetSSHKeyForVirtualMachineParams) SetKeypair(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keypair"] = v
+	return
+}
+
+func (p *ResetSSHKeyForVirtualMachineParams) SetProjectid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectid"] = v
+	return
+}
+
+// You should always use this function to get a new ResetSSHKeyForVirtualMachineParams instance,
+// as then you are sure you have configured all required params
+func (s *SSHService) NewResetSSHKeyForVirtualMachineParams(id string, keypair string) *ResetSSHKeyForVirtualMachineParams {
+	p := &ResetSSHKeyForVirtualMachineParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	p.p["keypair"] = keypair
+	return p
+}
+
+// Resets the SSH Key for virtual machine. The virtual machine must be in a "Stopped" state. [async]
+func (s *SSHService) ResetSSHKeyForVirtualMachine(p *ResetSSHKeyForVirtualMachineParams) (*ResetSSHKeyForVirtualMachineResponse, error) {
+	resp, err := s.cs.newRequest("resetSSHKeyForVirtualMachine", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ResetSSHKeyForVirtualMachineResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type ResetSSHKeyForVirtualMachineResponse struct {
+	JobID         string `json:"jobid"`
+	Account       string `json:"account"`
+	Affinitygroup []struct {
+		Account           string   `json:"account"`
+		Description       string   `json:"description"`
+		Domain            string   `json:"domain"`
+		Domainid          string   `json:"domainid"`
+		Id                string   `json:"id"`
+		Name              string   `json:"name"`
+		Project           string   `json:"project"`
+		Projectid         string   `json:"projectid"`
+		Type              string   `json:"type"`
+		VirtualmachineIds []string `json:"virtualmachineIds"`
+	} `json:"affinitygroup"`
+	Cpunumber             int               `json:"cpunumber"`
+	Cpuspeed              int               `json:"cpuspeed"`
+	Cpuused               string            `json:"cpuused"`
+	Created               string            `json:"created"`
+	Details               map[string]string `json:"details"`
+	Diskioread            int64             `json:"diskioread"`
+	Diskiowrite           int64             `json:"diskiowrite"`
+	Diskkbsread           int64             `json:"diskkbsread"`
+	Diskkbswrite          int64             `json:"diskkbswrite"`
+	Diskofferingid        string            `json:"diskofferingid"`
+	Diskofferingname      string            `json:"diskofferingname"`
+	Displayname           string            `json:"displayname"`
+	Displayvm             bool              `json:"displayvm"`
+	Domain                string            `json:"domain"`
+	Domainid              string            `json:"domainid"`
+	Forvirtualnetwork     bool              `json:"forvirtualnetwork"`
+	Group                 string            `json:"group"`
+	Groupid               string            `json:"groupid"`
+	Guestosid             string            `json:"guestosid"`
+	Haenable              bool              `json:"haenable"`
+	Hostid                string            `json:"hostid"`
+	Hostname              string            `json:"hostname"`
+	Hypervisor            string            `json:"hypervisor"`
+	Id                    string            `json:"id"`
+	Instancename          string            `json:"instancename"`
+	Isdynamicallyscalable bool              `json:"isdynamicallyscalable"`
+	Isodisplaytext        string            `json:"isodisplaytext"`
+	Isoid                 string            `json:"isoid"`
+	Isoname               string            `json:"isoname"`
+	Keypair               string            `json:"keypair"`
+	Memory                int               `json:"memory"`
+	Memoryintfreekbs      int64             `json:"memoryintfreekbs"`
+	Memorykbs             int64             `json:"memorykbs"`
+	Memorytargetkbs       int64             `json:"memorytargetkbs"`
+	Name                  string            `json:"name"`
+	Networkkbsread        int64             `json:"networkkbsread"`
+	Networkkbswrite       int64             `json:"networkkbswrite"`
+	Nic                   []struct {
+		Broadcasturi         string `json:"broadcasturi"`
+		Deviceid             string `json:"deviceid"`
+		Gateway              string `json:"gateway"`
+		Id                   string `json:"id"`
+		Ip6address           string `json:"ip6address"`
+		Ip6cidr              string `json:"ip6cidr"`
+		Ip6gateway           string `json:"ip6gateway"`
+		Ipaddress            string `json:"ipaddress"`
+		Isdefault            bool   `json:"isdefault"`
+		Isolationuri         string `json:"isolationuri"`
+		Macaddress           string `json:"macaddress"`
+		Netmask              string `json:"netmask"`
+		Networkid            string `json:"networkid"`
+		Networkname          string `json:"networkname"`
+		Nsxlogicalswitch     string `json:"nsxlogicalswitch"`
+		Nsxlogicalswitchport string `json:"nsxlogicalswitchport"`
+		Secondaryip          []struct {
+			Id        string `json:"id"`
+			Ipaddress string `json:"ipaddress"`
+		} `json:"secondaryip"`
+		Traffictype      string `json:"traffictype"`
+		Type             string `json:"type"`
+		Virtualmachineid string `json:"virtualmachineid"`
+	} `json:"nic"`
+	Ostypeid        int64  `json:"ostypeid"`
+	Password        string `json:"password"`
+	Passwordenabled bool   `json:"passwordenabled"`
+	Project         string `json:"project"`
+	Projectid       string `json:"projectid"`
+	Publicip        string `json:"publicip"`
+	Publicipid      string `json:"publicipid"`
+	Rootdeviceid    int64  `json:"rootdeviceid"`
+	Rootdevicetype  string `json:"rootdevicetype"`
+	Securitygroup   []struct {
+		Account     string `json:"account"`
+		Description string `json:"description"`
+		Domain      string `json:"domain"`
+		Domainid    string `json:"domainid"`
+		Egressrule  []struct {
+			Account           string `json:"account"`
+			Cidr              string `json:"cidr"`
+			Endport           int    `json:"endport"`
+			Icmpcode          int    `json:"icmpcode"`
+			Icmptype          int    `json:"icmptype"`
+			Protocol          string `json:"protocol"`
+			Ruleid            string `json:"ruleid"`
+			Securitygroupname string `json:"securitygroupname"`
+			Startport         int    `json:"startport"`
+			Tags              []struct {
+				Account      string `json:"account"`
+				Customer     string `json:"customer"`
+				Domain       string `json:"domain"`
+				Domainid     string `json:"domainid"`
+				Key          string `json:"key"`
+				Project      string `json:"project"`
+				Projectid    string `json:"projectid"`
+				Resourceid   string `json:"resourceid"`
+				Resourcetype string `json:"resourcetype"`
+				Value        string `json:"value"`
+			} `json:"tags"`
+		} `json:"egressrule"`
+		Id          string `json:"id"`
+		Ingressrule []struct {
+			Account           string `json:"account"`
+			Cidr              string `json:"cidr"`
+			Endport           int    `json:"endport"`
+			Icmpcode          int    `json:"icmpcode"`
+			Icmptype          int    `json:"icmptype"`
+			Protocol          string `json:"protocol"`
+			Ruleid            string `json:"ruleid"`
+			Securitygroupname string `json:"securitygroupname"`
+			Startport         int    `json:"startport"`
+			Tags              []struct {
+				Account      string `json:"account"`
+				Customer     string `json:"customer"`
+				Domain       string `json:"domain"`
+				Domainid     string `json:"domainid"`
+				Key          string `json:"key"`
+				Project      string `json:"project"`
+				Projectid    string `json:"projectid"`
+				Resourceid   string `json:"resourceid"`
+				Resourcetype string `json:"resourcetype"`
+				Value        string `json:"value"`
+			} `json:"tags"`
+		} `json:"ingressrule"`
+		Name      string `json:"name"`
+		Project   string `json:"project"`
+		Projectid string `json:"projectid"`
+		Tags      []struct {
+			Account      string `json:"account"`
+			Customer     string `json:"customer"`
+			Domain       string `json:"domain"`
+			Domainid     string `json:"domainid"`
+			Key          string `json:"key"`
+			Project      string `json:"project"`
+			Projectid    string `json:"projectid"`
+			Resourceid   string `json:"resourceid"`
+			Resourcetype string `json:"resourcetype"`
+			Value        string `json:"value"`
+		} `json:"tags"`
+		Virtualmachinecount int           `json:"virtualmachinecount"`
+		Virtualmachineids   []interface{} `json:"virtualmachineids"`
+	} `json:"securitygroup"`
+	Serviceofferingid   string `json:"serviceofferingid"`
+	Serviceofferingname string `json:"serviceofferingname"`
+	Servicestate        string `json:"servicestate"`
+	State               string `json:"state"`
+	Templatedisplaytext string `json:"templatedisplaytext"`
+	Templateid          string `json:"templateid"`
+	Templatename        string `json:"templatename"`
+	Userid              string `json:"userid"`
+	Username            string `json:"username"`
+	Vgpu                string `json:"vgpu"`
+	Zoneid              string `json:"zoneid"`
+	Zonename            string `json:"zonename"`
+}
diff --git a/vendor/github.com/xanzy/go-cloudstack/cloudstack/SecurityGroupService.go b/vendor/github.com/xanzy/go-cloudstack/cloudstack/SecurityGroupService.go
new file mode 100644
index 0000000..0bf564f
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/cloudstack/SecurityGroupService.go
@@ -0,0 +1,1243 @@
+//
+// Copyright 2018, Sander van Harmelen
+//
+// Licensed 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 cloudstack
+
+import (
+	"encoding/json"
+	"fmt"
+	"net/url"
+	"strconv"
+	"strings"
+)
+
+// Helper function for maintaining backwards compatibility
+func convertAuthorizeSecurityGroupIngressResponse(b []byte) ([]byte, error) {
+	var raw struct {
+		Ingressrule []interface{} `json:"ingressrule"`
+	}
+	if err := json.Unmarshal(b, &raw); err != nil {
+		return nil, err
+	}
+
+	if len(raw.Ingressrule) != 1 {
+		return b, nil
+	}
+
+	return json.Marshal(raw.Ingressrule[0])
+}
+
+// Helper function for maintaining backwards compatibility
+func convertAuthorizeSecurityGroupEgressResponse(b []byte) ([]byte, error) {
+	var raw struct {
+		Egressrule []interface{} `json:"egressrule"`
+	}
+	if err := json.Unmarshal(b, &raw); err != nil {
+		return nil, err
+	}
+
+	if len(raw.Egressrule) != 1 {
+		return b, nil
+	}
+
+	return json.Marshal(raw.Egressrule[0])
+}
+
+type AuthorizeSecurityGroupEgressParams struct {
+	p map[string]interface{}
+}
+
+func (p *AuthorizeSecurityGroupEgressParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["cidrlist"]; found {
+		vv := strings.Join(v.([]string), ",")
+		u.Set("cidrlist", vv)
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["endport"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("endport", vv)
+	}
+	if v, found := p.p["icmpcode"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("icmpcode", vv)
+	}
+	if v, found := p.p["icmptype"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("icmptype", vv)
+	}
+	if v, found := p.p["projectid"]; found {
+		u.Set("projectid", v.(string))
+	}
+	if v, found := p.p["protocol"]; found {
+		u.Set("protocol", v.(string))
+	}
+	if v, found := p.p["securitygroupid"]; found {
+		u.Set("securitygroupid", v.(string))
+	}
+	if v, found := p.p["securitygroupname"]; found {
+		u.Set("securitygroupname", v.(string))
+	}
+	if v, found := p.p["startport"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("startport", vv)
+	}
+	if v, found := p.p["usersecuritygrouplist"]; found {
+		i := 0
+		for k, vv := range v.(map[string]string) {
+			u.Set(fmt.Sprintf("usersecuritygrouplist[%d].account", i), k)
+			u.Set(fmt.Sprintf("usersecuritygrouplist[%d].group", i), vv)
+			i++
+		}
+	}
+	return u
+}
+
+func (p *AuthorizeSecurityGroupEgressParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *AuthorizeSecurityGroupEgressParams) SetCidrlist(v []string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["cidrlist"] = v
+	return
+}
+
+func (p *AuthorizeSecurityGroupEgressParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *AuthorizeSecurityGroupEgressParams) SetEndport(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["endport"] = v
+	return
+}
+
+func (p *AuthorizeSecurityGroupEgressParams) SetIcmpcode(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["icmpcode"] = v
+	return
+}
+
+func (p *AuthorizeSecurityGroupEgressParams) SetIcmptype(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["icmptype"] = v
+	return
+}
+
+func (p *AuthorizeSecurityGroupEgressParams) SetProjectid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectid"] = v
+	return
+}
+
+func (p *AuthorizeSecurityGroupEgressParams) SetProtocol(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["protocol"] = v
+	return
+}
+
+func (p *AuthorizeSecurityGroupEgressParams) SetSecuritygroupid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["securitygroupid"] = v
+	return
+}
+
+func (p *AuthorizeSecurityGroupEgressParams) SetSecuritygroupname(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["securitygroupname"] = v
+	return
+}
+
+func (p *AuthorizeSecurityGroupEgressParams) SetStartport(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["startport"] = v
+	return
+}
+
+func (p *AuthorizeSecurityGroupEgressParams) SetUsersecuritygrouplist(v map[string]string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["usersecuritygrouplist"] = v
+	return
+}
+
+// You should always use this function to get a new AuthorizeSecurityGroupEgressParams instance,
+// as then you are sure you have configured all required params
+func (s *SecurityGroupService) NewAuthorizeSecurityGroupEgressParams() *AuthorizeSecurityGroupEgressParams {
+	p := &AuthorizeSecurityGroupEgressParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// Authorizes a particular egress rule for this security group
+func (s *SecurityGroupService) AuthorizeSecurityGroupEgress(p *AuthorizeSecurityGroupEgressParams) (*AuthorizeSecurityGroupEgressResponse, error) {
+	resp, err := s.cs.newRequest("authorizeSecurityGroupEgress", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r AuthorizeSecurityGroupEgressResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		b, err = convertAuthorizeSecurityGroupEgressResponse(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type AuthorizeSecurityGroupEgressResponse struct {
+	JobID             string `json:"jobid"`
+	Account           string `json:"account"`
+	Cidr              string `json:"cidr"`
+	Endport           int    `json:"endport"`
+	Icmpcode          int    `json:"icmpcode"`
+	Icmptype          int    `json:"icmptype"`
+	Protocol          string `json:"protocol"`
+	Ruleid            string `json:"ruleid"`
+	Securitygroupname string `json:"securitygroupname"`
+	Startport         int    `json:"startport"`
+	Tags              []struct {
+		Account      string `json:"account"`
+		Customer     string `json:"customer"`
+		Domain       string `json:"domain"`
+		Domainid     string `json:"domainid"`
+		Key          string `json:"key"`
+		Project      string `json:"project"`
+		Projectid    string `json:"projectid"`
+		Resourceid   string `json:"resourceid"`
+		Resourcetype string `json:"resourcetype"`
+		Value        string `json:"value"`
+	} `json:"tags"`
+}
+
+type AuthorizeSecurityGroupIngressParams struct {
+	p map[string]interface{}
+}
+
+func (p *AuthorizeSecurityGroupIngressParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["cidrlist"]; found {
+		vv := strings.Join(v.([]string), ",")
+		u.Set("cidrlist", vv)
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["endport"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("endport", vv)
+	}
+	if v, found := p.p["icmpcode"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("icmpcode", vv)
+	}
+	if v, found := p.p["icmptype"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("icmptype", vv)
+	}
+	if v, found := p.p["projectid"]; found {
+		u.Set("projectid", v.(string))
+	}
+	if v, found := p.p["protocol"]; found {
+		u.Set("protocol", v.(string))
+	}
+	if v, found := p.p["securitygroupid"]; found {
+		u.Set("securitygroupid", v.(string))
+	}
+	if v, found := p.p["securitygroupname"]; found {
+		u.Set("securitygroupname", v.(string))
+	}
+	if v, found := p.p["startport"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("startport", vv)
+	}
+	if v, found := p.p["usersecuritygrouplist"]; found {
+		i := 0
+		for k, vv := range v.(map[string]string) {
+			u.Set(fmt.Sprintf("usersecuritygrouplist[%d].account", i), k)
+			u.Set(fmt.Sprintf("usersecuritygrouplist[%d].group", i), vv)
+			i++
+		}
+	}
+	return u
+}
+
+func (p *AuthorizeSecurityGroupIngressParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *AuthorizeSecurityGroupIngressParams) SetCidrlist(v []string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["cidrlist"] = v
+	return
+}
+
+func (p *AuthorizeSecurityGroupIngressParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *AuthorizeSecurityGroupIngressParams) SetEndport(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["endport"] = v
+	return
+}
+
+func (p *AuthorizeSecurityGroupIngressParams) SetIcmpcode(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["icmpcode"] = v
+	return
+}
+
+func (p *AuthorizeSecurityGroupIngressParams) SetIcmptype(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["icmptype"] = v
+	return
+}
+
+func (p *AuthorizeSecurityGroupIngressParams) SetProjectid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectid"] = v
+	return
+}
+
+func (p *AuthorizeSecurityGroupIngressParams) SetProtocol(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["protocol"] = v
+	return
+}
+
+func (p *AuthorizeSecurityGroupIngressParams) SetSecuritygroupid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["securitygroupid"] = v
+	return
+}
+
+func (p *AuthorizeSecurityGroupIngressParams) SetSecuritygroupname(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["securitygroupname"] = v
+	return
+}
+
+func (p *AuthorizeSecurityGroupIngressParams) SetStartport(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["startport"] = v
+	return
+}
+
+func (p *AuthorizeSecurityGroupIngressParams) SetUsersecuritygrouplist(v map[string]string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["usersecuritygrouplist"] = v
+	return
+}
+
+// You should always use this function to get a new AuthorizeSecurityGroupIngressParams instance,
+// as then you are sure you have configured all required params
+func (s *SecurityGroupService) NewAuthorizeSecurityGroupIngressParams() *AuthorizeSecurityGroupIngressParams {
+	p := &AuthorizeSecurityGroupIngressParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// Authorizes a particular ingress rule for this security group
+func (s *SecurityGroupService) AuthorizeSecurityGroupIngress(p *AuthorizeSecurityGroupIngressParams) (*AuthorizeSecurityGroupIngressResponse, error) {
+	resp, err := s.cs.newRequest("authorizeSecurityGroupIngress", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r AuthorizeSecurityGroupIngressResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		b, err = convertAuthorizeSecurityGroupIngressResponse(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type AuthorizeSecurityGroupIngressResponse struct {
+	JobID             string `json:"jobid"`
+	Account           string `json:"account"`
+	Cidr              string `json:"cidr"`
+	Endport           int    `json:"endport"`
+	Icmpcode          int    `json:"icmpcode"`
+	Icmptype          int    `json:"icmptype"`
+	Protocol          string `json:"protocol"`
+	Ruleid            string `json:"ruleid"`
+	Securitygroupname string `json:"securitygroupname"`
+	Startport         int    `json:"startport"`
+	Tags              []struct {
+		Account      string `json:"account"`
+		Customer     string `json:"customer"`
+		Domain       string `json:"domain"`
+		Domainid     string `json:"domainid"`
+		Key          string `json:"key"`
+		Project      string `json:"project"`
+		Projectid    string `json:"projectid"`
+		Resourceid   string `json:"resourceid"`
+		Resourcetype string `json:"resourcetype"`
+		Value        string `json:"value"`
+	} `json:"tags"`
+}
+
+type CreateSecurityGroupParams struct {
+	p map[string]interface{}
+}
+
+func (p *CreateSecurityGroupParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["description"]; found {
+		u.Set("description", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["projectid"]; found {
+		u.Set("projectid", v.(string))
+	}
+	return u
+}
+
+func (p *CreateSecurityGroupParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *CreateSecurityGroupParams) SetDescription(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["description"] = v
+	return
+}
+
+func (p *CreateSecurityGroupParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *CreateSecurityGroupParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *CreateSecurityGroupParams) SetProjectid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectid"] = v
+	return
+}
+
+// You should always use this function to get a new CreateSecurityGroupParams instance,
+// as then you are sure you have configured all required params
+func (s *SecurityGroupService) NewCreateSecurityGroupParams(name string) *CreateSecurityGroupParams {
+	p := &CreateSecurityGroupParams{}
+	p.p = make(map[string]interface{})
+	p.p["name"] = name
+	return p
+}
+
+// Creates a security group
+func (s *SecurityGroupService) CreateSecurityGroup(p *CreateSecurityGroupParams) (*CreateSecurityGroupResponse, error) {
+	resp, err := s.cs.newRequest("createSecurityGroup", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	if resp, err = getRawValue(resp); err != nil {
+		return nil, err
+	}
+
+	var r CreateSecurityGroupResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type CreateSecurityGroupResponse struct {
+	Account     string `json:"account"`
+	Description string `json:"description"`
+	Domain      string `json:"domain"`
+	Domainid    string `json:"domainid"`
+	Egressrule  []struct {
+		Account           string `json:"account"`
+		Cidr              string `json:"cidr"`
+		Endport           int    `json:"endport"`
+		Icmpcode          int    `json:"icmpcode"`
+		Icmptype          int    `json:"icmptype"`
+		Protocol          string `json:"protocol"`
+		Ruleid            string `json:"ruleid"`
+		Securitygroupname string `json:"securitygroupname"`
+		Startport         int    `json:"startport"`
+		Tags              []struct {
+			Account      string `json:"account"`
+			Customer     string `json:"customer"`
+			Domain       string `json:"domain"`
+			Domainid     string `json:"domainid"`
+			Key          string `json:"key"`
+			Project      string `json:"project"`
+			Projectid    string `json:"projectid"`
+			Resourceid   string `json:"resourceid"`
+			Resourcetype string `json:"resourcetype"`
+			Value        string `json:"value"`
+		} `json:"tags"`
+	} `json:"egressrule"`
+	Id          string `json:"id"`
+	Ingressrule []struct {
+		Account           string `json:"account"`
+		Cidr              string `json:"cidr"`
+		Endport           int    `json:"endport"`
+		Icmpcode          int    `json:"icmpcode"`
+		Icmptype          int    `json:"icmptype"`
+		Protocol          string `json:"protocol"`
+		Ruleid            string `json:"ruleid"`
+		Securitygroupname string `json:"securitygroupname"`
+		Startport         int    `json:"startport"`
+		Tags              []struct {
+			Account      string `json:"account"`
+			Customer     string `json:"customer"`
+			Domain       string `json:"domain"`
+			Domainid     string `json:"domainid"`
+			Key          string `json:"key"`
+			Project      string `json:"project"`
+			Projectid    string `json:"projectid"`
+			Resourceid   string `json:"resourceid"`
+			Resourcetype string `json:"resourcetype"`
+			Value        string `json:"value"`
+		} `json:"tags"`
+	} `json:"ingressrule"`
+	Name      string `json:"name"`
+	Project   string `json:"project"`
+	Projectid string `json:"projectid"`
+	Tags      []struct {
+		Account      string `json:"account"`
+		Customer     string `json:"customer"`
+		Domain       string `json:"domain"`
+		Domainid     string `json:"domainid"`
+		Key          string `json:"key"`
+		Project      string `json:"project"`
+		Projectid    string `json:"projectid"`
+		Resourceid   string `json:"resourceid"`
+		Resourcetype string `json:"resourcetype"`
+		Value        string `json:"value"`
+	} `json:"tags"`
+	Virtualmachinecount int           `json:"virtualmachinecount"`
+	Virtualmachineids   []interface{} `json:"virtualmachineids"`
+}
+
+type DeleteSecurityGroupParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeleteSecurityGroupParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["projectid"]; found {
+		u.Set("projectid", v.(string))
+	}
+	return u
+}
+
+func (p *DeleteSecurityGroupParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *DeleteSecurityGroupParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *DeleteSecurityGroupParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *DeleteSecurityGroupParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *DeleteSecurityGroupParams) SetProjectid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectid"] = v
+	return
+}
+
+// You should always use this function to get a new DeleteSecurityGroupParams instance,
+// as then you are sure you have configured all required params
+func (s *SecurityGroupService) NewDeleteSecurityGroupParams() *DeleteSecurityGroupParams {
+	p := &DeleteSecurityGroupParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// Deletes security group
+func (s *SecurityGroupService) DeleteSecurityGroup(p *DeleteSecurityGroupParams) (*DeleteSecurityGroupResponse, error) {
+	resp, err := s.cs.newRequest("deleteSecurityGroup", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeleteSecurityGroupResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type DeleteSecurityGroupResponse struct {
+	Displaytext string `json:"displaytext"`
+	Success     string `json:"success"`
+}
+
+type ListSecurityGroupsParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListSecurityGroupsParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["isrecursive"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("isrecursive", vv)
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["listall"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("listall", vv)
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["projectid"]; found {
+		u.Set("projectid", v.(string))
+	}
+	if v, found := p.p["securitygroupname"]; found {
+		u.Set("securitygroupname", v.(string))
+	}
+	if v, found := p.p["tags"]; found {
+		i := 0
+		for k, vv := range v.(map[string]string) {
+			u.Set(fmt.Sprintf("tags[%d].key", i), k)
+			u.Set(fmt.Sprintf("tags[%d].value", i), vv)
+			i++
+		}
+	}
+	if v, found := p.p["virtualmachineid"]; found {
+		u.Set("virtualmachineid", v.(string))
+	}
+	return u
+}
+
+func (p *ListSecurityGroupsParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *ListSecurityGroupsParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *ListSecurityGroupsParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ListSecurityGroupsParams) SetIsrecursive(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isrecursive"] = v
+	return
+}
+
+func (p *ListSecurityGroupsParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListSecurityGroupsParams) SetListall(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["listall"] = v
+	return
+}
+
+func (p *ListSecurityGroupsParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListSecurityGroupsParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListSecurityGroupsParams) SetProjectid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectid"] = v
+	return
+}
+
+func (p *ListSecurityGroupsParams) SetSecuritygroupname(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["securitygroupname"] = v
+	return
+}
+
+func (p *ListSecurityGroupsParams) SetTags(v map[string]string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["tags"] = v
+	return
+}
+
+func (p *ListSecurityGroupsParams) SetVirtualmachineid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["virtualmachineid"] = v
+	return
+}
+
+// You should always use this function to get a new ListSecurityGroupsParams instance,
+// as then you are sure you have configured all required params
+func (s *SecurityGroupService) NewListSecurityGroupsParams() *ListSecurityGroupsParams {
+	p := &ListSecurityGroupsParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *SecurityGroupService) GetSecurityGroupID(keyword string, opts ...OptionFunc) (string, int, error) {
+	p := &ListSecurityGroupsParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["keyword"] = keyword
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return "", -1, err
+		}
+	}
+
+	l, err := s.ListSecurityGroups(p)
+	if err != nil {
+		return "", -1, err
+	}
+
+	if l.Count == 0 {
+		return "", l.Count, fmt.Errorf("No match found for %s: %+v", keyword, l)
+	}
+
+	if l.Count == 1 {
+		return l.SecurityGroups[0].Id, l.Count, nil
+	}
+
+	if l.Count > 1 {
+		for _, v := range l.SecurityGroups {
+			if v.Name == keyword {
+				return v.Id, l.Count, nil
+			}
+		}
+	}
+	return "", l.Count, fmt.Errorf("Could not find an exact match for %s: %+v", keyword, l)
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *SecurityGroupService) GetSecurityGroupByName(name string, opts ...OptionFunc) (*SecurityGroup, int, error) {
+	id, count, err := s.GetSecurityGroupID(name, opts...)
+	if err != nil {
+		return nil, count, err
+	}
+
+	r, count, err := s.GetSecurityGroupByID(id, opts...)
+	if err != nil {
+		return nil, count, err
+	}
+	return r, count, nil
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *SecurityGroupService) GetSecurityGroupByID(id string, opts ...OptionFunc) (*SecurityGroup, int, error) {
+	p := &ListSecurityGroupsParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["id"] = id
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return nil, -1, err
+		}
+	}
+
+	l, err := s.ListSecurityGroups(p)
+	if err != nil {
+		if strings.Contains(err.Error(), fmt.Sprintf(
+			"Invalid parameter id value=%s due to incorrect long value format, "+
+				"or entity does not exist", id)) {
+			return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
+		}
+		return nil, -1, err
+	}
+
+	if l.Count == 0 {
+		return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
+	}
+
+	if l.Count == 1 {
+		return l.SecurityGroups[0], l.Count, nil
+	}
+	return nil, l.Count, fmt.Errorf("There is more then one result for SecurityGroup UUID: %s!", id)
+}
+
+// Lists security groups
+func (s *SecurityGroupService) ListSecurityGroups(p *ListSecurityGroupsParams) (*ListSecurityGroupsResponse, error) {
+	resp, err := s.cs.newRequest("listSecurityGroups", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListSecurityGroupsResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListSecurityGroupsResponse struct {
+	Count          int              `json:"count"`
+	SecurityGroups []*SecurityGroup `json:"securitygroup"`
+}
+
+type SecurityGroup struct {
+	Account     string `json:"account"`
+	Description string `json:"description"`
+	Domain      string `json:"domain"`
+	Domainid    string `json:"domainid"`
+	Egressrule  []struct {
+		Account           string `json:"account"`
+		Cidr              string `json:"cidr"`
+		Endport           int    `json:"endport"`
+		Icmpcode          int    `json:"icmpcode"`
+		Icmptype          int    `json:"icmptype"`
+		Protocol          string `json:"protocol"`
+		Ruleid            string `json:"ruleid"`
+		Securitygroupname string `json:"securitygroupname"`
+		Startport         int    `json:"startport"`
+		Tags              []struct {
+			Account      string `json:"account"`
+			Customer     string `json:"customer"`
+			Domain       string `json:"domain"`
+			Domainid     string `json:"domainid"`
+			Key          string `json:"key"`
+			Project      string `json:"project"`
+			Projectid    string `json:"projectid"`
+			Resourceid   string `json:"resourceid"`
+			Resourcetype string `json:"resourcetype"`
+			Value        string `json:"value"`
+		} `json:"tags"`
+	} `json:"egressrule"`
+	Id          string `json:"id"`
+	Ingressrule []struct {
+		Account           string `json:"account"`
+		Cidr              string `json:"cidr"`
+		Endport           int    `json:"endport"`
+		Icmpcode          int    `json:"icmpcode"`
+		Icmptype          int    `json:"icmptype"`
+		Protocol          string `json:"protocol"`
+		Ruleid            string `json:"ruleid"`
+		Securitygroupname string `json:"securitygroupname"`
+		Startport         int    `json:"startport"`
+		Tags              []struct {
+			Account      string `json:"account"`
+			Customer     string `json:"customer"`
+			Domain       string `json:"domain"`
+			Domainid     string `json:"domainid"`
+			Key          string `json:"key"`
+			Project      string `json:"project"`
+			Projectid    string `json:"projectid"`
+			Resourceid   string `json:"resourceid"`
+			Resourcetype string `json:"resourcetype"`
+			Value        string `json:"value"`
+		} `json:"tags"`
+	} `json:"ingressrule"`
+	Name      string `json:"name"`
+	Project   string `json:"project"`
+	Projectid string `json:"projectid"`
+	Tags      []struct {
+		Account      string `json:"account"`
+		Customer     string `json:"customer"`
+		Domain       string `json:"domain"`
+		Domainid     string `json:"domainid"`
+		Key          string `json:"key"`
+		Project      string `json:"project"`
+		Projectid    string `json:"projectid"`
+		Resourceid   string `json:"resourceid"`
+		Resourcetype string `json:"resourcetype"`
+		Value        string `json:"value"`
+	} `json:"tags"`
+	Virtualmachinecount int           `json:"virtualmachinecount"`
+	Virtualmachineids   []interface{} `json:"virtualmachineids"`
+}
+
+type RevokeSecurityGroupEgressParams struct {
+	p map[string]interface{}
+}
+
+func (p *RevokeSecurityGroupEgressParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *RevokeSecurityGroupEgressParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new RevokeSecurityGroupEgressParams instance,
+// as then you are sure you have configured all required params
+func (s *SecurityGroupService) NewRevokeSecurityGroupEgressParams(id string) *RevokeSecurityGroupEgressParams {
+	p := &RevokeSecurityGroupEgressParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Deletes a particular egress rule from this security group
+func (s *SecurityGroupService) RevokeSecurityGroupEgress(p *RevokeSecurityGroupEgressParams) (*RevokeSecurityGroupEgressResponse, error) {
+	resp, err := s.cs.newRequest("revokeSecurityGroupEgress", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r RevokeSecurityGroupEgressResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type RevokeSecurityGroupEgressResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
+
+type RevokeSecurityGroupIngressParams struct {
+	p map[string]interface{}
+}
+
+func (p *RevokeSecurityGroupIngressParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *RevokeSecurityGroupIngressParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new RevokeSecurityGroupIngressParams instance,
+// as then you are sure you have configured all required params
+func (s *SecurityGroupService) NewRevokeSecurityGroupIngressParams(id string) *RevokeSecurityGroupIngressParams {
+	p := &RevokeSecurityGroupIngressParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Deletes a particular ingress rule from this security group
+func (s *SecurityGroupService) RevokeSecurityGroupIngress(p *RevokeSecurityGroupIngressParams) (*RevokeSecurityGroupIngressResponse, error) {
+	resp, err := s.cs.newRequest("revokeSecurityGroupIngress", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r RevokeSecurityGroupIngressResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type RevokeSecurityGroupIngressResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
diff --git a/vendor/github.com/xanzy/go-cloudstack/cloudstack/ServiceOfferingService.go b/vendor/github.com/xanzy/go-cloudstack/cloudstack/ServiceOfferingService.go
new file mode 100644
index 0000000..3c14758
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/cloudstack/ServiceOfferingService.go
@@ -0,0 +1,857 @@
+//
+// Copyright 2018, Sander van Harmelen
+//
+// Licensed 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 cloudstack
+
+import (
+	"encoding/json"
+	"fmt"
+	"net/url"
+	"strconv"
+	"strings"
+)
+
+type CreateServiceOfferingParams struct {
+	p map[string]interface{}
+}
+
+func (p *CreateServiceOfferingParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["bytesreadrate"]; found {
+		vv := strconv.FormatInt(v.(int64), 10)
+		u.Set("bytesreadrate", vv)
+	}
+	if v, found := p.p["byteswriterate"]; found {
+		vv := strconv.FormatInt(v.(int64), 10)
+		u.Set("byteswriterate", vv)
+	}
+	if v, found := p.p["cpunumber"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("cpunumber", vv)
+	}
+	if v, found := p.p["cpuspeed"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("cpuspeed", vv)
+	}
+	if v, found := p.p["customizediops"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("customizediops", vv)
+	}
+	if v, found := p.p["deploymentplanner"]; found {
+		u.Set("deploymentplanner", v.(string))
+	}
+	if v, found := p.p["displaytext"]; found {
+		u.Set("displaytext", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["hosttags"]; found {
+		u.Set("hosttags", v.(string))
+	}
+	if v, found := p.p["hypervisorsnapshotreserve"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("hypervisorsnapshotreserve", vv)
+	}
+	if v, found := p.p["iopsreadrate"]; found {
+		vv := strconv.FormatInt(v.(int64), 10)
+		u.Set("iopsreadrate", vv)
+	}
+	if v, found := p.p["iopswriterate"]; found {
+		vv := strconv.FormatInt(v.(int64), 10)
+		u.Set("iopswriterate", vv)
+	}
+	if v, found := p.p["issystem"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("issystem", vv)
+	}
+	if v, found := p.p["isvolatile"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("isvolatile", vv)
+	}
+	if v, found := p.p["limitcpuuse"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("limitcpuuse", vv)
+	}
+	if v, found := p.p["maxiops"]; found {
+		vv := strconv.FormatInt(v.(int64), 10)
+		u.Set("maxiops", vv)
+	}
+	if v, found := p.p["memory"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("memory", vv)
+	}
+	if v, found := p.p["miniops"]; found {
+		vv := strconv.FormatInt(v.(int64), 10)
+		u.Set("miniops", vv)
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["networkrate"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("networkrate", vv)
+	}
+	if v, found := p.p["offerha"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("offerha", vv)
+	}
+	if v, found := p.p["provisioningtype"]; found {
+		u.Set("provisioningtype", v.(string))
+	}
+	if v, found := p.p["serviceofferingdetails"]; found {
+		i := 0
+		for k, vv := range v.(map[string]string) {
+			u.Set(fmt.Sprintf("serviceofferingdetails[%d].key", i), k)
+			u.Set(fmt.Sprintf("serviceofferingdetails[%d].value", i), vv)
+			i++
+		}
+	}
+	if v, found := p.p["storagetype"]; found {
+		u.Set("storagetype", v.(string))
+	}
+	if v, found := p.p["systemvmtype"]; found {
+		u.Set("systemvmtype", v.(string))
+	}
+	if v, found := p.p["tags"]; found {
+		u.Set("tags", v.(string))
+	}
+	return u
+}
+
+func (p *CreateServiceOfferingParams) SetBytesreadrate(v int64) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["bytesreadrate"] = v
+	return
+}
+
+func (p *CreateServiceOfferingParams) SetByteswriterate(v int64) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["byteswriterate"] = v
+	return
+}
+
+func (p *CreateServiceOfferingParams) SetCpunumber(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["cpunumber"] = v
+	return
+}
+
+func (p *CreateServiceOfferingParams) SetCpuspeed(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["cpuspeed"] = v
+	return
+}
+
+func (p *CreateServiceOfferingParams) SetCustomizediops(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["customizediops"] = v
+	return
+}
+
+func (p *CreateServiceOfferingParams) SetDeploymentplanner(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["deploymentplanner"] = v
+	return
+}
+
+func (p *CreateServiceOfferingParams) SetDisplaytext(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["displaytext"] = v
+	return
+}
+
+func (p *CreateServiceOfferingParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *CreateServiceOfferingParams) SetHosttags(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["hosttags"] = v
+	return
+}
+
+func (p *CreateServiceOfferingParams) SetHypervisorsnapshotreserve(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["hypervisorsnapshotreserve"] = v
+	return
+}
+
+func (p *CreateServiceOfferingParams) SetIopsreadrate(v int64) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["iopsreadrate"] = v
+	return
+}
+
+func (p *CreateServiceOfferingParams) SetIopswriterate(v int64) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["iopswriterate"] = v
+	return
+}
+
+func (p *CreateServiceOfferingParams) SetIssystem(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["issystem"] = v
+	return
+}
+
+func (p *CreateServiceOfferingParams) SetIsvolatile(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isvolatile"] = v
+	return
+}
+
+func (p *CreateServiceOfferingParams) SetLimitcpuuse(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["limitcpuuse"] = v
+	return
+}
+
+func (p *CreateServiceOfferingParams) SetMaxiops(v int64) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["maxiops"] = v
+	return
+}
+
+func (p *CreateServiceOfferingParams) SetMemory(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["memory"] = v
+	return
+}
+
+func (p *CreateServiceOfferingParams) SetMiniops(v int64) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["miniops"] = v
+	return
+}
+
+func (p *CreateServiceOfferingParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *CreateServiceOfferingParams) SetNetworkrate(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["networkrate"] = v
+	return
+}
+
+func (p *CreateServiceOfferingParams) SetOfferha(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["offerha"] = v
+	return
+}
+
+func (p *CreateServiceOfferingParams) SetProvisioningtype(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["provisioningtype"] = v
+	return
+}
+
+func (p *CreateServiceOfferingParams) SetServiceofferingdetails(v map[string]string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["serviceofferingdetails"] = v
+	return
+}
+
+func (p *CreateServiceOfferingParams) SetStoragetype(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["storagetype"] = v
+	return
+}
+
+func (p *CreateServiceOfferingParams) SetSystemvmtype(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["systemvmtype"] = v
+	return
+}
+
+func (p *CreateServiceOfferingParams) SetTags(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["tags"] = v
+	return
+}
+
+// You should always use this function to get a new CreateServiceOfferingParams instance,
+// as then you are sure you have configured all required params
+func (s *ServiceOfferingService) NewCreateServiceOfferingParams(displaytext string, name string) *CreateServiceOfferingParams {
+	p := &CreateServiceOfferingParams{}
+	p.p = make(map[string]interface{})
+	p.p["displaytext"] = displaytext
+	p.p["name"] = name
+	return p
+}
+
+// Creates a service offering.
+func (s *ServiceOfferingService) CreateServiceOffering(p *CreateServiceOfferingParams) (*CreateServiceOfferingResponse, error) {
+	resp, err := s.cs.newRequest("createServiceOffering", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	if resp, err = getRawValue(resp); err != nil {
+		return nil, err
+	}
+
+	var r CreateServiceOfferingResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type CreateServiceOfferingResponse struct {
+	Cpunumber                 int               `json:"cpunumber"`
+	Cpuspeed                  int               `json:"cpuspeed"`
+	Created                   string            `json:"created"`
+	Defaultuse                bool              `json:"defaultuse"`
+	Deploymentplanner         string            `json:"deploymentplanner"`
+	DiskBytesReadRate         int64             `json:"diskBytesReadRate"`
+	DiskBytesWriteRate        int64             `json:"diskBytesWriteRate"`
+	DiskIopsReadRate          int64             `json:"diskIopsReadRate"`
+	DiskIopsWriteRate         int64             `json:"diskIopsWriteRate"`
+	Displaytext               string            `json:"displaytext"`
+	Domain                    string            `json:"domain"`
+	Domainid                  string            `json:"domainid"`
+	Hosttags                  string            `json:"hosttags"`
+	Hypervisorsnapshotreserve int               `json:"hypervisorsnapshotreserve"`
+	Id                        string            `json:"id"`
+	Iscustomized              bool              `json:"iscustomized"`
+	Iscustomizediops          bool              `json:"iscustomizediops"`
+	Issystem                  bool              `json:"issystem"`
+	Isvolatile                bool              `json:"isvolatile"`
+	Limitcpuuse               bool              `json:"limitcpuuse"`
+	Maxiops                   int64             `json:"maxiops"`
+	Memory                    int               `json:"memory"`
+	Miniops                   int64             `json:"miniops"`
+	Name                      string            `json:"name"`
+	Networkrate               int               `json:"networkrate"`
+	Offerha                   bool              `json:"offerha"`
+	Provisioningtype          string            `json:"provisioningtype"`
+	Serviceofferingdetails    map[string]string `json:"serviceofferingdetails"`
+	Storagetype               string            `json:"storagetype"`
+	Systemvmtype              string            `json:"systemvmtype"`
+	Tags                      string            `json:"tags"`
+}
+
+type DeleteServiceOfferingParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeleteServiceOfferingParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *DeleteServiceOfferingParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new DeleteServiceOfferingParams instance,
+// as then you are sure you have configured all required params
+func (s *ServiceOfferingService) NewDeleteServiceOfferingParams(id string) *DeleteServiceOfferingParams {
+	p := &DeleteServiceOfferingParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Deletes a service offering.
+func (s *ServiceOfferingService) DeleteServiceOffering(p *DeleteServiceOfferingParams) (*DeleteServiceOfferingResponse, error) {
+	resp, err := s.cs.newRequest("deleteServiceOffering", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeleteServiceOfferingResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type DeleteServiceOfferingResponse struct {
+	Displaytext string `json:"displaytext"`
+	Success     string `json:"success"`
+}
+
+type ListServiceOfferingsParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListServiceOfferingsParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["isrecursive"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("isrecursive", vv)
+	}
+	if v, found := p.p["issystem"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("issystem", vv)
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["listall"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("listall", vv)
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["systemvmtype"]; found {
+		u.Set("systemvmtype", v.(string))
+	}
+	if v, found := p.p["virtualmachineid"]; found {
+		u.Set("virtualmachineid", v.(string))
+	}
+	return u
+}
+
+func (p *ListServiceOfferingsParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *ListServiceOfferingsParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ListServiceOfferingsParams) SetIsrecursive(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isrecursive"] = v
+	return
+}
+
+func (p *ListServiceOfferingsParams) SetIssystem(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["issystem"] = v
+	return
+}
+
+func (p *ListServiceOfferingsParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListServiceOfferingsParams) SetListall(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["listall"] = v
+	return
+}
+
+func (p *ListServiceOfferingsParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *ListServiceOfferingsParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListServiceOfferingsParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListServiceOfferingsParams) SetSystemvmtype(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["systemvmtype"] = v
+	return
+}
+
+func (p *ListServiceOfferingsParams) SetVirtualmachineid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["virtualmachineid"] = v
+	return
+}
+
+// You should always use this function to get a new ListServiceOfferingsParams instance,
+// as then you are sure you have configured all required params
+func (s *ServiceOfferingService) NewListServiceOfferingsParams() *ListServiceOfferingsParams {
+	p := &ListServiceOfferingsParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *ServiceOfferingService) GetServiceOfferingID(name string, opts ...OptionFunc) (string, int, error) {
+	p := &ListServiceOfferingsParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["name"] = name
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return "", -1, err
+		}
+	}
+
+	l, err := s.ListServiceOfferings(p)
+	if err != nil {
+		return "", -1, err
+	}
+
+	if l.Count == 0 {
+		return "", l.Count, fmt.Errorf("No match found for %s: %+v", name, l)
+	}
+
+	if l.Count == 1 {
+		return l.ServiceOfferings[0].Id, l.Count, nil
+	}
+
+	if l.Count > 1 {
+		for _, v := range l.ServiceOfferings {
+			if v.Name == name {
+				return v.Id, l.Count, nil
+			}
+		}
+	}
+	return "", l.Count, fmt.Errorf("Could not find an exact match for %s: %+v", name, l)
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *ServiceOfferingService) GetServiceOfferingByName(name string, opts ...OptionFunc) (*ServiceOffering, int, error) {
+	id, count, err := s.GetServiceOfferingID(name, opts...)
+	if err != nil {
+		return nil, count, err
+	}
+
+	r, count, err := s.GetServiceOfferingByID(id, opts...)
+	if err != nil {
+		return nil, count, err
+	}
+	return r, count, nil
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *ServiceOfferingService) GetServiceOfferingByID(id string, opts ...OptionFunc) (*ServiceOffering, int, error) {
+	p := &ListServiceOfferingsParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["id"] = id
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return nil, -1, err
+		}
+	}
+
+	l, err := s.ListServiceOfferings(p)
+	if err != nil {
+		if strings.Contains(err.Error(), fmt.Sprintf(
+			"Invalid parameter id value=%s due to incorrect long value format, "+
+				"or entity does not exist", id)) {
+			return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
+		}
+		return nil, -1, err
+	}
+
+	if l.Count == 0 {
+		return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
+	}
+
+	if l.Count == 1 {
+		return l.ServiceOfferings[0], l.Count, nil
+	}
+	return nil, l.Count, fmt.Errorf("There is more then one result for ServiceOffering UUID: %s!", id)
+}
+
+// Lists all available service offerings.
+func (s *ServiceOfferingService) ListServiceOfferings(p *ListServiceOfferingsParams) (*ListServiceOfferingsResponse, error) {
+	resp, err := s.cs.newRequest("listServiceOfferings", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListServiceOfferingsResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListServiceOfferingsResponse struct {
+	Count            int                `json:"count"`
+	ServiceOfferings []*ServiceOffering `json:"serviceoffering"`
+}
+
+type ServiceOffering struct {
+	Cpunumber                 int               `json:"cpunumber"`
+	Cpuspeed                  int               `json:"cpuspeed"`
+	Created                   string            `json:"created"`
+	Defaultuse                bool              `json:"defaultuse"`
+	Deploymentplanner         string            `json:"deploymentplanner"`
+	DiskBytesReadRate         int64             `json:"diskBytesReadRate"`
+	DiskBytesWriteRate        int64             `json:"diskBytesWriteRate"`
+	DiskIopsReadRate          int64             `json:"diskIopsReadRate"`
+	DiskIopsWriteRate         int64             `json:"diskIopsWriteRate"`
+	Displaytext               string            `json:"displaytext"`
+	Domain                    string            `json:"domain"`
+	Domainid                  string            `json:"domainid"`
+	Hosttags                  string            `json:"hosttags"`
+	Hypervisorsnapshotreserve int               `json:"hypervisorsnapshotreserve"`
+	Id                        string            `json:"id"`
+	Iscustomized              bool              `json:"iscustomized"`
+	Iscustomizediops          bool              `json:"iscustomizediops"`
+	Issystem                  bool              `json:"issystem"`
+	Isvolatile                bool              `json:"isvolatile"`
+	Limitcpuuse               bool              `json:"limitcpuuse"`
+	Maxiops                   int64             `json:"maxiops"`
+	Memory                    int               `json:"memory"`
+	Miniops                   int64             `json:"miniops"`
+	Name                      string            `json:"name"`
+	Networkrate               int               `json:"networkrate"`
+	Offerha                   bool              `json:"offerha"`
+	Provisioningtype          string            `json:"provisioningtype"`
+	Serviceofferingdetails    map[string]string `json:"serviceofferingdetails"`
+	Storagetype               string            `json:"storagetype"`
+	Systemvmtype              string            `json:"systemvmtype"`
+	Tags                      string            `json:"tags"`
+}
+
+type UpdateServiceOfferingParams struct {
+	p map[string]interface{}
+}
+
+func (p *UpdateServiceOfferingParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["displaytext"]; found {
+		u.Set("displaytext", v.(string))
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["sortkey"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("sortkey", vv)
+	}
+	return u
+}
+
+func (p *UpdateServiceOfferingParams) SetDisplaytext(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["displaytext"] = v
+	return
+}
+
+func (p *UpdateServiceOfferingParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *UpdateServiceOfferingParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *UpdateServiceOfferingParams) SetSortkey(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["sortkey"] = v
+	return
+}
+
+// You should always use this function to get a new UpdateServiceOfferingParams instance,
+// as then you are sure you have configured all required params
+func (s *ServiceOfferingService) NewUpdateServiceOfferingParams(id string) *UpdateServiceOfferingParams {
+	p := &UpdateServiceOfferingParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Updates a service offering.
+func (s *ServiceOfferingService) UpdateServiceOffering(p *UpdateServiceOfferingParams) (*UpdateServiceOfferingResponse, error) {
+	resp, err := s.cs.newRequest("updateServiceOffering", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r UpdateServiceOfferingResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type UpdateServiceOfferingResponse struct {
+	Cpunumber                 int               `json:"cpunumber"`
+	Cpuspeed                  int               `json:"cpuspeed"`
+	Created                   string            `json:"created"`
+	Defaultuse                bool              `json:"defaultuse"`
+	Deploymentplanner         string            `json:"deploymentplanner"`
+	DiskBytesReadRate         int64             `json:"diskBytesReadRate"`
+	DiskBytesWriteRate        int64             `json:"diskBytesWriteRate"`
+	DiskIopsReadRate          int64             `json:"diskIopsReadRate"`
+	DiskIopsWriteRate         int64             `json:"diskIopsWriteRate"`
+	Displaytext               string            `json:"displaytext"`
+	Domain                    string            `json:"domain"`
+	Domainid                  string            `json:"domainid"`
+	Hosttags                  string            `json:"hosttags"`
+	Hypervisorsnapshotreserve int               `json:"hypervisorsnapshotreserve"`
+	Id                        string            `json:"id"`
+	Iscustomized              bool              `json:"iscustomized"`
+	Iscustomizediops          bool              `json:"iscustomizediops"`
+	Issystem                  bool              `json:"issystem"`
+	Isvolatile                bool              `json:"isvolatile"`
+	Limitcpuuse               bool              `json:"limitcpuuse"`
+	Maxiops                   int64             `json:"maxiops"`
+	Memory                    int               `json:"memory"`
+	Miniops                   int64             `json:"miniops"`
+	Name                      string            `json:"name"`
+	Networkrate               int               `json:"networkrate"`
+	Offerha                   bool              `json:"offerha"`
+	Provisioningtype          string            `json:"provisioningtype"`
+	Serviceofferingdetails    map[string]string `json:"serviceofferingdetails"`
+	Storagetype               string            `json:"storagetype"`
+	Systemvmtype              string            `json:"systemvmtype"`
+	Tags                      string            `json:"tags"`
+}
diff --git a/vendor/github.com/xanzy/go-cloudstack/cloudstack/SnapshotService.go b/vendor/github.com/xanzy/go-cloudstack/cloudstack/SnapshotService.go
new file mode 100644
index 0000000..9fd3387
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/cloudstack/SnapshotService.go
@@ -0,0 +1,1822 @@
+//
+// Copyright 2018, Sander van Harmelen
+//
+// Licensed 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 cloudstack
+
+import (
+	"encoding/json"
+	"fmt"
+	"net/url"
+	"strconv"
+	"strings"
+)
+
+type CreateSnapshotParams struct {
+	p map[string]interface{}
+}
+
+func (p *CreateSnapshotParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["policyid"]; found {
+		u.Set("policyid", v.(string))
+	}
+	if v, found := p.p["quiescevm"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("quiescevm", vv)
+	}
+	if v, found := p.p["volumeid"]; found {
+		u.Set("volumeid", v.(string))
+	}
+	return u
+}
+
+func (p *CreateSnapshotParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *CreateSnapshotParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *CreateSnapshotParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *CreateSnapshotParams) SetPolicyid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["policyid"] = v
+	return
+}
+
+func (p *CreateSnapshotParams) SetQuiescevm(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["quiescevm"] = v
+	return
+}
+
+func (p *CreateSnapshotParams) SetVolumeid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["volumeid"] = v
+	return
+}
+
+// You should always use this function to get a new CreateSnapshotParams instance,
+// as then you are sure you have configured all required params
+func (s *SnapshotService) NewCreateSnapshotParams(volumeid string) *CreateSnapshotParams {
+	p := &CreateSnapshotParams{}
+	p.p = make(map[string]interface{})
+	p.p["volumeid"] = volumeid
+	return p
+}
+
+// Creates an instant snapshot of a volume.
+func (s *SnapshotService) CreateSnapshot(p *CreateSnapshotParams) (*CreateSnapshotResponse, error) {
+	resp, err := s.cs.newRequest("createSnapshot", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r CreateSnapshotResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type CreateSnapshotResponse struct {
+	JobID        string `json:"jobid"`
+	Account      string `json:"account"`
+	Created      string `json:"created"`
+	Domain       string `json:"domain"`
+	Domainid     string `json:"domainid"`
+	Id           string `json:"id"`
+	Intervaltype string `json:"intervaltype"`
+	Name         string `json:"name"`
+	Physicalsize int64  `json:"physicalsize"`
+	Project      string `json:"project"`
+	Projectid    string `json:"projectid"`
+	Revertable   bool   `json:"revertable"`
+	Snapshottype string `json:"snapshottype"`
+	State        string `json:"state"`
+	Tags         []struct {
+		Account      string `json:"account"`
+		Customer     string `json:"customer"`
+		Domain       string `json:"domain"`
+		Domainid     string `json:"domainid"`
+		Key          string `json:"key"`
+		Project      string `json:"project"`
+		Projectid    string `json:"projectid"`
+		Resourceid   string `json:"resourceid"`
+		Resourcetype string `json:"resourcetype"`
+		Value        string `json:"value"`
+	} `json:"tags"`
+	Volumeid   string `json:"volumeid"`
+	Volumename string `json:"volumename"`
+	Volumetype string `json:"volumetype"`
+	Zoneid     string `json:"zoneid"`
+}
+
+type CreateSnapshotPolicyParams struct {
+	p map[string]interface{}
+}
+
+func (p *CreateSnapshotPolicyParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["fordisplay"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("fordisplay", vv)
+	}
+	if v, found := p.p["intervaltype"]; found {
+		u.Set("intervaltype", v.(string))
+	}
+	if v, found := p.p["maxsnaps"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("maxsnaps", vv)
+	}
+	if v, found := p.p["schedule"]; found {
+		u.Set("schedule", v.(string))
+	}
+	if v, found := p.p["timezone"]; found {
+		u.Set("timezone", v.(string))
+	}
+	if v, found := p.p["volumeid"]; found {
+		u.Set("volumeid", v.(string))
+	}
+	return u
+}
+
+func (p *CreateSnapshotPolicyParams) SetFordisplay(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["fordisplay"] = v
+	return
+}
+
+func (p *CreateSnapshotPolicyParams) SetIntervaltype(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["intervaltype"] = v
+	return
+}
+
+func (p *CreateSnapshotPolicyParams) SetMaxsnaps(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["maxsnaps"] = v
+	return
+}
+
+func (p *CreateSnapshotPolicyParams) SetSchedule(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["schedule"] = v
+	return
+}
+
+func (p *CreateSnapshotPolicyParams) SetTimezone(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["timezone"] = v
+	return
+}
+
+func (p *CreateSnapshotPolicyParams) SetVolumeid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["volumeid"] = v
+	return
+}
+
+// You should always use this function to get a new CreateSnapshotPolicyParams instance,
+// as then you are sure you have configured all required params
+func (s *SnapshotService) NewCreateSnapshotPolicyParams(intervaltype string, maxsnaps int, schedule string, timezone string, volumeid string) *CreateSnapshotPolicyParams {
+	p := &CreateSnapshotPolicyParams{}
+	p.p = make(map[string]interface{})
+	p.p["intervaltype"] = intervaltype
+	p.p["maxsnaps"] = maxsnaps
+	p.p["schedule"] = schedule
+	p.p["timezone"] = timezone
+	p.p["volumeid"] = volumeid
+	return p
+}
+
+// Creates a snapshot policy for the account.
+func (s *SnapshotService) CreateSnapshotPolicy(p *CreateSnapshotPolicyParams) (*CreateSnapshotPolicyResponse, error) {
+	resp, err := s.cs.newRequest("createSnapshotPolicy", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r CreateSnapshotPolicyResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type CreateSnapshotPolicyResponse struct {
+	Fordisplay   bool   `json:"fordisplay"`
+	Id           string `json:"id"`
+	Intervaltype int    `json:"intervaltype"`
+	Maxsnaps     int    `json:"maxsnaps"`
+	Schedule     string `json:"schedule"`
+	Timezone     string `json:"timezone"`
+	Volumeid     string `json:"volumeid"`
+}
+
+type CreateVMSnapshotParams struct {
+	p map[string]interface{}
+}
+
+func (p *CreateVMSnapshotParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["description"]; found {
+		u.Set("description", v.(string))
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["quiescevm"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("quiescevm", vv)
+	}
+	if v, found := p.p["snapshotmemory"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("snapshotmemory", vv)
+	}
+	if v, found := p.p["virtualmachineid"]; found {
+		u.Set("virtualmachineid", v.(string))
+	}
+	return u
+}
+
+func (p *CreateVMSnapshotParams) SetDescription(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["description"] = v
+	return
+}
+
+func (p *CreateVMSnapshotParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *CreateVMSnapshotParams) SetQuiescevm(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["quiescevm"] = v
+	return
+}
+
+func (p *CreateVMSnapshotParams) SetSnapshotmemory(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["snapshotmemory"] = v
+	return
+}
+
+func (p *CreateVMSnapshotParams) SetVirtualmachineid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["virtualmachineid"] = v
+	return
+}
+
+// You should always use this function to get a new CreateVMSnapshotParams instance,
+// as then you are sure you have configured all required params
+func (s *SnapshotService) NewCreateVMSnapshotParams(virtualmachineid string) *CreateVMSnapshotParams {
+	p := &CreateVMSnapshotParams{}
+	p.p = make(map[string]interface{})
+	p.p["virtualmachineid"] = virtualmachineid
+	return p
+}
+
+// Creates snapshot for a vm.
+func (s *SnapshotService) CreateVMSnapshot(p *CreateVMSnapshotParams) (*CreateVMSnapshotResponse, error) {
+	resp, err := s.cs.newRequest("createVMSnapshot", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r CreateVMSnapshotResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type CreateVMSnapshotResponse struct {
+	JobID            string `json:"jobid"`
+	Account          string `json:"account"`
+	Created          string `json:"created"`
+	Current          bool   `json:"current"`
+	Description      string `json:"description"`
+	Displayname      string `json:"displayname"`
+	Domain           string `json:"domain"`
+	Domainid         string `json:"domainid"`
+	Id               string `json:"id"`
+	Name             string `json:"name"`
+	Parent           string `json:"parent"`
+	ParentName       string `json:"parentName"`
+	Project          string `json:"project"`
+	Projectid        string `json:"projectid"`
+	State            string `json:"state"`
+	Type             string `json:"type"`
+	Virtualmachineid string `json:"virtualmachineid"`
+	Zoneid           string `json:"zoneid"`
+}
+
+type DeleteSnapshotParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeleteSnapshotParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *DeleteSnapshotParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new DeleteSnapshotParams instance,
+// as then you are sure you have configured all required params
+func (s *SnapshotService) NewDeleteSnapshotParams(id string) *DeleteSnapshotParams {
+	p := &DeleteSnapshotParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Deletes a snapshot of a disk volume.
+func (s *SnapshotService) DeleteSnapshot(p *DeleteSnapshotParams) (*DeleteSnapshotResponse, error) {
+	resp, err := s.cs.newRequest("deleteSnapshot", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeleteSnapshotResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type DeleteSnapshotResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
+
+type DeleteSnapshotPoliciesParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeleteSnapshotPoliciesParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["ids"]; found {
+		vv := strings.Join(v.([]string), ",")
+		u.Set("ids", vv)
+	}
+	return u
+}
+
+func (p *DeleteSnapshotPoliciesParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *DeleteSnapshotPoliciesParams) SetIds(v []string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["ids"] = v
+	return
+}
+
+// You should always use this function to get a new DeleteSnapshotPoliciesParams instance,
+// as then you are sure you have configured all required params
+func (s *SnapshotService) NewDeleteSnapshotPoliciesParams() *DeleteSnapshotPoliciesParams {
+	p := &DeleteSnapshotPoliciesParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// Deletes snapshot policies for the account.
+func (s *SnapshotService) DeleteSnapshotPolicies(p *DeleteSnapshotPoliciesParams) (*DeleteSnapshotPoliciesResponse, error) {
+	resp, err := s.cs.newRequest("deleteSnapshotPolicies", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeleteSnapshotPoliciesResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type DeleteSnapshotPoliciesResponse struct {
+	Displaytext string `json:"displaytext"`
+	Success     string `json:"success"`
+}
+
+type DeleteVMSnapshotParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeleteVMSnapshotParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["vmsnapshotid"]; found {
+		u.Set("vmsnapshotid", v.(string))
+	}
+	return u
+}
+
+func (p *DeleteVMSnapshotParams) SetVmsnapshotid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["vmsnapshotid"] = v
+	return
+}
+
+// You should always use this function to get a new DeleteVMSnapshotParams instance,
+// as then you are sure you have configured all required params
+func (s *SnapshotService) NewDeleteVMSnapshotParams(vmsnapshotid string) *DeleteVMSnapshotParams {
+	p := &DeleteVMSnapshotParams{}
+	p.p = make(map[string]interface{})
+	p.p["vmsnapshotid"] = vmsnapshotid
+	return p
+}
+
+// Deletes a vmsnapshot.
+func (s *SnapshotService) DeleteVMSnapshot(p *DeleteVMSnapshotParams) (*DeleteVMSnapshotResponse, error) {
+	resp, err := s.cs.newRequest("deleteVMSnapshot", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeleteVMSnapshotResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type DeleteVMSnapshotResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
+
+type ListSnapshotPoliciesParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListSnapshotPoliciesParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["fordisplay"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("fordisplay", vv)
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["volumeid"]; found {
+		u.Set("volumeid", v.(string))
+	}
+	return u
+}
+
+func (p *ListSnapshotPoliciesParams) SetFordisplay(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["fordisplay"] = v
+	return
+}
+
+func (p *ListSnapshotPoliciesParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ListSnapshotPoliciesParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListSnapshotPoliciesParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListSnapshotPoliciesParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListSnapshotPoliciesParams) SetVolumeid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["volumeid"] = v
+	return
+}
+
+// You should always use this function to get a new ListSnapshotPoliciesParams instance,
+// as then you are sure you have configured all required params
+func (s *SnapshotService) NewListSnapshotPoliciesParams() *ListSnapshotPoliciesParams {
+	p := &ListSnapshotPoliciesParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *SnapshotService) GetSnapshotPolicyByID(id string, opts ...OptionFunc) (*SnapshotPolicy, int, error) {
+	p := &ListSnapshotPoliciesParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["id"] = id
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return nil, -1, err
+		}
+	}
+
+	l, err := s.ListSnapshotPolicies(p)
+	if err != nil {
+		if strings.Contains(err.Error(), fmt.Sprintf(
+			"Invalid parameter id value=%s due to incorrect long value format, "+
+				"or entity does not exist", id)) {
+			return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
+		}
+		return nil, -1, err
+	}
+
+	if l.Count == 0 {
+		return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
+	}
+
+	if l.Count == 1 {
+		return l.SnapshotPolicies[0], l.Count, nil
+	}
+	return nil, l.Count, fmt.Errorf("There is more then one result for SnapshotPolicy UUID: %s!", id)
+}
+
+// Lists snapshot policies.
+func (s *SnapshotService) ListSnapshotPolicies(p *ListSnapshotPoliciesParams) (*ListSnapshotPoliciesResponse, error) {
+	resp, err := s.cs.newRequest("listSnapshotPolicies", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListSnapshotPoliciesResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListSnapshotPoliciesResponse struct {
+	Count            int               `json:"count"`
+	SnapshotPolicies []*SnapshotPolicy `json:"snapshotpolicy"`
+}
+
+type SnapshotPolicy struct {
+	Fordisplay   bool   `json:"fordisplay"`
+	Id           string `json:"id"`
+	Intervaltype int    `json:"intervaltype"`
+	Maxsnaps     int    `json:"maxsnaps"`
+	Schedule     string `json:"schedule"`
+	Timezone     string `json:"timezone"`
+	Volumeid     string `json:"volumeid"`
+}
+
+type ListSnapshotsParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListSnapshotsParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["ids"]; found {
+		vv := strings.Join(v.([]string), ",")
+		u.Set("ids", vv)
+	}
+	if v, found := p.p["intervaltype"]; found {
+		u.Set("intervaltype", v.(string))
+	}
+	if v, found := p.p["isrecursive"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("isrecursive", vv)
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["listall"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("listall", vv)
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["projectid"]; found {
+		u.Set("projectid", v.(string))
+	}
+	if v, found := p.p["snapshottype"]; found {
+		u.Set("snapshottype", v.(string))
+	}
+	if v, found := p.p["tags"]; found {
+		i := 0
+		for k, vv := range v.(map[string]string) {
+			u.Set(fmt.Sprintf("tags[%d].key", i), k)
+			u.Set(fmt.Sprintf("tags[%d].value", i), vv)
+			i++
+		}
+	}
+	if v, found := p.p["volumeid"]; found {
+		u.Set("volumeid", v.(string))
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *ListSnapshotsParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *ListSnapshotsParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *ListSnapshotsParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ListSnapshotsParams) SetIds(v []string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["ids"] = v
+	return
+}
+
+func (p *ListSnapshotsParams) SetIntervaltype(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["intervaltype"] = v
+	return
+}
+
+func (p *ListSnapshotsParams) SetIsrecursive(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isrecursive"] = v
+	return
+}
+
+func (p *ListSnapshotsParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListSnapshotsParams) SetListall(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["listall"] = v
+	return
+}
+
+func (p *ListSnapshotsParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *ListSnapshotsParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListSnapshotsParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListSnapshotsParams) SetProjectid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectid"] = v
+	return
+}
+
+func (p *ListSnapshotsParams) SetSnapshottype(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["snapshottype"] = v
+	return
+}
+
+func (p *ListSnapshotsParams) SetTags(v map[string]string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["tags"] = v
+	return
+}
+
+func (p *ListSnapshotsParams) SetVolumeid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["volumeid"] = v
+	return
+}
+
+func (p *ListSnapshotsParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new ListSnapshotsParams instance,
+// as then you are sure you have configured all required params
+func (s *SnapshotService) NewListSnapshotsParams() *ListSnapshotsParams {
+	p := &ListSnapshotsParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *SnapshotService) GetSnapshotID(name string, opts ...OptionFunc) (string, int, error) {
+	p := &ListSnapshotsParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["name"] = name
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return "", -1, err
+		}
+	}
+
+	l, err := s.ListSnapshots(p)
+	if err != nil {
+		return "", -1, err
+	}
+
+	if l.Count == 0 {
+		return "", l.Count, fmt.Errorf("No match found for %s: %+v", name, l)
+	}
+
+	if l.Count == 1 {
+		return l.Snapshots[0].Id, l.Count, nil
+	}
+
+	if l.Count > 1 {
+		for _, v := range l.Snapshots {
+			if v.Name == name {
+				return v.Id, l.Count, nil
+			}
+		}
+	}
+	return "", l.Count, fmt.Errorf("Could not find an exact match for %s: %+v", name, l)
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *SnapshotService) GetSnapshotByName(name string, opts ...OptionFunc) (*Snapshot, int, error) {
+	id, count, err := s.GetSnapshotID(name, opts...)
+	if err != nil {
+		return nil, count, err
+	}
+
+	r, count, err := s.GetSnapshotByID(id, opts...)
+	if err != nil {
+		return nil, count, err
+	}
+	return r, count, nil
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *SnapshotService) GetSnapshotByID(id string, opts ...OptionFunc) (*Snapshot, int, error) {
+	p := &ListSnapshotsParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["id"] = id
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return nil, -1, err
+		}
+	}
+
+	l, err := s.ListSnapshots(p)
+	if err != nil {
+		if strings.Contains(err.Error(), fmt.Sprintf(
+			"Invalid parameter id value=%s due to incorrect long value format, "+
+				"or entity does not exist", id)) {
+			return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
+		}
+		return nil, -1, err
+	}
+
+	if l.Count == 0 {
+		return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
+	}
+
+	if l.Count == 1 {
+		return l.Snapshots[0], l.Count, nil
+	}
+	return nil, l.Count, fmt.Errorf("There is more then one result for Snapshot UUID: %s!", id)
+}
+
+// Lists all available snapshots for the account.
+func (s *SnapshotService) ListSnapshots(p *ListSnapshotsParams) (*ListSnapshotsResponse, error) {
+	resp, err := s.cs.newRequest("listSnapshots", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListSnapshotsResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListSnapshotsResponse struct {
+	Count     int         `json:"count"`
+	Snapshots []*Snapshot `json:"snapshot"`
+}
+
+type Snapshot struct {
+	Account      string `json:"account"`
+	Created      string `json:"created"`
+	Domain       string `json:"domain"`
+	Domainid     string `json:"domainid"`
+	Id           string `json:"id"`
+	Intervaltype string `json:"intervaltype"`
+	Name         string `json:"name"`
+	Physicalsize int64  `json:"physicalsize"`
+	Project      string `json:"project"`
+	Projectid    string `json:"projectid"`
+	Revertable   bool   `json:"revertable"`
+	Snapshottype string `json:"snapshottype"`
+	State        string `json:"state"`
+	Tags         []struct {
+		Account      string `json:"account"`
+		Customer     string `json:"customer"`
+		Domain       string `json:"domain"`
+		Domainid     string `json:"domainid"`
+		Key          string `json:"key"`
+		Project      string `json:"project"`
+		Projectid    string `json:"projectid"`
+		Resourceid   string `json:"resourceid"`
+		Resourcetype string `json:"resourcetype"`
+		Value        string `json:"value"`
+	} `json:"tags"`
+	Volumeid   string `json:"volumeid"`
+	Volumename string `json:"volumename"`
+	Volumetype string `json:"volumetype"`
+	Zoneid     string `json:"zoneid"`
+}
+
+type ListVMSnapshotParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListVMSnapshotParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["isrecursive"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("isrecursive", vv)
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["listall"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("listall", vv)
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["projectid"]; found {
+		u.Set("projectid", v.(string))
+	}
+	if v, found := p.p["state"]; found {
+		u.Set("state", v.(string))
+	}
+	if v, found := p.p["tags"]; found {
+		i := 0
+		for k, vv := range v.(map[string]string) {
+			u.Set(fmt.Sprintf("tags[%d].key", i), k)
+			u.Set(fmt.Sprintf("tags[%d].value", i), vv)
+			i++
+		}
+	}
+	if v, found := p.p["virtualmachineid"]; found {
+		u.Set("virtualmachineid", v.(string))
+	}
+	if v, found := p.p["vmsnapshotid"]; found {
+		u.Set("vmsnapshotid", v.(string))
+	}
+	if v, found := p.p["vmsnapshotids"]; found {
+		vv := strings.Join(v.([]string), ",")
+		u.Set("vmsnapshotids", vv)
+	}
+	return u
+}
+
+func (p *ListVMSnapshotParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *ListVMSnapshotParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *ListVMSnapshotParams) SetIsrecursive(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isrecursive"] = v
+	return
+}
+
+func (p *ListVMSnapshotParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListVMSnapshotParams) SetListall(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["listall"] = v
+	return
+}
+
+func (p *ListVMSnapshotParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *ListVMSnapshotParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListVMSnapshotParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListVMSnapshotParams) SetProjectid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectid"] = v
+	return
+}
+
+func (p *ListVMSnapshotParams) SetState(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["state"] = v
+	return
+}
+
+func (p *ListVMSnapshotParams) SetTags(v map[string]string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["tags"] = v
+	return
+}
+
+func (p *ListVMSnapshotParams) SetVirtualmachineid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["virtualmachineid"] = v
+	return
+}
+
+func (p *ListVMSnapshotParams) SetVmsnapshotid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["vmsnapshotid"] = v
+	return
+}
+
+func (p *ListVMSnapshotParams) SetVmsnapshotids(v []string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["vmsnapshotids"] = v
+	return
+}
+
+// You should always use this function to get a new ListVMSnapshotParams instance,
+// as then you are sure you have configured all required params
+func (s *SnapshotService) NewListVMSnapshotParams() *ListVMSnapshotParams {
+	p := &ListVMSnapshotParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *SnapshotService) GetVMSnapshotID(name string, opts ...OptionFunc) (string, int, error) {
+	p := &ListVMSnapshotParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["name"] = name
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return "", -1, err
+		}
+	}
+
+	l, err := s.ListVMSnapshot(p)
+	if err != nil {
+		return "", -1, err
+	}
+
+	if l.Count == 0 {
+		return "", l.Count, fmt.Errorf("No match found for %s: %+v", name, l)
+	}
+
+	if l.Count == 1 {
+		return l.VMSnapshot[0].Id, l.Count, nil
+	}
+
+	if l.Count > 1 {
+		for _, v := range l.VMSnapshot {
+			if v.Name == name {
+				return v.Id, l.Count, nil
+			}
+		}
+	}
+	return "", l.Count, fmt.Errorf("Could not find an exact match for %s: %+v", name, l)
+}
+
+// List virtual machine snapshot by conditions
+func (s *SnapshotService) ListVMSnapshot(p *ListVMSnapshotParams) (*ListVMSnapshotResponse, error) {
+	resp, err := s.cs.newRequest("listVMSnapshot", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListVMSnapshotResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListVMSnapshotResponse struct {
+	Count      int           `json:"count"`
+	VMSnapshot []*VMSnapshot `json:"vmsnapshot"`
+}
+
+type VMSnapshot struct {
+	Account          string `json:"account"`
+	Created          string `json:"created"`
+	Current          bool   `json:"current"`
+	Description      string `json:"description"`
+	Displayname      string `json:"displayname"`
+	Domain           string `json:"domain"`
+	Domainid         string `json:"domainid"`
+	Id               string `json:"id"`
+	Name             string `json:"name"`
+	Parent           string `json:"parent"`
+	ParentName       string `json:"parentName"`
+	Project          string `json:"project"`
+	Projectid        string `json:"projectid"`
+	State            string `json:"state"`
+	Type             string `json:"type"`
+	Virtualmachineid string `json:"virtualmachineid"`
+	Zoneid           string `json:"zoneid"`
+}
+
+type RevertSnapshotParams struct {
+	p map[string]interface{}
+}
+
+func (p *RevertSnapshotParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *RevertSnapshotParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new RevertSnapshotParams instance,
+// as then you are sure you have configured all required params
+func (s *SnapshotService) NewRevertSnapshotParams(id string) *RevertSnapshotParams {
+	p := &RevertSnapshotParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// This is supposed to revert a volume snapshot. This command is only supported with KVM so far
+func (s *SnapshotService) RevertSnapshot(p *RevertSnapshotParams) (*RevertSnapshotResponse, error) {
+	resp, err := s.cs.newRequest("revertSnapshot", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r RevertSnapshotResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type RevertSnapshotResponse struct {
+	JobID        string `json:"jobid"`
+	Account      string `json:"account"`
+	Created      string `json:"created"`
+	Domain       string `json:"domain"`
+	Domainid     string `json:"domainid"`
+	Id           string `json:"id"`
+	Intervaltype string `json:"intervaltype"`
+	Name         string `json:"name"`
+	Physicalsize int64  `json:"physicalsize"`
+	Project      string `json:"project"`
+	Projectid    string `json:"projectid"`
+	Revertable   bool   `json:"revertable"`
+	Snapshottype string `json:"snapshottype"`
+	State        string `json:"state"`
+	Tags         []struct {
+		Account      string `json:"account"`
+		Customer     string `json:"customer"`
+		Domain       string `json:"domain"`
+		Domainid     string `json:"domainid"`
+		Key          string `json:"key"`
+		Project      string `json:"project"`
+		Projectid    string `json:"projectid"`
+		Resourceid   string `json:"resourceid"`
+		Resourcetype string `json:"resourcetype"`
+		Value        string `json:"value"`
+	} `json:"tags"`
+	Volumeid   string `json:"volumeid"`
+	Volumename string `json:"volumename"`
+	Volumetype string `json:"volumetype"`
+	Zoneid     string `json:"zoneid"`
+}
+
+type RevertToVMSnapshotParams struct {
+	p map[string]interface{}
+}
+
+func (p *RevertToVMSnapshotParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["vmsnapshotid"]; found {
+		u.Set("vmsnapshotid", v.(string))
+	}
+	return u
+}
+
+func (p *RevertToVMSnapshotParams) SetVmsnapshotid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["vmsnapshotid"] = v
+	return
+}
+
+// You should always use this function to get a new RevertToVMSnapshotParams instance,
+// as then you are sure you have configured all required params
+func (s *SnapshotService) NewRevertToVMSnapshotParams(vmsnapshotid string) *RevertToVMSnapshotParams {
+	p := &RevertToVMSnapshotParams{}
+	p.p = make(map[string]interface{})
+	p.p["vmsnapshotid"] = vmsnapshotid
+	return p
+}
+
+// Revert VM from a vmsnapshot.
+func (s *SnapshotService) RevertToVMSnapshot(p *RevertToVMSnapshotParams) (*RevertToVMSnapshotResponse, error) {
+	resp, err := s.cs.newRequest("revertToVMSnapshot", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r RevertToVMSnapshotResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type RevertToVMSnapshotResponse struct {
+	JobID         string `json:"jobid"`
+	Account       string `json:"account"`
+	Affinitygroup []struct {
+		Account           string   `json:"account"`
+		Description       string   `json:"description"`
+		Domain            string   `json:"domain"`
+		Domainid          string   `json:"domainid"`
+		Id                string   `json:"id"`
+		Name              string   `json:"name"`
+		Project           string   `json:"project"`
+		Projectid         string   `json:"projectid"`
+		Type              string   `json:"type"`
+		VirtualmachineIds []string `json:"virtualmachineIds"`
+	} `json:"affinitygroup"`
+	Cpunumber             int               `json:"cpunumber"`
+	Cpuspeed              int               `json:"cpuspeed"`
+	Cpuused               string            `json:"cpuused"`
+	Created               string            `json:"created"`
+	Details               map[string]string `json:"details"`
+	Diskioread            int64             `json:"diskioread"`
+	Diskiowrite           int64             `json:"diskiowrite"`
+	Diskkbsread           int64             `json:"diskkbsread"`
+	Diskkbswrite          int64             `json:"diskkbswrite"`
+	Diskofferingid        string            `json:"diskofferingid"`
+	Diskofferingname      string            `json:"diskofferingname"`
+	Displayname           string            `json:"displayname"`
+	Displayvm             bool              `json:"displayvm"`
+	Domain                string            `json:"domain"`
+	Domainid              string            `json:"domainid"`
+	Forvirtualnetwork     bool              `json:"forvirtualnetwork"`
+	Group                 string            `json:"group"`
+	Groupid               string            `json:"groupid"`
+	Guestosid             string            `json:"guestosid"`
+	Haenable              bool              `json:"haenable"`
+	Hostid                string            `json:"hostid"`
+	Hostname              string            `json:"hostname"`
+	Hypervisor            string            `json:"hypervisor"`
+	Id                    string            `json:"id"`
+	Instancename          string            `json:"instancename"`
+	Isdynamicallyscalable bool              `json:"isdynamicallyscalable"`
+	Isodisplaytext        string            `json:"isodisplaytext"`
+	Isoid                 string            `json:"isoid"`
+	Isoname               string            `json:"isoname"`
+	Keypair               string            `json:"keypair"`
+	Memory                int               `json:"memory"`
+	Memoryintfreekbs      int64             `json:"memoryintfreekbs"`
+	Memorykbs             int64             `json:"memorykbs"`
+	Memorytargetkbs       int64             `json:"memorytargetkbs"`
+	Name                  string            `json:"name"`
+	Networkkbsread        int64             `json:"networkkbsread"`
+	Networkkbswrite       int64             `json:"networkkbswrite"`
+	Nic                   []struct {
+		Broadcasturi         string `json:"broadcasturi"`
+		Deviceid             string `json:"deviceid"`
+		Gateway              string `json:"gateway"`
+		Id                   string `json:"id"`
+		Ip6address           string `json:"ip6address"`
+		Ip6cidr              string `json:"ip6cidr"`
+		Ip6gateway           string `json:"ip6gateway"`
+		Ipaddress            string `json:"ipaddress"`
+		Isdefault            bool   `json:"isdefault"`
+		Isolationuri         string `json:"isolationuri"`
+		Macaddress           string `json:"macaddress"`
+		Netmask              string `json:"netmask"`
+		Networkid            string `json:"networkid"`
+		Networkname          string `json:"networkname"`
+		Nsxlogicalswitch     string `json:"nsxlogicalswitch"`
+		Nsxlogicalswitchport string `json:"nsxlogicalswitchport"`
+		Secondaryip          []struct {
+			Id        string `json:"id"`
+			Ipaddress string `json:"ipaddress"`
+		} `json:"secondaryip"`
+		Traffictype      string `json:"traffictype"`
+		Type             string `json:"type"`
+		Virtualmachineid string `json:"virtualmachineid"`
+	} `json:"nic"`
+	Ostypeid        int64  `json:"ostypeid"`
+	Password        string `json:"password"`
+	Passwordenabled bool   `json:"passwordenabled"`
+	Project         string `json:"project"`
+	Projectid       string `json:"projectid"`
+	Publicip        string `json:"publicip"`
+	Publicipid      string `json:"publicipid"`
+	Rootdeviceid    int64  `json:"rootdeviceid"`
+	Rootdevicetype  string `json:"rootdevicetype"`
+	Securitygroup   []struct {
+		Account     string `json:"account"`
+		Description string `json:"description"`
+		Domain      string `json:"domain"`
+		Domainid    string `json:"domainid"`
+		Egressrule  []struct {
+			Account           string `json:"account"`
+			Cidr              string `json:"cidr"`
+			Endport           int    `json:"endport"`
+			Icmpcode          int    `json:"icmpcode"`
+			Icmptype          int    `json:"icmptype"`
+			Protocol          string `json:"protocol"`
+			Ruleid            string `json:"ruleid"`
+			Securitygroupname string `json:"securitygroupname"`
+			Startport         int    `json:"startport"`
+			Tags              []struct {
+				Account      string `json:"account"`
+				Customer     string `json:"customer"`
+				Domain       string `json:"domain"`
+				Domainid     string `json:"domainid"`
+				Key          string `json:"key"`
+				Project      string `json:"project"`
+				Projectid    string `json:"projectid"`
+				Resourceid   string `json:"resourceid"`
+				Resourcetype string `json:"resourcetype"`
+				Value        string `json:"value"`
+			} `json:"tags"`
+		} `json:"egressrule"`
+		Id          string `json:"id"`
+		Ingressrule []struct {
+			Account           string `json:"account"`
+			Cidr              string `json:"cidr"`
+			Endport           int    `json:"endport"`
+			Icmpcode          int    `json:"icmpcode"`
+			Icmptype          int    `json:"icmptype"`
+			Protocol          string `json:"protocol"`
+			Ruleid            string `json:"ruleid"`
+			Securitygroupname string `json:"securitygroupname"`
+			Startport         int    `json:"startport"`
+			Tags              []struct {
+				Account      string `json:"account"`
+				Customer     string `json:"customer"`
+				Domain       string `json:"domain"`
+				Domainid     string `json:"domainid"`
+				Key          string `json:"key"`
+				Project      string `json:"project"`
+				Projectid    string `json:"projectid"`
+				Resourceid   string `json:"resourceid"`
+				Resourcetype string `json:"resourcetype"`
+				Value        string `json:"value"`
+			} `json:"tags"`
+		} `json:"ingressrule"`
+		Name      string `json:"name"`
+		Project   string `json:"project"`
+		Projectid string `json:"projectid"`
+		Tags      []struct {
+			Account      string `json:"account"`
+			Customer     string `json:"customer"`
+			Domain       string `json:"domain"`
+			Domainid     string `json:"domainid"`
+			Key          string `json:"key"`
+			Project      string `json:"project"`
+			Projectid    string `json:"projectid"`
+			Resourceid   string `json:"resourceid"`
+			Resourcetype string `json:"resourcetype"`
+			Value        string `json:"value"`
+		} `json:"tags"`
+		Virtualmachinecount int           `json:"virtualmachinecount"`
+		Virtualmachineids   []interface{} `json:"virtualmachineids"`
+	} `json:"securitygroup"`
+	Serviceofferingid   string `json:"serviceofferingid"`
+	Serviceofferingname string `json:"serviceofferingname"`
+	Servicestate        string `json:"servicestate"`
+	State               string `json:"state"`
+	Templatedisplaytext string `json:"templatedisplaytext"`
+	Templateid          string `json:"templateid"`
+	Templatename        string `json:"templatename"`
+	Userid              string `json:"userid"`
+	Username            string `json:"username"`
+	Vgpu                string `json:"vgpu"`
+	Zoneid              string `json:"zoneid"`
+	Zonename            string `json:"zonename"`
+}
+
+type UpdateSnapshotPolicyParams struct {
+	p map[string]interface{}
+}
+
+func (p *UpdateSnapshotPolicyParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["customid"]; found {
+		u.Set("customid", v.(string))
+	}
+	if v, found := p.p["fordisplay"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("fordisplay", vv)
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *UpdateSnapshotPolicyParams) SetCustomid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["customid"] = v
+	return
+}
+
+func (p *UpdateSnapshotPolicyParams) SetFordisplay(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["fordisplay"] = v
+	return
+}
+
+func (p *UpdateSnapshotPolicyParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new UpdateSnapshotPolicyParams instance,
+// as then you are sure you have configured all required params
+func (s *SnapshotService) NewUpdateSnapshotPolicyParams() *UpdateSnapshotPolicyParams {
+	p := &UpdateSnapshotPolicyParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// Updates the snapshot policy.
+func (s *SnapshotService) UpdateSnapshotPolicy(p *UpdateSnapshotPolicyParams) (*UpdateSnapshotPolicyResponse, error) {
+	resp, err := s.cs.newRequest("updateSnapshotPolicy", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r UpdateSnapshotPolicyResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type UpdateSnapshotPolicyResponse struct {
+	JobID        string `json:"jobid"`
+	Fordisplay   bool   `json:"fordisplay"`
+	Id           string `json:"id"`
+	Intervaltype int    `json:"intervaltype"`
+	Maxsnaps     int    `json:"maxsnaps"`
+	Schedule     string `json:"schedule"`
+	Timezone     string `json:"timezone"`
+	Volumeid     string `json:"volumeid"`
+}
diff --git a/vendor/github.com/xanzy/go-cloudstack/cloudstack/StoragePoolService.go b/vendor/github.com/xanzy/go-cloudstack/cloudstack/StoragePoolService.go
new file mode 100644
index 0000000..e20e307
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/cloudstack/StoragePoolService.go
@@ -0,0 +1,303 @@
+//
+// Copyright 2018, Sander van Harmelen
+//
+// Licensed 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 cloudstack
+
+import (
+	"encoding/json"
+	"net/url"
+	"strconv"
+)
+
+type CancelStorageMaintenanceParams struct {
+	p map[string]interface{}
+}
+
+func (p *CancelStorageMaintenanceParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *CancelStorageMaintenanceParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new CancelStorageMaintenanceParams instance,
+// as then you are sure you have configured all required params
+func (s *StoragePoolService) NewCancelStorageMaintenanceParams(id string) *CancelStorageMaintenanceParams {
+	p := &CancelStorageMaintenanceParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Cancels maintenance for primary storage
+func (s *StoragePoolService) CancelStorageMaintenance(p *CancelStorageMaintenanceParams) (*CancelStorageMaintenanceResponse, error) {
+	resp, err := s.cs.newRequest("cancelStorageMaintenance", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r CancelStorageMaintenanceResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type CancelStorageMaintenanceResponse struct {
+	JobID                string            `json:"jobid"`
+	Capacityiops         int64             `json:"capacityiops"`
+	Clusterid            string            `json:"clusterid"`
+	Clustername          string            `json:"clustername"`
+	Created              string            `json:"created"`
+	Disksizeallocated    int64             `json:"disksizeallocated"`
+	Disksizetotal        int64             `json:"disksizetotal"`
+	Disksizeused         int64             `json:"disksizeused"`
+	Hypervisor           string            `json:"hypervisor"`
+	Id                   string            `json:"id"`
+	Ipaddress            string            `json:"ipaddress"`
+	Name                 string            `json:"name"`
+	Overprovisionfactor  string            `json:"overprovisionfactor"`
+	Path                 string            `json:"path"`
+	Podid                string            `json:"podid"`
+	Podname              string            `json:"podname"`
+	Scope                string            `json:"scope"`
+	State                string            `json:"state"`
+	Storagecapabilities  map[string]string `json:"storagecapabilities"`
+	Suitableformigration bool              `json:"suitableformigration"`
+	Tags                 string            `json:"tags"`
+	Type                 string            `json:"type"`
+	Zoneid               string            `json:"zoneid"`
+	Zonename             string            `json:"zonename"`
+}
+
+type EnableStorageMaintenanceParams struct {
+	p map[string]interface{}
+}
+
+func (p *EnableStorageMaintenanceParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *EnableStorageMaintenanceParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new EnableStorageMaintenanceParams instance,
+// as then you are sure you have configured all required params
+func (s *StoragePoolService) NewEnableStorageMaintenanceParams(id string) *EnableStorageMaintenanceParams {
+	p := &EnableStorageMaintenanceParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Puts storage pool into maintenance state
+func (s *StoragePoolService) EnableStorageMaintenance(p *EnableStorageMaintenanceParams) (*EnableStorageMaintenanceResponse, error) {
+	resp, err := s.cs.newRequest("enableStorageMaintenance", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r EnableStorageMaintenanceResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type EnableStorageMaintenanceResponse struct {
+	JobID                string            `json:"jobid"`
+	Capacityiops         int64             `json:"capacityiops"`
+	Clusterid            string            `json:"clusterid"`
+	Clustername          string            `json:"clustername"`
+	Created              string            `json:"created"`
+	Disksizeallocated    int64             `json:"disksizeallocated"`
+	Disksizetotal        int64             `json:"disksizetotal"`
+	Disksizeused         int64             `json:"disksizeused"`
+	Hypervisor           string            `json:"hypervisor"`
+	Id                   string            `json:"id"`
+	Ipaddress            string            `json:"ipaddress"`
+	Name                 string            `json:"name"`
+	Overprovisionfactor  string            `json:"overprovisionfactor"`
+	Path                 string            `json:"path"`
+	Podid                string            `json:"podid"`
+	Podname              string            `json:"podname"`
+	Scope                string            `json:"scope"`
+	State                string            `json:"state"`
+	Storagecapabilities  map[string]string `json:"storagecapabilities"`
+	Suitableformigration bool              `json:"suitableformigration"`
+	Tags                 string            `json:"tags"`
+	Type                 string            `json:"type"`
+	Zoneid               string            `json:"zoneid"`
+	Zonename             string            `json:"zonename"`
+}
+
+type ListStorageProvidersParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListStorageProvidersParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["type"]; found {
+		u.Set("type", v.(string))
+	}
+	return u
+}
+
+func (p *ListStorageProvidersParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListStorageProvidersParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListStorageProvidersParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListStorageProvidersParams) SetType(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["type"] = v
+	return
+}
+
+// You should always use this function to get a new ListStorageProvidersParams instance,
+// as then you are sure you have configured all required params
+func (s *StoragePoolService) NewListStorageProvidersParams(storagePoolType string) *ListStorageProvidersParams {
+	p := &ListStorageProvidersParams{}
+	p.p = make(map[string]interface{})
+	p.p["type"] = storagePoolType
+	return p
+}
+
+// Lists storage providers.
+func (s *StoragePoolService) ListStorageProviders(p *ListStorageProvidersParams) (*ListStorageProvidersResponse, error) {
+	resp, err := s.cs.newRequest("listStorageProviders", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListStorageProvidersResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListStorageProvidersResponse struct {
+	Count            int                `json:"count"`
+	StorageProviders []*StorageProvider `json:"storageprovider"`
+}
+
+type StorageProvider struct {
+	Name string `json:"name"`
+	Type string `json:"type"`
+}
diff --git a/vendor/github.com/xanzy/go-cloudstack/cloudstack/StratosphereSSPService.go b/vendor/github.com/xanzy/go-cloudstack/cloudstack/StratosphereSSPService.go
new file mode 100644
index 0000000..c89363b
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/cloudstack/StratosphereSSPService.go
@@ -0,0 +1,185 @@
+//
+// Copyright 2018, Sander van Harmelen
+//
+// Licensed 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 cloudstack
+
+import (
+	"encoding/json"
+	"net/url"
+)
+
+type AddStratosphereSspParams struct {
+	p map[string]interface{}
+}
+
+func (p *AddStratosphereSspParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["password"]; found {
+		u.Set("password", v.(string))
+	}
+	if v, found := p.p["tenantuuid"]; found {
+		u.Set("tenantuuid", v.(string))
+	}
+	if v, found := p.p["url"]; found {
+		u.Set("url", v.(string))
+	}
+	if v, found := p.p["username"]; found {
+		u.Set("username", v.(string))
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *AddStratosphereSspParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *AddStratosphereSspParams) SetPassword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["password"] = v
+	return
+}
+
+func (p *AddStratosphereSspParams) SetTenantuuid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["tenantuuid"] = v
+	return
+}
+
+func (p *AddStratosphereSspParams) SetUrl(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["url"] = v
+	return
+}
+
+func (p *AddStratosphereSspParams) SetUsername(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["username"] = v
+	return
+}
+
+func (p *AddStratosphereSspParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new AddStratosphereSspParams instance,
+// as then you are sure you have configured all required params
+func (s *StratosphereSSPService) NewAddStratosphereSspParams(name string, url string, zoneid string) *AddStratosphereSspParams {
+	p := &AddStratosphereSspParams{}
+	p.p = make(map[string]interface{})
+	p.p["name"] = name
+	p.p["url"] = url
+	p.p["zoneid"] = zoneid
+	return p
+}
+
+// Adds stratosphere ssp server
+func (s *StratosphereSSPService) AddStratosphereSsp(p *AddStratosphereSspParams) (*AddStratosphereSspResponse, error) {
+	resp, err := s.cs.newRequest("addStratosphereSsp", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r AddStratosphereSspResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type AddStratosphereSspResponse struct {
+	Hostid string `json:"hostid"`
+	Name   string `json:"name"`
+	Url    string `json:"url"`
+	Zoneid string `json:"zoneid"`
+}
+
+type DeleteStratosphereSspParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeleteStratosphereSspParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["hostid"]; found {
+		u.Set("hostid", v.(string))
+	}
+	return u
+}
+
+func (p *DeleteStratosphereSspParams) SetHostid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["hostid"] = v
+	return
+}
+
+// You should always use this function to get a new DeleteStratosphereSspParams instance,
+// as then you are sure you have configured all required params
+func (s *StratosphereSSPService) NewDeleteStratosphereSspParams(hostid string) *DeleteStratosphereSspParams {
+	p := &DeleteStratosphereSspParams{}
+	p.p = make(map[string]interface{})
+	p.p["hostid"] = hostid
+	return p
+}
+
+// Removes stratosphere ssp server
+func (s *StratosphereSSPService) DeleteStratosphereSsp(p *DeleteStratosphereSspParams) (*DeleteStratosphereSspResponse, error) {
+	resp, err := s.cs.newRequest("deleteStratosphereSsp", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeleteStratosphereSspResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type DeleteStratosphereSspResponse struct {
+	Displaytext string `json:"displaytext"`
+	Success     string `json:"success"`
+}
diff --git a/vendor/github.com/xanzy/go-cloudstack/cloudstack/SwiftService.go b/vendor/github.com/xanzy/go-cloudstack/cloudstack/SwiftService.go
new file mode 100644
index 0000000..24d2643
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/cloudstack/SwiftService.go
@@ -0,0 +1,251 @@
+//
+// Copyright 2018, Sander van Harmelen
+//
+// Licensed 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 cloudstack
+
+import (
+	"encoding/json"
+	"fmt"
+	"net/url"
+	"strconv"
+)
+
+type AddSwiftParams struct {
+	p map[string]interface{}
+}
+
+func (p *AddSwiftParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["key"]; found {
+		u.Set("key", v.(string))
+	}
+	if v, found := p.p["url"]; found {
+		u.Set("url", v.(string))
+	}
+	if v, found := p.p["username"]; found {
+		u.Set("username", v.(string))
+	}
+	return u
+}
+
+func (p *AddSwiftParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *AddSwiftParams) SetKey(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["key"] = v
+	return
+}
+
+func (p *AddSwiftParams) SetUrl(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["url"] = v
+	return
+}
+
+func (p *AddSwiftParams) SetUsername(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["username"] = v
+	return
+}
+
+// You should always use this function to get a new AddSwiftParams instance,
+// as then you are sure you have configured all required params
+func (s *SwiftService) NewAddSwiftParams(url string) *AddSwiftParams {
+	p := &AddSwiftParams{}
+	p.p = make(map[string]interface{})
+	p.p["url"] = url
+	return p
+}
+
+// Adds Swift.
+func (s *SwiftService) AddSwift(p *AddSwiftParams) (*AddSwiftResponse, error) {
+	resp, err := s.cs.newRequest("addSwift", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r AddSwiftResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type AddSwiftResponse struct {
+	Details      []interface{} `json:"details"`
+	Id           string        `json:"id"`
+	Name         string        `json:"name"`
+	Protocol     string        `json:"protocol"`
+	Providername string        `json:"providername"`
+	Scope        string        `json:"scope"`
+	Url          string        `json:"url"`
+	Zoneid       string        `json:"zoneid"`
+	Zonename     string        `json:"zonename"`
+}
+
+type ListSwiftsParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListSwiftsParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		vv := strconv.FormatInt(v.(int64), 10)
+		u.Set("id", vv)
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	return u
+}
+
+func (p *ListSwiftsParams) SetId(v int64) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ListSwiftsParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListSwiftsParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListSwiftsParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+// You should always use this function to get a new ListSwiftsParams instance,
+// as then you are sure you have configured all required params
+func (s *SwiftService) NewListSwiftsParams() *ListSwiftsParams {
+	p := &ListSwiftsParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *SwiftService) GetSwiftID(keyword string, opts ...OptionFunc) (string, int, error) {
+	p := &ListSwiftsParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["keyword"] = keyword
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return "", -1, err
+		}
+	}
+
+	l, err := s.ListSwifts(p)
+	if err != nil {
+		return "", -1, err
+	}
+
+	if l.Count == 0 {
+		return "", l.Count, fmt.Errorf("No match found for %s: %+v", keyword, l)
+	}
+
+	if l.Count == 1 {
+		return l.Swifts[0].Id, l.Count, nil
+	}
+
+	if l.Count > 1 {
+		for _, v := range l.Swifts {
+			if v.Name == keyword {
+				return v.Id, l.Count, nil
+			}
+		}
+	}
+	return "", l.Count, fmt.Errorf("Could not find an exact match for %s: %+v", keyword, l)
+}
+
+// List Swift.
+func (s *SwiftService) ListSwifts(p *ListSwiftsParams) (*ListSwiftsResponse, error) {
+	resp, err := s.cs.newRequest("listSwifts", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListSwiftsResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListSwiftsResponse struct {
+	Count  int      `json:"count"`
+	Swifts []*Swift `json:"swift"`
+}
+
+type Swift struct {
+	Details      []interface{} `json:"details"`
+	Id           string        `json:"id"`
+	Name         string        `json:"name"`
+	Protocol     string        `json:"protocol"`
+	Providername string        `json:"providername"`
+	Scope        string        `json:"scope"`
+	Url          string        `json:"url"`
+	Zoneid       string        `json:"zoneid"`
+	Zonename     string        `json:"zonename"`
+}
diff --git a/vendor/github.com/xanzy/go-cloudstack/cloudstack/SystemCapacityService.go b/vendor/github.com/xanzy/go-cloudstack/cloudstack/SystemCapacityService.go
new file mode 100644
index 0000000..0b17d45
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/cloudstack/SystemCapacityService.go
@@ -0,0 +1,179 @@
+//
+// Copyright 2018, Sander van Harmelen
+//
+// Licensed 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 cloudstack
+
+import (
+	"encoding/json"
+	"net/url"
+	"strconv"
+)
+
+type ListCapacityParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListCapacityParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["clusterid"]; found {
+		u.Set("clusterid", v.(string))
+	}
+	if v, found := p.p["fetchlatest"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("fetchlatest", vv)
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["podid"]; found {
+		u.Set("podid", v.(string))
+	}
+	if v, found := p.p["sortby"]; found {
+		u.Set("sortby", v.(string))
+	}
+	if v, found := p.p["type"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("type", vv)
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *ListCapacityParams) SetClusterid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["clusterid"] = v
+	return
+}
+
+func (p *ListCapacityParams) SetFetchlatest(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["fetchlatest"] = v
+	return
+}
+
+func (p *ListCapacityParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListCapacityParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListCapacityParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListCapacityParams) SetPodid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["podid"] = v
+	return
+}
+
+func (p *ListCapacityParams) SetSortby(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["sortby"] = v
+	return
+}
+
+func (p *ListCapacityParams) SetType(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["type"] = v
+	return
+}
+
+func (p *ListCapacityParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new ListCapacityParams instance,
+// as then you are sure you have configured all required params
+func (s *SystemCapacityService) NewListCapacityParams() *ListCapacityParams {
+	p := &ListCapacityParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// Lists all the system wide capacities.
+func (s *SystemCapacityService) ListCapacity(p *ListCapacityParams) (*ListCapacityResponse, error) {
+	resp, err := s.cs.newRequest("listCapacity", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListCapacityResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListCapacityResponse struct {
+	Count    int         `json:"count"`
+	Capacity []*Capacity `json:"capacity"`
+}
+
+type Capacity struct {
+	Capacitytotal int64  `json:"capacitytotal"`
+	Capacityused  int64  `json:"capacityused"`
+	Clusterid     string `json:"clusterid"`
+	Clustername   string `json:"clustername"`
+	Percentused   string `json:"percentused"`
+	Podid         string `json:"podid"`
+	Podname       string `json:"podname"`
+	Type          int    `json:"type"`
+	Zoneid        string `json:"zoneid"`
+	Zonename      string `json:"zonename"`
+}
diff --git a/vendor/github.com/xanzy/go-cloudstack/cloudstack/SystemVMService.go b/vendor/github.com/xanzy/go-cloudstack/cloudstack/SystemVMService.go
new file mode 100644
index 0000000..2c3cf73
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/cloudstack/SystemVMService.go
@@ -0,0 +1,1052 @@
+//
+// Copyright 2018, Sander van Harmelen
+//
+// Licensed 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 cloudstack
+
+import (
+	"encoding/json"
+	"fmt"
+	"net/url"
+	"strconv"
+	"strings"
+)
+
+type ChangeServiceForSystemVmParams struct {
+	p map[string]interface{}
+}
+
+func (p *ChangeServiceForSystemVmParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["details"]; found {
+		i := 0
+		for k, vv := range v.(map[string]string) {
+			u.Set(fmt.Sprintf("details[%d].%s", i, k), vv)
+			i++
+		}
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["serviceofferingid"]; found {
+		u.Set("serviceofferingid", v.(string))
+	}
+	return u
+}
+
+func (p *ChangeServiceForSystemVmParams) SetDetails(v map[string]string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["details"] = v
+	return
+}
+
+func (p *ChangeServiceForSystemVmParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ChangeServiceForSystemVmParams) SetServiceofferingid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["serviceofferingid"] = v
+	return
+}
+
+// You should always use this function to get a new ChangeServiceForSystemVmParams instance,
+// as then you are sure you have configured all required params
+func (s *SystemVMService) NewChangeServiceForSystemVmParams(id string, serviceofferingid string) *ChangeServiceForSystemVmParams {
+	p := &ChangeServiceForSystemVmParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	p.p["serviceofferingid"] = serviceofferingid
+	return p
+}
+
+// Changes the service offering for a system vm (console proxy or secondary storage). The system vm must be in a "Stopped" state for this command to take effect.
+func (s *SystemVMService) ChangeServiceForSystemVm(p *ChangeServiceForSystemVmParams) (*ChangeServiceForSystemVmResponse, error) {
+	resp, err := s.cs.newRequest("changeServiceForSystemVm", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ChangeServiceForSystemVmResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ChangeServiceForSystemVmResponse struct {
+	Activeviewersessions int    `json:"activeviewersessions"`
+	Created              string `json:"created"`
+	Dns1                 string `json:"dns1"`
+	Dns2                 string `json:"dns2"`
+	Gateway              string `json:"gateway"`
+	Hostid               string `json:"hostid"`
+	Hostname             string `json:"hostname"`
+	Hypervisor           string `json:"hypervisor"`
+	Id                   string `json:"id"`
+	Jobid                string `json:"jobid"`
+	Jobstatus            int    `json:"jobstatus"`
+	Linklocalip          string `json:"linklocalip"`
+	Linklocalmacaddress  string `json:"linklocalmacaddress"`
+	Linklocalnetmask     string `json:"linklocalnetmask"`
+	Name                 string `json:"name"`
+	Networkdomain        string `json:"networkdomain"`
+	Podid                string `json:"podid"`
+	Privateip            string `json:"privateip"`
+	Privatemacaddress    string `json:"privatemacaddress"`
+	Privatenetmask       string `json:"privatenetmask"`
+	Publicip             string `json:"publicip"`
+	Publicmacaddress     string `json:"publicmacaddress"`
+	Publicnetmask        string `json:"publicnetmask"`
+	State                string `json:"state"`
+	Systemvmtype         string `json:"systemvmtype"`
+	Templateid           string `json:"templateid"`
+	Zoneid               string `json:"zoneid"`
+	Zonename             string `json:"zonename"`
+}
+
+type DestroySystemVmParams struct {
+	p map[string]interface{}
+}
+
+func (p *DestroySystemVmParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *DestroySystemVmParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new DestroySystemVmParams instance,
+// as then you are sure you have configured all required params
+func (s *SystemVMService) NewDestroySystemVmParams(id string) *DestroySystemVmParams {
+	p := &DestroySystemVmParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Destroyes a system virtual machine.
+func (s *SystemVMService) DestroySystemVm(p *DestroySystemVmParams) (*DestroySystemVmResponse, error) {
+	resp, err := s.cs.newRequest("destroySystemVm", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DestroySystemVmResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type DestroySystemVmResponse struct {
+	JobID                string `json:"jobid"`
+	Activeviewersessions int    `json:"activeviewersessions"`
+	Created              string `json:"created"`
+	Dns1                 string `json:"dns1"`
+	Dns2                 string `json:"dns2"`
+	Gateway              string `json:"gateway"`
+	Hostid               string `json:"hostid"`
+	Hostname             string `json:"hostname"`
+	Hypervisor           string `json:"hypervisor"`
+	Id                   string `json:"id"`
+	Jobid                string `json:"jobid"`
+	Jobstatus            int    `json:"jobstatus"`
+	Linklocalip          string `json:"linklocalip"`
+	Linklocalmacaddress  string `json:"linklocalmacaddress"`
+	Linklocalnetmask     string `json:"linklocalnetmask"`
+	Name                 string `json:"name"`
+	Networkdomain        string `json:"networkdomain"`
+	Podid                string `json:"podid"`
+	Privateip            string `json:"privateip"`
+	Privatemacaddress    string `json:"privatemacaddress"`
+	Privatenetmask       string `json:"privatenetmask"`
+	Publicip             string `json:"publicip"`
+	Publicmacaddress     string `json:"publicmacaddress"`
+	Publicnetmask        string `json:"publicnetmask"`
+	State                string `json:"state"`
+	Systemvmtype         string `json:"systemvmtype"`
+	Templateid           string `json:"templateid"`
+	Zoneid               string `json:"zoneid"`
+	Zonename             string `json:"zonename"`
+}
+
+type ListSystemVmsParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListSystemVmsParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["hostid"]; found {
+		u.Set("hostid", v.(string))
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["podid"]; found {
+		u.Set("podid", v.(string))
+	}
+	if v, found := p.p["state"]; found {
+		u.Set("state", v.(string))
+	}
+	if v, found := p.p["storageid"]; found {
+		u.Set("storageid", v.(string))
+	}
+	if v, found := p.p["systemvmtype"]; found {
+		u.Set("systemvmtype", v.(string))
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *ListSystemVmsParams) SetHostid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["hostid"] = v
+	return
+}
+
+func (p *ListSystemVmsParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ListSystemVmsParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListSystemVmsParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *ListSystemVmsParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListSystemVmsParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListSystemVmsParams) SetPodid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["podid"] = v
+	return
+}
+
+func (p *ListSystemVmsParams) SetState(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["state"] = v
+	return
+}
+
+func (p *ListSystemVmsParams) SetStorageid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["storageid"] = v
+	return
+}
+
+func (p *ListSystemVmsParams) SetSystemvmtype(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["systemvmtype"] = v
+	return
+}
+
+func (p *ListSystemVmsParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new ListSystemVmsParams instance,
+// as then you are sure you have configured all required params
+func (s *SystemVMService) NewListSystemVmsParams() *ListSystemVmsParams {
+	p := &ListSystemVmsParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *SystemVMService) GetSystemVmID(name string, opts ...OptionFunc) (string, int, error) {
+	p := &ListSystemVmsParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["name"] = name
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return "", -1, err
+		}
+	}
+
+	l, err := s.ListSystemVms(p)
+	if err != nil {
+		return "", -1, err
+	}
+
+	if l.Count == 0 {
+		return "", l.Count, fmt.Errorf("No match found for %s: %+v", name, l)
+	}
+
+	if l.Count == 1 {
+		return l.SystemVms[0].Id, l.Count, nil
+	}
+
+	if l.Count > 1 {
+		for _, v := range l.SystemVms {
+			if v.Name == name {
+				return v.Id, l.Count, nil
+			}
+		}
+	}
+	return "", l.Count, fmt.Errorf("Could not find an exact match for %s: %+v", name, l)
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *SystemVMService) GetSystemVmByName(name string, opts ...OptionFunc) (*SystemVm, int, error) {
+	id, count, err := s.GetSystemVmID(name, opts...)
+	if err != nil {
+		return nil, count, err
+	}
+
+	r, count, err := s.GetSystemVmByID(id, opts...)
+	if err != nil {
+		return nil, count, err
+	}
+	return r, count, nil
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *SystemVMService) GetSystemVmByID(id string, opts ...OptionFunc) (*SystemVm, int, error) {
+	p := &ListSystemVmsParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["id"] = id
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return nil, -1, err
+		}
+	}
+
+	l, err := s.ListSystemVms(p)
+	if err != nil {
+		if strings.Contains(err.Error(), fmt.Sprintf(
+			"Invalid parameter id value=%s due to incorrect long value format, "+
+				"or entity does not exist", id)) {
+			return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
+		}
+		return nil, -1, err
+	}
+
+	if l.Count == 0 {
+		return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
+	}
+
+	if l.Count == 1 {
+		return l.SystemVms[0], l.Count, nil
+	}
+	return nil, l.Count, fmt.Errorf("There is more then one result for SystemVm UUID: %s!", id)
+}
+
+// List system virtual machines.
+func (s *SystemVMService) ListSystemVms(p *ListSystemVmsParams) (*ListSystemVmsResponse, error) {
+	resp, err := s.cs.newRequest("listSystemVms", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListSystemVmsResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListSystemVmsResponse struct {
+	Count     int         `json:"count"`
+	SystemVms []*SystemVm `json:"systemvm"`
+}
+
+type SystemVm struct {
+	Activeviewersessions int    `json:"activeviewersessions"`
+	Created              string `json:"created"`
+	Dns1                 string `json:"dns1"`
+	Dns2                 string `json:"dns2"`
+	Gateway              string `json:"gateway"`
+	Hostid               string `json:"hostid"`
+	Hostname             string `json:"hostname"`
+	Hypervisor           string `json:"hypervisor"`
+	Id                   string `json:"id"`
+	Jobid                string `json:"jobid"`
+	Jobstatus            int    `json:"jobstatus"`
+	Linklocalip          string `json:"linklocalip"`
+	Linklocalmacaddress  string `json:"linklocalmacaddress"`
+	Linklocalnetmask     string `json:"linklocalnetmask"`
+	Name                 string `json:"name"`
+	Networkdomain        string `json:"networkdomain"`
+	Podid                string `json:"podid"`
+	Privateip            string `json:"privateip"`
+	Privatemacaddress    string `json:"privatemacaddress"`
+	Privatenetmask       string `json:"privatenetmask"`
+	Publicip             string `json:"publicip"`
+	Publicmacaddress     string `json:"publicmacaddress"`
+	Publicnetmask        string `json:"publicnetmask"`
+	State                string `json:"state"`
+	Systemvmtype         string `json:"systemvmtype"`
+	Templateid           string `json:"templateid"`
+	Zoneid               string `json:"zoneid"`
+	Zonename             string `json:"zonename"`
+}
+
+type MigrateSystemVmParams struct {
+	p map[string]interface{}
+}
+
+func (p *MigrateSystemVmParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["hostid"]; found {
+		u.Set("hostid", v.(string))
+	}
+	if v, found := p.p["virtualmachineid"]; found {
+		u.Set("virtualmachineid", v.(string))
+	}
+	return u
+}
+
+func (p *MigrateSystemVmParams) SetHostid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["hostid"] = v
+	return
+}
+
+func (p *MigrateSystemVmParams) SetVirtualmachineid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["virtualmachineid"] = v
+	return
+}
+
+// You should always use this function to get a new MigrateSystemVmParams instance,
+// as then you are sure you have configured all required params
+func (s *SystemVMService) NewMigrateSystemVmParams(hostid string, virtualmachineid string) *MigrateSystemVmParams {
+	p := &MigrateSystemVmParams{}
+	p.p = make(map[string]interface{})
+	p.p["hostid"] = hostid
+	p.p["virtualmachineid"] = virtualmachineid
+	return p
+}
+
+// Attempts Migration of a system virtual machine to the host specified.
+func (s *SystemVMService) MigrateSystemVm(p *MigrateSystemVmParams) (*MigrateSystemVmResponse, error) {
+	resp, err := s.cs.newRequest("migrateSystemVm", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r MigrateSystemVmResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type MigrateSystemVmResponse struct {
+	JobID                string `json:"jobid"`
+	Activeviewersessions int    `json:"activeviewersessions"`
+	Created              string `json:"created"`
+	Dns1                 string `json:"dns1"`
+	Dns2                 string `json:"dns2"`
+	Gateway              string `json:"gateway"`
+	Hostid               string `json:"hostid"`
+	Hostname             string `json:"hostname"`
+	Hypervisor           string `json:"hypervisor"`
+	Id                   string `json:"id"`
+	Jobid                string `json:"jobid"`
+	Jobstatus            int    `json:"jobstatus"`
+	Linklocalip          string `json:"linklocalip"`
+	Linklocalmacaddress  string `json:"linklocalmacaddress"`
+	Linklocalnetmask     string `json:"linklocalnetmask"`
+	Name                 string `json:"name"`
+	Networkdomain        string `json:"networkdomain"`
+	Podid                string `json:"podid"`
+	Privateip            string `json:"privateip"`
+	Privatemacaddress    string `json:"privatemacaddress"`
+	Privatenetmask       string `json:"privatenetmask"`
+	Publicip             string `json:"publicip"`
+	Publicmacaddress     string `json:"publicmacaddress"`
+	Publicnetmask        string `json:"publicnetmask"`
+	State                string `json:"state"`
+	Systemvmtype         string `json:"systemvmtype"`
+	Templateid           string `json:"templateid"`
+	Zoneid               string `json:"zoneid"`
+	Zonename             string `json:"zonename"`
+}
+
+type RebootSystemVmParams struct {
+	p map[string]interface{}
+}
+
+func (p *RebootSystemVmParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *RebootSystemVmParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new RebootSystemVmParams instance,
+// as then you are sure you have configured all required params
+func (s *SystemVMService) NewRebootSystemVmParams(id string) *RebootSystemVmParams {
+	p := &RebootSystemVmParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Reboots a system VM.
+func (s *SystemVMService) RebootSystemVm(p *RebootSystemVmParams) (*RebootSystemVmResponse, error) {
+	resp, err := s.cs.newRequest("rebootSystemVm", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r RebootSystemVmResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type RebootSystemVmResponse struct {
+	JobID                string `json:"jobid"`
+	Activeviewersessions int    `json:"activeviewersessions"`
+	Created              string `json:"created"`
+	Dns1                 string `json:"dns1"`
+	Dns2                 string `json:"dns2"`
+	Gateway              string `json:"gateway"`
+	Hostid               string `json:"hostid"`
+	Hostname             string `json:"hostname"`
+	Hypervisor           string `json:"hypervisor"`
+	Id                   string `json:"id"`
+	Jobid                string `json:"jobid"`
+	Jobstatus            int    `json:"jobstatus"`
+	Linklocalip          string `json:"linklocalip"`
+	Linklocalmacaddress  string `json:"linklocalmacaddress"`
+	Linklocalnetmask     string `json:"linklocalnetmask"`
+	Name                 string `json:"name"`
+	Networkdomain        string `json:"networkdomain"`
+	Podid                string `json:"podid"`
+	Privateip            string `json:"privateip"`
+	Privatemacaddress    string `json:"privatemacaddress"`
+	Privatenetmask       string `json:"privatenetmask"`
+	Publicip             string `json:"publicip"`
+	Publicmacaddress     string `json:"publicmacaddress"`
+	Publicnetmask        string `json:"publicnetmask"`
+	State                string `json:"state"`
+	Systemvmtype         string `json:"systemvmtype"`
+	Templateid           string `json:"templateid"`
+	Zoneid               string `json:"zoneid"`
+	Zonename             string `json:"zonename"`
+}
+
+type ScaleSystemVmParams struct {
+	p map[string]interface{}
+}
+
+func (p *ScaleSystemVmParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["details"]; found {
+		i := 0
+		for k, vv := range v.(map[string]string) {
+			u.Set(fmt.Sprintf("details[%d].%s", i, k), vv)
+			i++
+		}
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["serviceofferingid"]; found {
+		u.Set("serviceofferingid", v.(string))
+	}
+	return u
+}
+
+func (p *ScaleSystemVmParams) SetDetails(v map[string]string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["details"] = v
+	return
+}
+
+func (p *ScaleSystemVmParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ScaleSystemVmParams) SetServiceofferingid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["serviceofferingid"] = v
+	return
+}
+
+// You should always use this function to get a new ScaleSystemVmParams instance,
+// as then you are sure you have configured all required params
+func (s *SystemVMService) NewScaleSystemVmParams(id string, serviceofferingid string) *ScaleSystemVmParams {
+	p := &ScaleSystemVmParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	p.p["serviceofferingid"] = serviceofferingid
+	return p
+}
+
+// Scale the service offering for a system vm (console proxy or secondary storage). The system vm must be in a "Stopped" state for this command to take effect.
+func (s *SystemVMService) ScaleSystemVm(p *ScaleSystemVmParams) (*ScaleSystemVmResponse, error) {
+	resp, err := s.cs.newRequest("scaleSystemVm", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ScaleSystemVmResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type ScaleSystemVmResponse struct {
+	JobID                string `json:"jobid"`
+	Activeviewersessions int    `json:"activeviewersessions"`
+	Created              string `json:"created"`
+	Dns1                 string `json:"dns1"`
+	Dns2                 string `json:"dns2"`
+	Gateway              string `json:"gateway"`
+	Hostid               string `json:"hostid"`
+	Hostname             string `json:"hostname"`
+	Hypervisor           string `json:"hypervisor"`
+	Id                   string `json:"id"`
+	Jobid                string `json:"jobid"`
+	Jobstatus            int    `json:"jobstatus"`
+	Linklocalip          string `json:"linklocalip"`
+	Linklocalmacaddress  string `json:"linklocalmacaddress"`
+	Linklocalnetmask     string `json:"linklocalnetmask"`
+	Name                 string `json:"name"`
+	Networkdomain        string `json:"networkdomain"`
+	Podid                string `json:"podid"`
+	Privateip            string `json:"privateip"`
+	Privatemacaddress    string `json:"privatemacaddress"`
+	Privatenetmask       string `json:"privatenetmask"`
+	Publicip             string `json:"publicip"`
+	Publicmacaddress     string `json:"publicmacaddress"`
+	Publicnetmask        string `json:"publicnetmask"`
+	State                string `json:"state"`
+	Systemvmtype         string `json:"systemvmtype"`
+	Templateid           string `json:"templateid"`
+	Zoneid               string `json:"zoneid"`
+	Zonename             string `json:"zonename"`
+}
+
+type StartSystemVmParams struct {
+	p map[string]interface{}
+}
+
+func (p *StartSystemVmParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *StartSystemVmParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new StartSystemVmParams instance,
+// as then you are sure you have configured all required params
+func (s *SystemVMService) NewStartSystemVmParams(id string) *StartSystemVmParams {
+	p := &StartSystemVmParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Starts a system virtual machine.
+func (s *SystemVMService) StartSystemVm(p *StartSystemVmParams) (*StartSystemVmResponse, error) {
+	resp, err := s.cs.newRequest("startSystemVm", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r StartSystemVmResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type StartSystemVmResponse struct {
+	JobID                string `json:"jobid"`
+	Activeviewersessions int    `json:"activeviewersessions"`
+	Created              string `json:"created"`
+	Dns1                 string `json:"dns1"`
+	Dns2                 string `json:"dns2"`
+	Gateway              string `json:"gateway"`
+	Hostid               string `json:"hostid"`
+	Hostname             string `json:"hostname"`
+	Hypervisor           string `json:"hypervisor"`
+	Id                   string `json:"id"`
+	Jobid                string `json:"jobid"`
+	Jobstatus            int    `json:"jobstatus"`
+	Linklocalip          string `json:"linklocalip"`
+	Linklocalmacaddress  string `json:"linklocalmacaddress"`
+	Linklocalnetmask     string `json:"linklocalnetmask"`
+	Name                 string `json:"name"`
+	Networkdomain        string `json:"networkdomain"`
+	Podid                string `json:"podid"`
+	Privateip            string `json:"privateip"`
+	Privatemacaddress    string `json:"privatemacaddress"`
+	Privatenetmask       string `json:"privatenetmask"`
+	Publicip             string `json:"publicip"`
+	Publicmacaddress     string `json:"publicmacaddress"`
+	Publicnetmask        string `json:"publicnetmask"`
+	State                string `json:"state"`
+	Systemvmtype         string `json:"systemvmtype"`
+	Templateid           string `json:"templateid"`
+	Zoneid               string `json:"zoneid"`
+	Zonename             string `json:"zonename"`
+}
+
+type StopSystemVmParams struct {
+	p map[string]interface{}
+}
+
+func (p *StopSystemVmParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["forced"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("forced", vv)
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *StopSystemVmParams) SetForced(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["forced"] = v
+	return
+}
+
+func (p *StopSystemVmParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new StopSystemVmParams instance,
+// as then you are sure you have configured all required params
+func (s *SystemVMService) NewStopSystemVmParams(id string) *StopSystemVmParams {
+	p := &StopSystemVmParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Stops a system VM.
+func (s *SystemVMService) StopSystemVm(p *StopSystemVmParams) (*StopSystemVmResponse, error) {
+	resp, err := s.cs.newRequest("stopSystemVm", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r StopSystemVmResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type StopSystemVmResponse struct {
+	JobID                string `json:"jobid"`
+	Activeviewersessions int    `json:"activeviewersessions"`
+	Created              string `json:"created"`
+	Dns1                 string `json:"dns1"`
+	Dns2                 string `json:"dns2"`
+	Gateway              string `json:"gateway"`
+	Hostid               string `json:"hostid"`
+	Hostname             string `json:"hostname"`
+	Hypervisor           string `json:"hypervisor"`
+	Id                   string `json:"id"`
+	Jobid                string `json:"jobid"`
+	Jobstatus            int    `json:"jobstatus"`
+	Linklocalip          string `json:"linklocalip"`
+	Linklocalmacaddress  string `json:"linklocalmacaddress"`
+	Linklocalnetmask     string `json:"linklocalnetmask"`
+	Name                 string `json:"name"`
+	Networkdomain        string `json:"networkdomain"`
+	Podid                string `json:"podid"`
+	Privateip            string `json:"privateip"`
+	Privatemacaddress    string `json:"privatemacaddress"`
+	Privatenetmask       string `json:"privatenetmask"`
+	Publicip             string `json:"publicip"`
+	Publicmacaddress     string `json:"publicmacaddress"`
+	Publicnetmask        string `json:"publicnetmask"`
+	State                string `json:"state"`
+	Systemvmtype         string `json:"systemvmtype"`
+	Templateid           string `json:"templateid"`
+	Zoneid               string `json:"zoneid"`
+	Zonename             string `json:"zonename"`
+}
diff --git a/vendor/github.com/xanzy/go-cloudstack/cloudstack/TemplateService.go b/vendor/github.com/xanzy/go-cloudstack/cloudstack/TemplateService.go
new file mode 100644
index 0000000..3eef5ac
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/cloudstack/TemplateService.go
@@ -0,0 +1,2266 @@
+//
+// Copyright 2018, Sander van Harmelen
+//
+// Licensed 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 cloudstack
+
+import (
+	"encoding/json"
+	"fmt"
+	"net/url"
+	"strconv"
+	"strings"
+)
+
+type CopyTemplateParams struct {
+	p map[string]interface{}
+}
+
+func (p *CopyTemplateParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["destzoneid"]; found {
+		u.Set("destzoneid", v.(string))
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["sourcezoneid"]; found {
+		u.Set("sourcezoneid", v.(string))
+	}
+	return u
+}
+
+func (p *CopyTemplateParams) SetDestzoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["destzoneid"] = v
+	return
+}
+
+func (p *CopyTemplateParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *CopyTemplateParams) SetSourcezoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["sourcezoneid"] = v
+	return
+}
+
+// You should always use this function to get a new CopyTemplateParams instance,
+// as then you are sure you have configured all required params
+func (s *TemplateService) NewCopyTemplateParams(destzoneid string, id string) *CopyTemplateParams {
+	p := &CopyTemplateParams{}
+	p.p = make(map[string]interface{})
+	p.p["destzoneid"] = destzoneid
+	p.p["id"] = id
+	return p
+}
+
+// Copies a template from one zone to another.
+func (s *TemplateService) CopyTemplate(p *CopyTemplateParams) (*CopyTemplateResponse, error) {
+	resp, err := s.cs.newRequest("copyTemplate", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r CopyTemplateResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type CopyTemplateResponse struct {
+	JobID                 string            `json:"jobid"`
+	Account               string            `json:"account"`
+	Accountid             string            `json:"accountid"`
+	Bootable              bool              `json:"bootable"`
+	Checksum              string            `json:"checksum"`
+	Created               string            `json:"created"`
+	CrossZones            bool              `json:"crossZones"`
+	Details               map[string]string `json:"details"`
+	Displaytext           string            `json:"displaytext"`
+	Domain                string            `json:"domain"`
+	Domainid              string            `json:"domainid"`
+	Format                string            `json:"format"`
+	Hostid                string            `json:"hostid"`
+	Hostname              string            `json:"hostname"`
+	Hypervisor            string            `json:"hypervisor"`
+	Id                    string            `json:"id"`
+	Isdynamicallyscalable bool              `json:"isdynamicallyscalable"`
+	Isextractable         bool              `json:"isextractable"`
+	Isfeatured            bool              `json:"isfeatured"`
+	Ispublic              bool              `json:"ispublic"`
+	Isready               bool              `json:"isready"`
+	Name                  string            `json:"name"`
+	Ostypeid              string            `json:"ostypeid"`
+	Ostypename            string            `json:"ostypename"`
+	Passwordenabled       bool              `json:"passwordenabled"`
+	Project               string            `json:"project"`
+	Projectid             string            `json:"projectid"`
+	Removed               string            `json:"removed"`
+	Size                  int64             `json:"size"`
+	Sourcetemplateid      string            `json:"sourcetemplateid"`
+	Sshkeyenabled         bool              `json:"sshkeyenabled"`
+	Status                string            `json:"status"`
+	Templatetag           string            `json:"templatetag"`
+	Templatetype          string            `json:"templatetype"`
+	Zoneid                string            `json:"zoneid"`
+	Zonename              string            `json:"zonename"`
+}
+
+type CreateTemplateParams struct {
+	p map[string]interface{}
+}
+
+func (p *CreateTemplateParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["bits"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("bits", vv)
+	}
+	if v, found := p.p["details"]; found {
+		i := 0
+		for k, vv := range v.(map[string]string) {
+			u.Set(fmt.Sprintf("details[%d].%s", i, k), vv)
+			i++
+		}
+	}
+	if v, found := p.p["displaytext"]; found {
+		u.Set("displaytext", v.(string))
+	}
+	if v, found := p.p["isdynamicallyscalable"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("isdynamicallyscalable", vv)
+	}
+	if v, found := p.p["isfeatured"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("isfeatured", vv)
+	}
+	if v, found := p.p["ispublic"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("ispublic", vv)
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["ostypeid"]; found {
+		u.Set("ostypeid", v.(string))
+	}
+	if v, found := p.p["passwordenabled"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("passwordenabled", vv)
+	}
+	if v, found := p.p["projectid"]; found {
+		u.Set("projectid", v.(string))
+	}
+	if v, found := p.p["requireshvm"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("requireshvm", vv)
+	}
+	if v, found := p.p["snapshotid"]; found {
+		u.Set("snapshotid", v.(string))
+	}
+	if v, found := p.p["templatetag"]; found {
+		u.Set("templatetag", v.(string))
+	}
+	if v, found := p.p["url"]; found {
+		u.Set("url", v.(string))
+	}
+	if v, found := p.p["virtualmachineid"]; found {
+		u.Set("virtualmachineid", v.(string))
+	}
+	if v, found := p.p["volumeid"]; found {
+		u.Set("volumeid", v.(string))
+	}
+	return u
+}
+
+func (p *CreateTemplateParams) SetBits(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["bits"] = v
+	return
+}
+
+func (p *CreateTemplateParams) SetDetails(v map[string]string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["details"] = v
+	return
+}
+
+func (p *CreateTemplateParams) SetDisplaytext(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["displaytext"] = v
+	return
+}
+
+func (p *CreateTemplateParams) SetIsdynamicallyscalable(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isdynamicallyscalable"] = v
+	return
+}
+
+func (p *CreateTemplateParams) SetIsfeatured(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isfeatured"] = v
+	return
+}
+
+func (p *CreateTemplateParams) SetIspublic(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["ispublic"] = v
+	return
+}
+
+func (p *CreateTemplateParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *CreateTemplateParams) SetOstypeid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["ostypeid"] = v
+	return
+}
+
+func (p *CreateTemplateParams) SetPasswordenabled(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["passwordenabled"] = v
+	return
+}
+
+func (p *CreateTemplateParams) SetProjectid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectid"] = v
+	return
+}
+
+func (p *CreateTemplateParams) SetRequireshvm(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["requireshvm"] = v
+	return
+}
+
+func (p *CreateTemplateParams) SetSnapshotid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["snapshotid"] = v
+	return
+}
+
+func (p *CreateTemplateParams) SetTemplatetag(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["templatetag"] = v
+	return
+}
+
+func (p *CreateTemplateParams) SetUrl(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["url"] = v
+	return
+}
+
+func (p *CreateTemplateParams) SetVirtualmachineid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["virtualmachineid"] = v
+	return
+}
+
+func (p *CreateTemplateParams) SetVolumeid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["volumeid"] = v
+	return
+}
+
+// You should always use this function to get a new CreateTemplateParams instance,
+// as then you are sure you have configured all required params
+func (s *TemplateService) NewCreateTemplateParams(displaytext string, name string, ostypeid string) *CreateTemplateParams {
+	p := &CreateTemplateParams{}
+	p.p = make(map[string]interface{})
+	p.p["displaytext"] = displaytext
+	p.p["name"] = name
+	p.p["ostypeid"] = ostypeid
+	return p
+}
+
+// Creates a template of a virtual machine. The virtual machine must be in a STOPPED state. A template created from this command is automatically designated as a private template visible to the account that created it.
+func (s *TemplateService) CreateTemplate(p *CreateTemplateParams) (*CreateTemplateResponse, error) {
+	resp, err := s.cs.newRequest("createTemplate", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r CreateTemplateResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type CreateTemplateResponse struct {
+	JobID                 string            `json:"jobid"`
+	Account               string            `json:"account"`
+	Accountid             string            `json:"accountid"`
+	Bootable              bool              `json:"bootable"`
+	Checksum              string            `json:"checksum"`
+	Created               string            `json:"created"`
+	CrossZones            bool              `json:"crossZones"`
+	Details               map[string]string `json:"details"`
+	Displaytext           string            `json:"displaytext"`
+	Domain                string            `json:"domain"`
+	Domainid              string            `json:"domainid"`
+	Format                string            `json:"format"`
+	Hostid                string            `json:"hostid"`
+	Hostname              string            `json:"hostname"`
+	Hypervisor            string            `json:"hypervisor"`
+	Id                    string            `json:"id"`
+	Isdynamicallyscalable bool              `json:"isdynamicallyscalable"`
+	Isextractable         bool              `json:"isextractable"`
+	Isfeatured            bool              `json:"isfeatured"`
+	Ispublic              bool              `json:"ispublic"`
+	Isready               bool              `json:"isready"`
+	Name                  string            `json:"name"`
+	Ostypeid              string            `json:"ostypeid"`
+	Ostypename            string            `json:"ostypename"`
+	Passwordenabled       bool              `json:"passwordenabled"`
+	Project               string            `json:"project"`
+	Projectid             string            `json:"projectid"`
+	Removed               string            `json:"removed"`
+	Size                  int64             `json:"size"`
+	Sourcetemplateid      string            `json:"sourcetemplateid"`
+	Sshkeyenabled         bool              `json:"sshkeyenabled"`
+	Status                string            `json:"status"`
+	Templatetag           string            `json:"templatetag"`
+	Templatetype          string            `json:"templatetype"`
+	Zoneid                string            `json:"zoneid"`
+	Zonename              string            `json:"zonename"`
+}
+
+type DeleteTemplateParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeleteTemplateParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *DeleteTemplateParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *DeleteTemplateParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new DeleteTemplateParams instance,
+// as then you are sure you have configured all required params
+func (s *TemplateService) NewDeleteTemplateParams(id string) *DeleteTemplateParams {
+	p := &DeleteTemplateParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Deletes a template from the system. All virtual machines using the deleted template will not be affected.
+func (s *TemplateService) DeleteTemplate(p *DeleteTemplateParams) (*DeleteTemplateResponse, error) {
+	resp, err := s.cs.newRequest("deleteTemplate", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeleteTemplateResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type DeleteTemplateResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
+
+type ExtractTemplateParams struct {
+	p map[string]interface{}
+}
+
+func (p *ExtractTemplateParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["mode"]; found {
+		u.Set("mode", v.(string))
+	}
+	if v, found := p.p["url"]; found {
+		u.Set("url", v.(string))
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *ExtractTemplateParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ExtractTemplateParams) SetMode(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["mode"] = v
+	return
+}
+
+func (p *ExtractTemplateParams) SetUrl(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["url"] = v
+	return
+}
+
+func (p *ExtractTemplateParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new ExtractTemplateParams instance,
+// as then you are sure you have configured all required params
+func (s *TemplateService) NewExtractTemplateParams(id string, mode string) *ExtractTemplateParams {
+	p := &ExtractTemplateParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	p.p["mode"] = mode
+	return p
+}
+
+// Extracts a template
+func (s *TemplateService) ExtractTemplate(p *ExtractTemplateParams) (*ExtractTemplateResponse, error) {
+	resp, err := s.cs.newRequest("extractTemplate", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ExtractTemplateResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type ExtractTemplateResponse struct {
+	JobID            string `json:"jobid"`
+	Accountid        string `json:"accountid"`
+	Created          string `json:"created"`
+	ExtractId        string `json:"extractId"`
+	ExtractMode      string `json:"extractMode"`
+	Id               string `json:"id"`
+	Name             string `json:"name"`
+	Resultstring     string `json:"resultstring"`
+	State            string `json:"state"`
+	Status           string `json:"status"`
+	Storagetype      string `json:"storagetype"`
+	Uploadpercentage int    `json:"uploadpercentage"`
+	Url              string `json:"url"`
+	Zoneid           string `json:"zoneid"`
+	Zonename         string `json:"zonename"`
+}
+
+type GetUploadParamsForTemplateParams struct {
+	p map[string]interface{}
+}
+
+func (p *GetUploadParamsForTemplateParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["bits"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("bits", vv)
+	}
+	if v, found := p.p["checksum"]; found {
+		u.Set("checksum", v.(string))
+	}
+	if v, found := p.p["details"]; found {
+		i := 0
+		for k, vv := range v.(map[string]string) {
+			u.Set(fmt.Sprintf("details[%d].%s", i, k), vv)
+			i++
+		}
+	}
+	if v, found := p.p["displaytext"]; found {
+		u.Set("displaytext", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["format"]; found {
+		u.Set("format", v.(string))
+	}
+	if v, found := p.p["hypervisor"]; found {
+		u.Set("hypervisor", v.(string))
+	}
+	if v, found := p.p["isdynamicallyscalable"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("isdynamicallyscalable", vv)
+	}
+	if v, found := p.p["isextractable"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("isextractable", vv)
+	}
+	if v, found := p.p["isfeatured"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("isfeatured", vv)
+	}
+	if v, found := p.p["ispublic"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("ispublic", vv)
+	}
+	if v, found := p.p["isrouting"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("isrouting", vv)
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["ostypeid"]; found {
+		u.Set("ostypeid", v.(string))
+	}
+	if v, found := p.p["passwordenabled"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("passwordenabled", vv)
+	}
+	if v, found := p.p["projectid"]; found {
+		u.Set("projectid", v.(string))
+	}
+	if v, found := p.p["requireshvm"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("requireshvm", vv)
+	}
+	if v, found := p.p["sshkeyenabled"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("sshkeyenabled", vv)
+	}
+	if v, found := p.p["templatetag"]; found {
+		u.Set("templatetag", v.(string))
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *GetUploadParamsForTemplateParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *GetUploadParamsForTemplateParams) SetBits(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["bits"] = v
+	return
+}
+
+func (p *GetUploadParamsForTemplateParams) SetChecksum(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["checksum"] = v
+	return
+}
+
+func (p *GetUploadParamsForTemplateParams) SetDetails(v map[string]string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["details"] = v
+	return
+}
+
+func (p *GetUploadParamsForTemplateParams) SetDisplaytext(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["displaytext"] = v
+	return
+}
+
+func (p *GetUploadParamsForTemplateParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *GetUploadParamsForTemplateParams) SetFormat(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["format"] = v
+	return
+}
+
+func (p *GetUploadParamsForTemplateParams) SetHypervisor(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["hypervisor"] = v
+	return
+}
+
+func (p *GetUploadParamsForTemplateParams) SetIsdynamicallyscalable(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isdynamicallyscalable"] = v
+	return
+}
+
+func (p *GetUploadParamsForTemplateParams) SetIsextractable(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isextractable"] = v
+	return
+}
+
+func (p *GetUploadParamsForTemplateParams) SetIsfeatured(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isfeatured"] = v
+	return
+}
+
+func (p *GetUploadParamsForTemplateParams) SetIspublic(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["ispublic"] = v
+	return
+}
+
+func (p *GetUploadParamsForTemplateParams) SetIsrouting(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isrouting"] = v
+	return
+}
+
+func (p *GetUploadParamsForTemplateParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *GetUploadParamsForTemplateParams) SetOstypeid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["ostypeid"] = v
+	return
+}
+
+func (p *GetUploadParamsForTemplateParams) SetPasswordenabled(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["passwordenabled"] = v
+	return
+}
+
+func (p *GetUploadParamsForTemplateParams) SetProjectid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectid"] = v
+	return
+}
+
+func (p *GetUploadParamsForTemplateParams) SetRequireshvm(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["requireshvm"] = v
+	return
+}
+
+func (p *GetUploadParamsForTemplateParams) SetSshkeyenabled(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["sshkeyenabled"] = v
+	return
+}
+
+func (p *GetUploadParamsForTemplateParams) SetTemplatetag(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["templatetag"] = v
+	return
+}
+
+func (p *GetUploadParamsForTemplateParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new GetUploadParamsForTemplateParams instance,
+// as then you are sure you have configured all required params
+func (s *TemplateService) NewGetUploadParamsForTemplateParams(displaytext string, format string, hypervisor string, name string, ostypeid string, zoneid string) *GetUploadParamsForTemplateParams {
+	p := &GetUploadParamsForTemplateParams{}
+	p.p = make(map[string]interface{})
+	p.p["displaytext"] = displaytext
+	p.p["format"] = format
+	p.p["hypervisor"] = hypervisor
+	p.p["name"] = name
+	p.p["ostypeid"] = ostypeid
+	p.p["zoneid"] = zoneid
+	return p
+}
+
+// upload an existing template into the CloudStack cloud.
+func (s *TemplateService) GetUploadParamsForTemplate(p *GetUploadParamsForTemplateParams) (*GetUploadParamsForTemplateResponse, error) {
+	resp, err := s.cs.newRequest("getUploadParamsForTemplate", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r GetUploadParamsForTemplateResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type GetUploadParamsForTemplateResponse struct {
+	Expires   string `json:"expires"`
+	Id        string `json:"id"`
+	Metadata  string `json:"metadata"`
+	PostURL   string `json:"postURL"`
+	Signature string `json:"signature"`
+}
+
+type ListTemplatePermissionsParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListTemplatePermissionsParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *ListTemplatePermissionsParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new ListTemplatePermissionsParams instance,
+// as then you are sure you have configured all required params
+func (s *TemplateService) NewListTemplatePermissionsParams(id string) *ListTemplatePermissionsParams {
+	p := &ListTemplatePermissionsParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *TemplateService) GetTemplatePermissionByID(id string, opts ...OptionFunc) (*TemplatePermission, int, error) {
+	p := &ListTemplatePermissionsParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["id"] = id
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return nil, -1, err
+		}
+	}
+
+	l, err := s.ListTemplatePermissions(p)
+	if err != nil {
+		if strings.Contains(err.Error(), fmt.Sprintf(
+			"Invalid parameter id value=%s due to incorrect long value format, "+
+				"or entity does not exist", id)) {
+			return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
+		}
+		return nil, -1, err
+	}
+
+	if l.Count == 0 {
+		return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
+	}
+
+	if l.Count == 1 {
+		return l.TemplatePermissions[0], l.Count, nil
+	}
+	return nil, l.Count, fmt.Errorf("There is more then one result for TemplatePermission UUID: %s!", id)
+}
+
+// List template visibility and all accounts that have permissions to view this template.
+func (s *TemplateService) ListTemplatePermissions(p *ListTemplatePermissionsParams) (*ListTemplatePermissionsResponse, error) {
+	resp, err := s.cs.newRequest("listTemplatePermissions", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListTemplatePermissionsResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListTemplatePermissionsResponse struct {
+	Count               int                   `json:"count"`
+	TemplatePermissions []*TemplatePermission `json:"templatepermission"`
+}
+
+type TemplatePermission struct {
+	Account    []string `json:"account"`
+	Domainid   string   `json:"domainid"`
+	Id         string   `json:"id"`
+	Ispublic   bool     `json:"ispublic"`
+	Projectids []string `json:"projectids"`
+}
+
+type ListTemplatesParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListTemplatesParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["hypervisor"]; found {
+		u.Set("hypervisor", v.(string))
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["ids"]; found {
+		vv := strings.Join(v.([]string), ",")
+		u.Set("ids", vv)
+	}
+	if v, found := p.p["isrecursive"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("isrecursive", vv)
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["listall"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("listall", vv)
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["projectid"]; found {
+		u.Set("projectid", v.(string))
+	}
+	if v, found := p.p["showremoved"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("showremoved", vv)
+	}
+	if v, found := p.p["tags"]; found {
+		i := 0
+		for k, vv := range v.(map[string]string) {
+			u.Set(fmt.Sprintf("tags[%d].key", i), k)
+			u.Set(fmt.Sprintf("tags[%d].value", i), vv)
+			i++
+		}
+	}
+	if v, found := p.p["templatefilter"]; found {
+		u.Set("templatefilter", v.(string))
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *ListTemplatesParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *ListTemplatesParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *ListTemplatesParams) SetHypervisor(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["hypervisor"] = v
+	return
+}
+
+func (p *ListTemplatesParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ListTemplatesParams) SetIds(v []string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["ids"] = v
+	return
+}
+
+func (p *ListTemplatesParams) SetIsrecursive(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isrecursive"] = v
+	return
+}
+
+func (p *ListTemplatesParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListTemplatesParams) SetListall(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["listall"] = v
+	return
+}
+
+func (p *ListTemplatesParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *ListTemplatesParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListTemplatesParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListTemplatesParams) SetProjectid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectid"] = v
+	return
+}
+
+func (p *ListTemplatesParams) SetShowremoved(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["showremoved"] = v
+	return
+}
+
+func (p *ListTemplatesParams) SetTags(v map[string]string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["tags"] = v
+	return
+}
+
+func (p *ListTemplatesParams) SetTemplatefilter(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["templatefilter"] = v
+	return
+}
+
+func (p *ListTemplatesParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new ListTemplatesParams instance,
+// as then you are sure you have configured all required params
+func (s *TemplateService) NewListTemplatesParams(templatefilter string) *ListTemplatesParams {
+	p := &ListTemplatesParams{}
+	p.p = make(map[string]interface{})
+	p.p["templatefilter"] = templatefilter
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *TemplateService) GetTemplateID(name string, templatefilter string, zoneid string, opts ...OptionFunc) (string, int, error) {
+	p := &ListTemplatesParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["name"] = name
+	p.p["templatefilter"] = templatefilter
+	p.p["zoneid"] = zoneid
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return "", -1, err
+		}
+	}
+
+	l, err := s.ListTemplates(p)
+	if err != nil {
+		return "", -1, err
+	}
+
+	if l.Count == 0 {
+		return "", l.Count, fmt.Errorf("No match found for %s: %+v", name, l)
+	}
+
+	if l.Count == 1 {
+		return l.Templates[0].Id, l.Count, nil
+	}
+
+	if l.Count > 1 {
+		for _, v := range l.Templates {
+			if v.Name == name {
+				return v.Id, l.Count, nil
+			}
+		}
+	}
+	return "", l.Count, fmt.Errorf("Could not find an exact match for %s: %+v", name, l)
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *TemplateService) GetTemplateByName(name string, templatefilter string, zoneid string, opts ...OptionFunc) (*Template, int, error) {
+	id, count, err := s.GetTemplateID(name, templatefilter, zoneid, opts...)
+	if err != nil {
+		return nil, count, err
+	}
+
+	r, count, err := s.GetTemplateByID(id, templatefilter, opts...)
+	if err != nil {
+		return nil, count, err
+	}
+	return r, count, nil
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *TemplateService) GetTemplateByID(id string, templatefilter string, opts ...OptionFunc) (*Template, int, error) {
+	p := &ListTemplatesParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["id"] = id
+	p.p["templatefilter"] = templatefilter
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return nil, -1, err
+		}
+	}
+
+	l, err := s.ListTemplates(p)
+	if err != nil {
+		if strings.Contains(err.Error(), fmt.Sprintf(
+			"Invalid parameter id value=%s due to incorrect long value format, "+
+				"or entity does not exist", id)) {
+			return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
+		}
+		return nil, -1, err
+	}
+
+	if l.Count == 0 {
+		return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
+	}
+
+	if l.Count == 1 {
+		return l.Templates[0], l.Count, nil
+	}
+	return nil, l.Count, fmt.Errorf("There is more then one result for Template UUID: %s!", id)
+}
+
+// List all public, private, and privileged templates.
+func (s *TemplateService) ListTemplates(p *ListTemplatesParams) (*ListTemplatesResponse, error) {
+	resp, err := s.cs.newRequest("listTemplates", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListTemplatesResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListTemplatesResponse struct {
+	Count     int         `json:"count"`
+	Templates []*Template `json:"template"`
+}
+
+type Template struct {
+	Account               string            `json:"account"`
+	Accountid             string            `json:"accountid"`
+	Bootable              bool              `json:"bootable"`
+	Checksum              string            `json:"checksum"`
+	Created               string            `json:"created"`
+	CrossZones            bool              `json:"crossZones"`
+	Details               map[string]string `json:"details"`
+	Displaytext           string            `json:"displaytext"`
+	Domain                string            `json:"domain"`
+	Domainid              string            `json:"domainid"`
+	Format                string            `json:"format"`
+	Hostid                string            `json:"hostid"`
+	Hostname              string            `json:"hostname"`
+	Hypervisor            string            `json:"hypervisor"`
+	Id                    string            `json:"id"`
+	Isdynamicallyscalable bool              `json:"isdynamicallyscalable"`
+	Isextractable         bool              `json:"isextractable"`
+	Isfeatured            bool              `json:"isfeatured"`
+	Ispublic              bool              `json:"ispublic"`
+	Isready               bool              `json:"isready"`
+	Name                  string            `json:"name"`
+	Ostypeid              string            `json:"ostypeid"`
+	Ostypename            string            `json:"ostypename"`
+	Passwordenabled       bool              `json:"passwordenabled"`
+	Project               string            `json:"project"`
+	Projectid             string            `json:"projectid"`
+	Removed               string            `json:"removed"`
+	Size                  int64             `json:"size"`
+	Sourcetemplateid      string            `json:"sourcetemplateid"`
+	Sshkeyenabled         bool              `json:"sshkeyenabled"`
+	Status                string            `json:"status"`
+	Templatetag           string            `json:"templatetag"`
+	Templatetype          string            `json:"templatetype"`
+	Zoneid                string            `json:"zoneid"`
+	Zonename              string            `json:"zonename"`
+}
+
+type PrepareTemplateParams struct {
+	p map[string]interface{}
+}
+
+func (p *PrepareTemplateParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["storageid"]; found {
+		u.Set("storageid", v.(string))
+	}
+	if v, found := p.p["templateid"]; found {
+		u.Set("templateid", v.(string))
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *PrepareTemplateParams) SetStorageid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["storageid"] = v
+	return
+}
+
+func (p *PrepareTemplateParams) SetTemplateid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["templateid"] = v
+	return
+}
+
+func (p *PrepareTemplateParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new PrepareTemplateParams instance,
+// as then you are sure you have configured all required params
+func (s *TemplateService) NewPrepareTemplateParams(templateid string, zoneid string) *PrepareTemplateParams {
+	p := &PrepareTemplateParams{}
+	p.p = make(map[string]interface{})
+	p.p["templateid"] = templateid
+	p.p["zoneid"] = zoneid
+	return p
+}
+
+// load template into primary storage
+func (s *TemplateService) PrepareTemplate(p *PrepareTemplateParams) (*PrepareTemplateResponse, error) {
+	resp, err := s.cs.newRequest("prepareTemplate", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r PrepareTemplateResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type PrepareTemplateResponse struct {
+	Account               string            `json:"account"`
+	Accountid             string            `json:"accountid"`
+	Bootable              bool              `json:"bootable"`
+	Checksum              string            `json:"checksum"`
+	Created               string            `json:"created"`
+	CrossZones            bool              `json:"crossZones"`
+	Details               map[string]string `json:"details"`
+	Displaytext           string            `json:"displaytext"`
+	Domain                string            `json:"domain"`
+	Domainid              string            `json:"domainid"`
+	Format                string            `json:"format"`
+	Hostid                string            `json:"hostid"`
+	Hostname              string            `json:"hostname"`
+	Hypervisor            string            `json:"hypervisor"`
+	Id                    string            `json:"id"`
+	Isdynamicallyscalable bool              `json:"isdynamicallyscalable"`
+	Isextractable         bool              `json:"isextractable"`
+	Isfeatured            bool              `json:"isfeatured"`
+	Ispublic              bool              `json:"ispublic"`
+	Isready               bool              `json:"isready"`
+	Name                  string            `json:"name"`
+	Ostypeid              string            `json:"ostypeid"`
+	Ostypename            string            `json:"ostypename"`
+	Passwordenabled       bool              `json:"passwordenabled"`
+	Project               string            `json:"project"`
+	Projectid             string            `json:"projectid"`
+	Removed               string            `json:"removed"`
+	Size                  int64             `json:"size"`
+	Sourcetemplateid      string            `json:"sourcetemplateid"`
+	Sshkeyenabled         bool              `json:"sshkeyenabled"`
+	Status                string            `json:"status"`
+	Templatetag           string            `json:"templatetag"`
+	Templatetype          string            `json:"templatetype"`
+	Zoneid                string            `json:"zoneid"`
+	Zonename              string            `json:"zonename"`
+}
+
+type RegisterTemplateParams struct {
+	p map[string]interface{}
+}
+
+func (p *RegisterTemplateParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["bits"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("bits", vv)
+	}
+	if v, found := p.p["checksum"]; found {
+		u.Set("checksum", v.(string))
+	}
+	if v, found := p.p["details"]; found {
+		i := 0
+		for k, vv := range v.(map[string]string) {
+			u.Set(fmt.Sprintf("details[%d].%s", i, k), vv)
+			i++
+		}
+	}
+	if v, found := p.p["displaytext"]; found {
+		u.Set("displaytext", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["format"]; found {
+		u.Set("format", v.(string))
+	}
+	if v, found := p.p["hypervisor"]; found {
+		u.Set("hypervisor", v.(string))
+	}
+	if v, found := p.p["isdynamicallyscalable"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("isdynamicallyscalable", vv)
+	}
+	if v, found := p.p["isextractable"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("isextractable", vv)
+	}
+	if v, found := p.p["isfeatured"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("isfeatured", vv)
+	}
+	if v, found := p.p["ispublic"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("ispublic", vv)
+	}
+	if v, found := p.p["isrouting"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("isrouting", vv)
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["ostypeid"]; found {
+		u.Set("ostypeid", v.(string))
+	}
+	if v, found := p.p["passwordenabled"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("passwordenabled", vv)
+	}
+	if v, found := p.p["projectid"]; found {
+		u.Set("projectid", v.(string))
+	}
+	if v, found := p.p["requireshvm"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("requireshvm", vv)
+	}
+	if v, found := p.p["sshkeyenabled"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("sshkeyenabled", vv)
+	}
+	if v, found := p.p["templatetag"]; found {
+		u.Set("templatetag", v.(string))
+	}
+	if v, found := p.p["url"]; found {
+		u.Set("url", v.(string))
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *RegisterTemplateParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *RegisterTemplateParams) SetBits(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["bits"] = v
+	return
+}
+
+func (p *RegisterTemplateParams) SetChecksum(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["checksum"] = v
+	return
+}
+
+func (p *RegisterTemplateParams) SetDetails(v map[string]string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["details"] = v
+	return
+}
+
+func (p *RegisterTemplateParams) SetDisplaytext(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["displaytext"] = v
+	return
+}
+
+func (p *RegisterTemplateParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *RegisterTemplateParams) SetFormat(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["format"] = v
+	return
+}
+
+func (p *RegisterTemplateParams) SetHypervisor(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["hypervisor"] = v
+	return
+}
+
+func (p *RegisterTemplateParams) SetIsdynamicallyscalable(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isdynamicallyscalable"] = v
+	return
+}
+
+func (p *RegisterTemplateParams) SetIsextractable(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isextractable"] = v
+	return
+}
+
+func (p *RegisterTemplateParams) SetIsfeatured(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isfeatured"] = v
+	return
+}
+
+func (p *RegisterTemplateParams) SetIspublic(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["ispublic"] = v
+	return
+}
+
+func (p *RegisterTemplateParams) SetIsrouting(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isrouting"] = v
+	return
+}
+
+func (p *RegisterTemplateParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *RegisterTemplateParams) SetOstypeid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["ostypeid"] = v
+	return
+}
+
+func (p *RegisterTemplateParams) SetPasswordenabled(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["passwordenabled"] = v
+	return
+}
+
+func (p *RegisterTemplateParams) SetProjectid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectid"] = v
+	return
+}
+
+func (p *RegisterTemplateParams) SetRequireshvm(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["requireshvm"] = v
+	return
+}
+
+func (p *RegisterTemplateParams) SetSshkeyenabled(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["sshkeyenabled"] = v
+	return
+}
+
+func (p *RegisterTemplateParams) SetTemplatetag(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["templatetag"] = v
+	return
+}
+
+func (p *RegisterTemplateParams) SetUrl(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["url"] = v
+	return
+}
+
+func (p *RegisterTemplateParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new RegisterTemplateParams instance,
+// as then you are sure you have configured all required params
+func (s *TemplateService) NewRegisterTemplateParams(displaytext string, format string, hypervisor string, name string, ostypeid string, url string, zoneid string) *RegisterTemplateParams {
+	p := &RegisterTemplateParams{}
+	p.p = make(map[string]interface{})
+	p.p["displaytext"] = displaytext
+	p.p["format"] = format
+	p.p["hypervisor"] = hypervisor
+	p.p["name"] = name
+	p.p["ostypeid"] = ostypeid
+	p.p["url"] = url
+	p.p["zoneid"] = zoneid
+	return p
+}
+
+// Registers an existing template into the CloudStack cloud.
+func (s *TemplateService) RegisterTemplate(p *RegisterTemplateParams) (*RegisterTemplateResponse, error) {
+	resp, err := s.cs.newRequest("registerTemplate", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r RegisterTemplateResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type RegisterTemplateResponse struct {
+	Count            int                 `json:"count"`
+	RegisterTemplate []*RegisterTemplate `json:"template"`
+}
+
+type RegisterTemplate struct {
+	Account               string            `json:"account"`
+	Accountid             string            `json:"accountid"`
+	Bootable              bool              `json:"bootable"`
+	Checksum              string            `json:"checksum"`
+	Created               string            `json:"created"`
+	CrossZones            bool              `json:"crossZones"`
+	Details               map[string]string `json:"details"`
+	Displaytext           string            `json:"displaytext"`
+	Domain                string            `json:"domain"`
+	Domainid              string            `json:"domainid"`
+	Format                string            `json:"format"`
+	Hostid                string            `json:"hostid"`
+	Hostname              string            `json:"hostname"`
+	Hypervisor            string            `json:"hypervisor"`
+	Id                    string            `json:"id"`
+	Isdynamicallyscalable bool              `json:"isdynamicallyscalable"`
+	Isextractable         bool              `json:"isextractable"`
+	Isfeatured            bool              `json:"isfeatured"`
+	Ispublic              bool              `json:"ispublic"`
+	Isready               bool              `json:"isready"`
+	Name                  string            `json:"name"`
+	Ostypeid              string            `json:"ostypeid"`
+	Ostypename            string            `json:"ostypename"`
+	Passwordenabled       bool              `json:"passwordenabled"`
+	Project               string            `json:"project"`
+	Projectid             string            `json:"projectid"`
+	Removed               string            `json:"removed"`
+	Size                  int64             `json:"size"`
+	Sourcetemplateid      string            `json:"sourcetemplateid"`
+	Sshkeyenabled         bool              `json:"sshkeyenabled"`
+	Status                string            `json:"status"`
+	Templatetag           string            `json:"templatetag"`
+	Templatetype          string            `json:"templatetype"`
+	Zoneid                string            `json:"zoneid"`
+	Zonename              string            `json:"zonename"`
+}
+
+type UpdateTemplateParams struct {
+	p map[string]interface{}
+}
+
+func (p *UpdateTemplateParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["bootable"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("bootable", vv)
+	}
+	if v, found := p.p["details"]; found {
+		i := 0
+		for k, vv := range v.(map[string]string) {
+			u.Set(fmt.Sprintf("details[%d].%s", i, k), vv)
+			i++
+		}
+	}
+	if v, found := p.p["displaytext"]; found {
+		u.Set("displaytext", v.(string))
+	}
+	if v, found := p.p["format"]; found {
+		u.Set("format", v.(string))
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["isdynamicallyscalable"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("isdynamicallyscalable", vv)
+	}
+	if v, found := p.p["isrouting"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("isrouting", vv)
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["ostypeid"]; found {
+		u.Set("ostypeid", v.(string))
+	}
+	if v, found := p.p["passwordenabled"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("passwordenabled", vv)
+	}
+	if v, found := p.p["requireshvm"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("requireshvm", vv)
+	}
+	if v, found := p.p["sortkey"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("sortkey", vv)
+	}
+	return u
+}
+
+func (p *UpdateTemplateParams) SetBootable(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["bootable"] = v
+	return
+}
+
+func (p *UpdateTemplateParams) SetDetails(v map[string]string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["details"] = v
+	return
+}
+
+func (p *UpdateTemplateParams) SetDisplaytext(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["displaytext"] = v
+	return
+}
+
+func (p *UpdateTemplateParams) SetFormat(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["format"] = v
+	return
+}
+
+func (p *UpdateTemplateParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *UpdateTemplateParams) SetIsdynamicallyscalable(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isdynamicallyscalable"] = v
+	return
+}
+
+func (p *UpdateTemplateParams) SetIsrouting(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isrouting"] = v
+	return
+}
+
+func (p *UpdateTemplateParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *UpdateTemplateParams) SetOstypeid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["ostypeid"] = v
+	return
+}
+
+func (p *UpdateTemplateParams) SetPasswordenabled(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["passwordenabled"] = v
+	return
+}
+
+func (p *UpdateTemplateParams) SetRequireshvm(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["requireshvm"] = v
+	return
+}
+
+func (p *UpdateTemplateParams) SetSortkey(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["sortkey"] = v
+	return
+}
+
+// You should always use this function to get a new UpdateTemplateParams instance,
+// as then you are sure you have configured all required params
+func (s *TemplateService) NewUpdateTemplateParams(id string) *UpdateTemplateParams {
+	p := &UpdateTemplateParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Updates attributes of a template.
+func (s *TemplateService) UpdateTemplate(p *UpdateTemplateParams) (*UpdateTemplateResponse, error) {
+	resp, err := s.cs.newRequest("updateTemplate", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r UpdateTemplateResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type UpdateTemplateResponse struct {
+	Account               string            `json:"account"`
+	Accountid             string            `json:"accountid"`
+	Bootable              bool              `json:"bootable"`
+	Checksum              string            `json:"checksum"`
+	Created               string            `json:"created"`
+	CrossZones            bool              `json:"crossZones"`
+	Details               map[string]string `json:"details"`
+	Displaytext           string            `json:"displaytext"`
+	Domain                string            `json:"domain"`
+	Domainid              string            `json:"domainid"`
+	Format                string            `json:"format"`
+	Hostid                string            `json:"hostid"`
+	Hostname              string            `json:"hostname"`
+	Hypervisor            string            `json:"hypervisor"`
+	Id                    string            `json:"id"`
+	Isdynamicallyscalable bool              `json:"isdynamicallyscalable"`
+	Isextractable         bool              `json:"isextractable"`
+	Isfeatured            bool              `json:"isfeatured"`
+	Ispublic              bool              `json:"ispublic"`
+	Isready               bool              `json:"isready"`
+	Name                  string            `json:"name"`
+	Ostypeid              string            `json:"ostypeid"`
+	Ostypename            string            `json:"ostypename"`
+	Passwordenabled       bool              `json:"passwordenabled"`
+	Project               string            `json:"project"`
+	Projectid             string            `json:"projectid"`
+	Removed               string            `json:"removed"`
+	Size                  int64             `json:"size"`
+	Sourcetemplateid      string            `json:"sourcetemplateid"`
+	Sshkeyenabled         bool              `json:"sshkeyenabled"`
+	Status                string            `json:"status"`
+	Templatetag           string            `json:"templatetag"`
+	Templatetype          string            `json:"templatetype"`
+	Zoneid                string            `json:"zoneid"`
+	Zonename              string            `json:"zonename"`
+}
+
+type UpdateTemplatePermissionsParams struct {
+	p map[string]interface{}
+}
+
+func (p *UpdateTemplatePermissionsParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["accounts"]; found {
+		vv := strings.Join(v.([]string), ",")
+		u.Set("accounts", vv)
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["isextractable"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("isextractable", vv)
+	}
+	if v, found := p.p["isfeatured"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("isfeatured", vv)
+	}
+	if v, found := p.p["ispublic"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("ispublic", vv)
+	}
+	if v, found := p.p["op"]; found {
+		u.Set("op", v.(string))
+	}
+	if v, found := p.p["projectids"]; found {
+		vv := strings.Join(v.([]string), ",")
+		u.Set("projectids", vv)
+	}
+	return u
+}
+
+func (p *UpdateTemplatePermissionsParams) SetAccounts(v []string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["accounts"] = v
+	return
+}
+
+func (p *UpdateTemplatePermissionsParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *UpdateTemplatePermissionsParams) SetIsextractable(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isextractable"] = v
+	return
+}
+
+func (p *UpdateTemplatePermissionsParams) SetIsfeatured(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isfeatured"] = v
+	return
+}
+
+func (p *UpdateTemplatePermissionsParams) SetIspublic(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["ispublic"] = v
+	return
+}
+
+func (p *UpdateTemplatePermissionsParams) SetOp(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["op"] = v
+	return
+}
+
+func (p *UpdateTemplatePermissionsParams) SetProjectids(v []string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectids"] = v
+	return
+}
+
+// You should always use this function to get a new UpdateTemplatePermissionsParams instance,
+// as then you are sure you have configured all required params
+func (s *TemplateService) NewUpdateTemplatePermissionsParams(id string) *UpdateTemplatePermissionsParams {
+	p := &UpdateTemplatePermissionsParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Updates a template visibility permissions. A public template is visible to all accounts within the same domain. A private template is visible only to the owner of the template. A priviledged template is a private template with account permissions added. Only accounts specified under the template permissions are visible to them.
+func (s *TemplateService) UpdateTemplatePermissions(p *UpdateTemplatePermissionsParams) (*UpdateTemplatePermissionsResponse, error) {
+	resp, err := s.cs.newRequest("updateTemplatePermissions", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r UpdateTemplatePermissionsResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type UpdateTemplatePermissionsResponse struct {
+	Displaytext string `json:"displaytext"`
+	Success     string `json:"success"`
+}
+
+type UpgradeRouterTemplateParams struct {
+	p map[string]interface{}
+}
+
+func (p *UpgradeRouterTemplateParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["clusterid"]; found {
+		u.Set("clusterid", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["podid"]; found {
+		u.Set("podid", v.(string))
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *UpgradeRouterTemplateParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *UpgradeRouterTemplateParams) SetClusterid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["clusterid"] = v
+	return
+}
+
+func (p *UpgradeRouterTemplateParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *UpgradeRouterTemplateParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *UpgradeRouterTemplateParams) SetPodid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["podid"] = v
+	return
+}
+
+func (p *UpgradeRouterTemplateParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new UpgradeRouterTemplateParams instance,
+// as then you are sure you have configured all required params
+func (s *TemplateService) NewUpgradeRouterTemplateParams() *UpgradeRouterTemplateParams {
+	p := &UpgradeRouterTemplateParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// Upgrades router to use newer template
+func (s *TemplateService) UpgradeRouterTemplate(p *UpgradeRouterTemplateParams) (*UpgradeRouterTemplateResponse, error) {
+	resp, err := s.cs.newRequest("upgradeRouterTemplate", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r UpgradeRouterTemplateResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type UpgradeRouterTemplateResponse struct {
+	Jobid     string `json:"jobid"`
+	Jobstatus int    `json:"jobstatus"`
+}
diff --git a/vendor/github.com/xanzy/go-cloudstack/cloudstack/UCSService.go b/vendor/github.com/xanzy/go-cloudstack/cloudstack/UCSService.go
new file mode 100644
index 0000000..ebceb93
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/cloudstack/UCSService.go
@@ -0,0 +1,651 @@
+//
+// Copyright 2018, Sander van Harmelen
+//
+// Licensed 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 cloudstack
+
+import (
+	"encoding/json"
+	"fmt"
+	"net/url"
+	"strconv"
+	"strings"
+)
+
+type AddUcsManagerParams struct {
+	p map[string]interface{}
+}
+
+func (p *AddUcsManagerParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["password"]; found {
+		u.Set("password", v.(string))
+	}
+	if v, found := p.p["url"]; found {
+		u.Set("url", v.(string))
+	}
+	if v, found := p.p["username"]; found {
+		u.Set("username", v.(string))
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *AddUcsManagerParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *AddUcsManagerParams) SetPassword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["password"] = v
+	return
+}
+
+func (p *AddUcsManagerParams) SetUrl(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["url"] = v
+	return
+}
+
+func (p *AddUcsManagerParams) SetUsername(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["username"] = v
+	return
+}
+
+func (p *AddUcsManagerParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new AddUcsManagerParams instance,
+// as then you are sure you have configured all required params
+func (s *UCSService) NewAddUcsManagerParams(password string, url string, username string, zoneid string) *AddUcsManagerParams {
+	p := &AddUcsManagerParams{}
+	p.p = make(map[string]interface{})
+	p.p["password"] = password
+	p.p["url"] = url
+	p.p["username"] = username
+	p.p["zoneid"] = zoneid
+	return p
+}
+
+// Adds a Ucs manager
+func (s *UCSService) AddUcsManager(p *AddUcsManagerParams) (*AddUcsManagerResponse, error) {
+	resp, err := s.cs.newRequest("addUcsManager", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r AddUcsManagerResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type AddUcsManagerResponse struct {
+	Id     string `json:"id"`
+	Name   string `json:"name"`
+	Url    string `json:"url"`
+	Zoneid string `json:"zoneid"`
+}
+
+type AssociateUcsProfileToBladeParams struct {
+	p map[string]interface{}
+}
+
+func (p *AssociateUcsProfileToBladeParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["bladeid"]; found {
+		u.Set("bladeid", v.(string))
+	}
+	if v, found := p.p["profiledn"]; found {
+		u.Set("profiledn", v.(string))
+	}
+	if v, found := p.p["ucsmanagerid"]; found {
+		u.Set("ucsmanagerid", v.(string))
+	}
+	return u
+}
+
+func (p *AssociateUcsProfileToBladeParams) SetBladeid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["bladeid"] = v
+	return
+}
+
+func (p *AssociateUcsProfileToBladeParams) SetProfiledn(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["profiledn"] = v
+	return
+}
+
+func (p *AssociateUcsProfileToBladeParams) SetUcsmanagerid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["ucsmanagerid"] = v
+	return
+}
+
+// You should always use this function to get a new AssociateUcsProfileToBladeParams instance,
+// as then you are sure you have configured all required params
+func (s *UCSService) NewAssociateUcsProfileToBladeParams(bladeid string, profiledn string, ucsmanagerid string) *AssociateUcsProfileToBladeParams {
+	p := &AssociateUcsProfileToBladeParams{}
+	p.p = make(map[string]interface{})
+	p.p["bladeid"] = bladeid
+	p.p["profiledn"] = profiledn
+	p.p["ucsmanagerid"] = ucsmanagerid
+	return p
+}
+
+// associate a profile to a blade
+func (s *UCSService) AssociateUcsProfileToBlade(p *AssociateUcsProfileToBladeParams) (*AssociateUcsProfileToBladeResponse, error) {
+	resp, err := s.cs.newRequest("associateUcsProfileToBlade", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r AssociateUcsProfileToBladeResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type AssociateUcsProfileToBladeResponse struct {
+	JobID        string `json:"jobid"`
+	Bladedn      string `json:"bladedn"`
+	Hostid       string `json:"hostid"`
+	Id           string `json:"id"`
+	Profiledn    string `json:"profiledn"`
+	Ucsmanagerid string `json:"ucsmanagerid"`
+}
+
+type DeleteUcsManagerParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeleteUcsManagerParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["ucsmanagerid"]; found {
+		u.Set("ucsmanagerid", v.(string))
+	}
+	return u
+}
+
+func (p *DeleteUcsManagerParams) SetUcsmanagerid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["ucsmanagerid"] = v
+	return
+}
+
+// You should always use this function to get a new DeleteUcsManagerParams instance,
+// as then you are sure you have configured all required params
+func (s *UCSService) NewDeleteUcsManagerParams(ucsmanagerid string) *DeleteUcsManagerParams {
+	p := &DeleteUcsManagerParams{}
+	p.p = make(map[string]interface{})
+	p.p["ucsmanagerid"] = ucsmanagerid
+	return p
+}
+
+// Delete a Ucs manager
+func (s *UCSService) DeleteUcsManager(p *DeleteUcsManagerParams) (*DeleteUcsManagerResponse, error) {
+	resp, err := s.cs.newRequest("deleteUcsManager", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeleteUcsManagerResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type DeleteUcsManagerResponse struct {
+	Displaytext string `json:"displaytext"`
+	Success     string `json:"success"`
+}
+
+type ListUcsBladesParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListUcsBladesParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["ucsmanagerid"]; found {
+		u.Set("ucsmanagerid", v.(string))
+	}
+	return u
+}
+
+func (p *ListUcsBladesParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListUcsBladesParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListUcsBladesParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListUcsBladesParams) SetUcsmanagerid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["ucsmanagerid"] = v
+	return
+}
+
+// You should always use this function to get a new ListUcsBladesParams instance,
+// as then you are sure you have configured all required params
+func (s *UCSService) NewListUcsBladesParams(ucsmanagerid string) *ListUcsBladesParams {
+	p := &ListUcsBladesParams{}
+	p.p = make(map[string]interface{})
+	p.p["ucsmanagerid"] = ucsmanagerid
+	return p
+}
+
+// List ucs blades
+func (s *UCSService) ListUcsBlades(p *ListUcsBladesParams) (*ListUcsBladesResponse, error) {
+	resp, err := s.cs.newRequest("listUcsBlades", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListUcsBladesResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListUcsBladesResponse struct {
+	Count     int         `json:"count"`
+	UcsBlades []*UcsBlade `json:"ucsblade"`
+}
+
+type UcsBlade struct {
+	Bladedn      string `json:"bladedn"`
+	Hostid       string `json:"hostid"`
+	Id           string `json:"id"`
+	Profiledn    string `json:"profiledn"`
+	Ucsmanagerid string `json:"ucsmanagerid"`
+}
+
+type ListUcsManagersParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListUcsManagersParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *ListUcsManagersParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ListUcsManagersParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListUcsManagersParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListUcsManagersParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListUcsManagersParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new ListUcsManagersParams instance,
+// as then you are sure you have configured all required params
+func (s *UCSService) NewListUcsManagersParams() *ListUcsManagersParams {
+	p := &ListUcsManagersParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *UCSService) GetUcsManagerID(keyword string, opts ...OptionFunc) (string, int, error) {
+	p := &ListUcsManagersParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["keyword"] = keyword
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return "", -1, err
+		}
+	}
+
+	l, err := s.ListUcsManagers(p)
+	if err != nil {
+		return "", -1, err
+	}
+
+	if l.Count == 0 {
+		return "", l.Count, fmt.Errorf("No match found for %s: %+v", keyword, l)
+	}
+
+	if l.Count == 1 {
+		return l.UcsManagers[0].Id, l.Count, nil
+	}
+
+	if l.Count > 1 {
+		for _, v := range l.UcsManagers {
+			if v.Name == keyword {
+				return v.Id, l.Count, nil
+			}
+		}
+	}
+	return "", l.Count, fmt.Errorf("Could not find an exact match for %s: %+v", keyword, l)
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *UCSService) GetUcsManagerByName(name string, opts ...OptionFunc) (*UcsManager, int, error) {
+	id, count, err := s.GetUcsManagerID(name, opts...)
+	if err != nil {
+		return nil, count, err
+	}
+
+	r, count, err := s.GetUcsManagerByID(id, opts...)
+	if err != nil {
+		return nil, count, err
+	}
+	return r, count, nil
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *UCSService) GetUcsManagerByID(id string, opts ...OptionFunc) (*UcsManager, int, error) {
+	p := &ListUcsManagersParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["id"] = id
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return nil, -1, err
+		}
+	}
+
+	l, err := s.ListUcsManagers(p)
+	if err != nil {
+		if strings.Contains(err.Error(), fmt.Sprintf(
+			"Invalid parameter id value=%s due to incorrect long value format, "+
+				"or entity does not exist", id)) {
+			return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
+		}
+		return nil, -1, err
+	}
+
+	if l.Count == 0 {
+		return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
+	}
+
+	if l.Count == 1 {
+		return l.UcsManagers[0], l.Count, nil
+	}
+	return nil, l.Count, fmt.Errorf("There is more then one result for UcsManager UUID: %s!", id)
+}
+
+// List ucs manager
+func (s *UCSService) ListUcsManagers(p *ListUcsManagersParams) (*ListUcsManagersResponse, error) {
+	resp, err := s.cs.newRequest("listUcsManagers", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListUcsManagersResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListUcsManagersResponse struct {
+	Count       int           `json:"count"`
+	UcsManagers []*UcsManager `json:"ucsmanager"`
+}
+
+type UcsManager struct {
+	Id     string `json:"id"`
+	Name   string `json:"name"`
+	Url    string `json:"url"`
+	Zoneid string `json:"zoneid"`
+}
+
+type ListUcsProfilesParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListUcsProfilesParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["ucsmanagerid"]; found {
+		u.Set("ucsmanagerid", v.(string))
+	}
+	return u
+}
+
+func (p *ListUcsProfilesParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListUcsProfilesParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListUcsProfilesParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListUcsProfilesParams) SetUcsmanagerid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["ucsmanagerid"] = v
+	return
+}
+
+// You should always use this function to get a new ListUcsProfilesParams instance,
+// as then you are sure you have configured all required params
+func (s *UCSService) NewListUcsProfilesParams(ucsmanagerid string) *ListUcsProfilesParams {
+	p := &ListUcsProfilesParams{}
+	p.p = make(map[string]interface{})
+	p.p["ucsmanagerid"] = ucsmanagerid
+	return p
+}
+
+// List profile in ucs manager
+func (s *UCSService) ListUcsProfiles(p *ListUcsProfilesParams) (*ListUcsProfilesResponse, error) {
+	resp, err := s.cs.newRequest("listUcsProfiles", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListUcsProfilesResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListUcsProfilesResponse struct {
+	Count       int           `json:"count"`
+	UcsProfiles []*UcsProfile `json:"ucsprofile"`
+}
+
+type UcsProfile struct {
+	Ucsdn string `json:"ucsdn"`
+}
diff --git a/vendor/github.com/xanzy/go-cloudstack/cloudstack/UsageService.go b/vendor/github.com/xanzy/go-cloudstack/cloudstack/UsageService.go
new file mode 100644
index 0000000..94145f2
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/cloudstack/UsageService.go
@@ -0,0 +1,1225 @@
+//
+// Copyright 2018, Sander van Harmelen
+//
+// Licensed 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 cloudstack
+
+import (
+	"encoding/json"
+	"fmt"
+	"net/url"
+	"strconv"
+)
+
+type AddTrafficMonitorParams struct {
+	p map[string]interface{}
+}
+
+func (p *AddTrafficMonitorParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["excludezones"]; found {
+		u.Set("excludezones", v.(string))
+	}
+	if v, found := p.p["includezones"]; found {
+		u.Set("includezones", v.(string))
+	}
+	if v, found := p.p["url"]; found {
+		u.Set("url", v.(string))
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *AddTrafficMonitorParams) SetExcludezones(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["excludezones"] = v
+	return
+}
+
+func (p *AddTrafficMonitorParams) SetIncludezones(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["includezones"] = v
+	return
+}
+
+func (p *AddTrafficMonitorParams) SetUrl(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["url"] = v
+	return
+}
+
+func (p *AddTrafficMonitorParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new AddTrafficMonitorParams instance,
+// as then you are sure you have configured all required params
+func (s *UsageService) NewAddTrafficMonitorParams(url string, zoneid string) *AddTrafficMonitorParams {
+	p := &AddTrafficMonitorParams{}
+	p.p = make(map[string]interface{})
+	p.p["url"] = url
+	p.p["zoneid"] = zoneid
+	return p
+}
+
+// Adds Traffic Monitor Host for Direct Network Usage
+func (s *UsageService) AddTrafficMonitor(p *AddTrafficMonitorParams) (*AddTrafficMonitorResponse, error) {
+	resp, err := s.cs.newRequest("addTrafficMonitor", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r AddTrafficMonitorResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type AddTrafficMonitorResponse struct {
+	Id         string `json:"id"`
+	Ipaddress  string `json:"ipaddress"`
+	Numretries string `json:"numretries"`
+	Timeout    string `json:"timeout"`
+	Zoneid     string `json:"zoneid"`
+}
+
+type AddTrafficTypeParams struct {
+	p map[string]interface{}
+}
+
+func (p *AddTrafficTypeParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["hypervnetworklabel"]; found {
+		u.Set("hypervnetworklabel", v.(string))
+	}
+	if v, found := p.p["isolationmethod"]; found {
+		u.Set("isolationmethod", v.(string))
+	}
+	if v, found := p.p["kvmnetworklabel"]; found {
+		u.Set("kvmnetworklabel", v.(string))
+	}
+	if v, found := p.p["ovm3networklabel"]; found {
+		u.Set("ovm3networklabel", v.(string))
+	}
+	if v, found := p.p["physicalnetworkid"]; found {
+		u.Set("physicalnetworkid", v.(string))
+	}
+	if v, found := p.p["traffictype"]; found {
+		u.Set("traffictype", v.(string))
+	}
+	if v, found := p.p["vlan"]; found {
+		u.Set("vlan", v.(string))
+	}
+	if v, found := p.p["vmwarenetworklabel"]; found {
+		u.Set("vmwarenetworklabel", v.(string))
+	}
+	if v, found := p.p["xennetworklabel"]; found {
+		u.Set("xennetworklabel", v.(string))
+	}
+	return u
+}
+
+func (p *AddTrafficTypeParams) SetHypervnetworklabel(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["hypervnetworklabel"] = v
+	return
+}
+
+func (p *AddTrafficTypeParams) SetIsolationmethod(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isolationmethod"] = v
+	return
+}
+
+func (p *AddTrafficTypeParams) SetKvmnetworklabel(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["kvmnetworklabel"] = v
+	return
+}
+
+func (p *AddTrafficTypeParams) SetOvm3networklabel(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["ovm3networklabel"] = v
+	return
+}
+
+func (p *AddTrafficTypeParams) SetPhysicalnetworkid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["physicalnetworkid"] = v
+	return
+}
+
+func (p *AddTrafficTypeParams) SetTraffictype(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["traffictype"] = v
+	return
+}
+
+func (p *AddTrafficTypeParams) SetVlan(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["vlan"] = v
+	return
+}
+
+func (p *AddTrafficTypeParams) SetVmwarenetworklabel(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["vmwarenetworklabel"] = v
+	return
+}
+
+func (p *AddTrafficTypeParams) SetXennetworklabel(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["xennetworklabel"] = v
+	return
+}
+
+// You should always use this function to get a new AddTrafficTypeParams instance,
+// as then you are sure you have configured all required params
+func (s *UsageService) NewAddTrafficTypeParams(physicalnetworkid string, traffictype string) *AddTrafficTypeParams {
+	p := &AddTrafficTypeParams{}
+	p.p = make(map[string]interface{})
+	p.p["physicalnetworkid"] = physicalnetworkid
+	p.p["traffictype"] = traffictype
+	return p
+}
+
+// Adds traffic type to a physical network
+func (s *UsageService) AddTrafficType(p *AddTrafficTypeParams) (*AddTrafficTypeResponse, error) {
+	resp, err := s.cs.newRequest("addTrafficType", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r AddTrafficTypeResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type AddTrafficTypeResponse struct {
+	JobID              string `json:"jobid"`
+	Hypervnetworklabel string `json:"hypervnetworklabel"`
+	Id                 string `json:"id"`
+	Kvmnetworklabel    string `json:"kvmnetworklabel"`
+	Ovm3networklabel   string `json:"ovm3networklabel"`
+	Physicalnetworkid  string `json:"physicalnetworkid"`
+	Traffictype        string `json:"traffictype"`
+	Vmwarenetworklabel string `json:"vmwarenetworklabel"`
+	Xennetworklabel    string `json:"xennetworklabel"`
+}
+
+type DeleteTrafficMonitorParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeleteTrafficMonitorParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *DeleteTrafficMonitorParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new DeleteTrafficMonitorParams instance,
+// as then you are sure you have configured all required params
+func (s *UsageService) NewDeleteTrafficMonitorParams(id string) *DeleteTrafficMonitorParams {
+	p := &DeleteTrafficMonitorParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Deletes an traffic monitor host.
+func (s *UsageService) DeleteTrafficMonitor(p *DeleteTrafficMonitorParams) (*DeleteTrafficMonitorResponse, error) {
+	resp, err := s.cs.newRequest("deleteTrafficMonitor", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeleteTrafficMonitorResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type DeleteTrafficMonitorResponse struct {
+	Displaytext string `json:"displaytext"`
+	Success     string `json:"success"`
+}
+
+type DeleteTrafficTypeParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeleteTrafficTypeParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *DeleteTrafficTypeParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new DeleteTrafficTypeParams instance,
+// as then you are sure you have configured all required params
+func (s *UsageService) NewDeleteTrafficTypeParams(id string) *DeleteTrafficTypeParams {
+	p := &DeleteTrafficTypeParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Deletes traffic type of a physical network
+func (s *UsageService) DeleteTrafficType(p *DeleteTrafficTypeParams) (*DeleteTrafficTypeResponse, error) {
+	resp, err := s.cs.newRequest("deleteTrafficType", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeleteTrafficTypeResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type DeleteTrafficTypeResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
+
+type GenerateUsageRecordsParams struct {
+	p map[string]interface{}
+}
+
+func (p *GenerateUsageRecordsParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["enddate"]; found {
+		u.Set("enddate", v.(string))
+	}
+	if v, found := p.p["startdate"]; found {
+		u.Set("startdate", v.(string))
+	}
+	return u
+}
+
+func (p *GenerateUsageRecordsParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *GenerateUsageRecordsParams) SetEnddate(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["enddate"] = v
+	return
+}
+
+func (p *GenerateUsageRecordsParams) SetStartdate(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["startdate"] = v
+	return
+}
+
+// You should always use this function to get a new GenerateUsageRecordsParams instance,
+// as then you are sure you have configured all required params
+func (s *UsageService) NewGenerateUsageRecordsParams(enddate string, startdate string) *GenerateUsageRecordsParams {
+	p := &GenerateUsageRecordsParams{}
+	p.p = make(map[string]interface{})
+	p.p["enddate"] = enddate
+	p.p["startdate"] = startdate
+	return p
+}
+
+// Generates usage records. This will generate records only if there any records to be generated, i.e if the scheduled usage job was not run or failed
+func (s *UsageService) GenerateUsageRecords(p *GenerateUsageRecordsParams) (*GenerateUsageRecordsResponse, error) {
+	resp, err := s.cs.newRequest("generateUsageRecords", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r GenerateUsageRecordsResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type GenerateUsageRecordsResponse struct {
+	Displaytext string `json:"displaytext"`
+	Success     string `json:"success"`
+}
+
+type ListTrafficMonitorsParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListTrafficMonitorsParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *ListTrafficMonitorsParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListTrafficMonitorsParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListTrafficMonitorsParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListTrafficMonitorsParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new ListTrafficMonitorsParams instance,
+// as then you are sure you have configured all required params
+func (s *UsageService) NewListTrafficMonitorsParams(zoneid string) *ListTrafficMonitorsParams {
+	p := &ListTrafficMonitorsParams{}
+	p.p = make(map[string]interface{})
+	p.p["zoneid"] = zoneid
+	return p
+}
+
+// List traffic monitor Hosts.
+func (s *UsageService) ListTrafficMonitors(p *ListTrafficMonitorsParams) (*ListTrafficMonitorsResponse, error) {
+	resp, err := s.cs.newRequest("listTrafficMonitors", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListTrafficMonitorsResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListTrafficMonitorsResponse struct {
+	Count           int               `json:"count"`
+	TrafficMonitors []*TrafficMonitor `json:"trafficmonitor"`
+}
+
+type TrafficMonitor struct {
+	Id         string `json:"id"`
+	Ipaddress  string `json:"ipaddress"`
+	Numretries string `json:"numretries"`
+	Timeout    string `json:"timeout"`
+	Zoneid     string `json:"zoneid"`
+}
+
+type ListTrafficTypeImplementorsParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListTrafficTypeImplementorsParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["traffictype"]; found {
+		u.Set("traffictype", v.(string))
+	}
+	return u
+}
+
+func (p *ListTrafficTypeImplementorsParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListTrafficTypeImplementorsParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListTrafficTypeImplementorsParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListTrafficTypeImplementorsParams) SetTraffictype(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["traffictype"] = v
+	return
+}
+
+// You should always use this function to get a new ListTrafficTypeImplementorsParams instance,
+// as then you are sure you have configured all required params
+func (s *UsageService) NewListTrafficTypeImplementorsParams() *ListTrafficTypeImplementorsParams {
+	p := &ListTrafficTypeImplementorsParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// Lists implementors of implementor of a network traffic type or implementors of all network traffic types
+func (s *UsageService) ListTrafficTypeImplementors(p *ListTrafficTypeImplementorsParams) (*ListTrafficTypeImplementorsResponse, error) {
+	resp, err := s.cs.newRequest("listTrafficTypeImplementors", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListTrafficTypeImplementorsResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListTrafficTypeImplementorsResponse struct {
+	Count                   int                       `json:"count"`
+	TrafficTypeImplementors []*TrafficTypeImplementor `json:"traffictypeimplementor"`
+}
+
+type TrafficTypeImplementor struct {
+	Traffictype            string `json:"traffictype"`
+	Traffictypeimplementor string `json:"traffictypeimplementor"`
+}
+
+type ListTrafficTypesParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListTrafficTypesParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["physicalnetworkid"]; found {
+		u.Set("physicalnetworkid", v.(string))
+	}
+	return u
+}
+
+func (p *ListTrafficTypesParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListTrafficTypesParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListTrafficTypesParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListTrafficTypesParams) SetPhysicalnetworkid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["physicalnetworkid"] = v
+	return
+}
+
+// You should always use this function to get a new ListTrafficTypesParams instance,
+// as then you are sure you have configured all required params
+func (s *UsageService) NewListTrafficTypesParams(physicalnetworkid string) *ListTrafficTypesParams {
+	p := &ListTrafficTypesParams{}
+	p.p = make(map[string]interface{})
+	p.p["physicalnetworkid"] = physicalnetworkid
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *UsageService) GetTrafficTypeID(keyword string, physicalnetworkid string, opts ...OptionFunc) (string, int, error) {
+	p := &ListTrafficTypesParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["keyword"] = keyword
+	p.p["physicalnetworkid"] = physicalnetworkid
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return "", -1, err
+		}
+	}
+
+	l, err := s.ListTrafficTypes(p)
+	if err != nil {
+		return "", -1, err
+	}
+
+	if l.Count == 0 {
+		return "", l.Count, fmt.Errorf("No match found for %s: %+v", keyword, l)
+	}
+
+	if l.Count == 1 {
+		return l.TrafficTypes[0].Id, l.Count, nil
+	}
+
+	if l.Count > 1 {
+		for _, v := range l.TrafficTypes {
+			if v.Name == keyword {
+				return v.Id, l.Count, nil
+			}
+		}
+	}
+	return "", l.Count, fmt.Errorf("Could not find an exact match for %s: %+v", keyword, l)
+}
+
+// Lists traffic types of a given physical network.
+func (s *UsageService) ListTrafficTypes(p *ListTrafficTypesParams) (*ListTrafficTypesResponse, error) {
+	resp, err := s.cs.newRequest("listTrafficTypes", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListTrafficTypesResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListTrafficTypesResponse struct {
+	Count        int            `json:"count"`
+	TrafficTypes []*TrafficType `json:"traffictype"`
+}
+
+type TrafficType struct {
+	Canenableindividualservice   bool     `json:"canenableindividualservice"`
+	Destinationphysicalnetworkid string   `json:"destinationphysicalnetworkid"`
+	Id                           string   `json:"id"`
+	Name                         string   `json:"name"`
+	Physicalnetworkid            string   `json:"physicalnetworkid"`
+	Servicelist                  []string `json:"servicelist"`
+	State                        string   `json:"state"`
+}
+
+type ListUsageRecordsParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListUsageRecordsParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["accountid"]; found {
+		u.Set("accountid", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["enddate"]; found {
+		u.Set("enddate", v.(string))
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["projectid"]; found {
+		u.Set("projectid", v.(string))
+	}
+	if v, found := p.p["startdate"]; found {
+		u.Set("startdate", v.(string))
+	}
+	if v, found := p.p["type"]; found {
+		vv := strconv.FormatInt(v.(int64), 10)
+		u.Set("type", vv)
+	}
+	if v, found := p.p["usageid"]; found {
+		u.Set("usageid", v.(string))
+	}
+	return u
+}
+
+func (p *ListUsageRecordsParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *ListUsageRecordsParams) SetAccountid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["accountid"] = v
+	return
+}
+
+func (p *ListUsageRecordsParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *ListUsageRecordsParams) SetEnddate(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["enddate"] = v
+	return
+}
+
+func (p *ListUsageRecordsParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListUsageRecordsParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListUsageRecordsParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListUsageRecordsParams) SetProjectid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectid"] = v
+	return
+}
+
+func (p *ListUsageRecordsParams) SetStartdate(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["startdate"] = v
+	return
+}
+
+func (p *ListUsageRecordsParams) SetType(v int64) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["type"] = v
+	return
+}
+
+func (p *ListUsageRecordsParams) SetUsageid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["usageid"] = v
+	return
+}
+
+// You should always use this function to get a new ListUsageRecordsParams instance,
+// as then you are sure you have configured all required params
+func (s *UsageService) NewListUsageRecordsParams(enddate string, startdate string) *ListUsageRecordsParams {
+	p := &ListUsageRecordsParams{}
+	p.p = make(map[string]interface{})
+	p.p["enddate"] = enddate
+	p.p["startdate"] = startdate
+	return p
+}
+
+// Lists usage records for accounts
+func (s *UsageService) ListUsageRecords(p *ListUsageRecordsParams) (*ListUsageRecordsResponse, error) {
+	resp, err := s.cs.newRequest("listUsageRecords", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListUsageRecordsResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListUsageRecordsResponse struct {
+	Count        int            `json:"count"`
+	UsageRecords []*UsageRecord `json:"usagerecord"`
+}
+
+type UsageRecord struct {
+	Account          string `json:"account"`
+	Accountid        string `json:"accountid"`
+	Cpunumber        int64  `json:"cpunumber"`
+	Cpuspeed         int64  `json:"cpuspeed"`
+	Description      string `json:"description"`
+	Domain           string `json:"domain"`
+	Domainid         string `json:"domainid"`
+	Enddate          string `json:"enddate"`
+	Isdefault        bool   `json:"isdefault"`
+	Issourcenat      bool   `json:"issourcenat"`
+	Issystem         bool   `json:"issystem"`
+	Memory           int64  `json:"memory"`
+	Name             string `json:"name"`
+	Networkid        string `json:"networkid"`
+	Offeringid       string `json:"offeringid"`
+	Project          string `json:"project"`
+	Projectid        string `json:"projectid"`
+	Rawusage         string `json:"rawusage"`
+	Size             int64  `json:"size"`
+	Startdate        string `json:"startdate"`
+	Templateid       string `json:"templateid"`
+	Type             string `json:"type"`
+	Usage            string `json:"usage"`
+	Usageid          string `json:"usageid"`
+	Usagetype        int    `json:"usagetype"`
+	Virtualmachineid string `json:"virtualmachineid"`
+	Virtualsize      int64  `json:"virtualsize"`
+	Zoneid           string `json:"zoneid"`
+}
+
+type ListUsageTypesParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListUsageTypesParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	return u
+}
+
+// You should always use this function to get a new ListUsageTypesParams instance,
+// as then you are sure you have configured all required params
+func (s *UsageService) NewListUsageTypesParams() *ListUsageTypesParams {
+	p := &ListUsageTypesParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// List Usage Types
+func (s *UsageService) ListUsageTypes(p *ListUsageTypesParams) (*ListUsageTypesResponse, error) {
+	resp, err := s.cs.newRequest("listUsageTypes", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListUsageTypesResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListUsageTypesResponse struct {
+	Count      int          `json:"count"`
+	UsageTypes []*UsageType `json:"usagetype"`
+}
+
+type UsageType struct {
+	Description string `json:"description"`
+	Usagetypeid int    `json:"usagetypeid"`
+}
+
+type RemoveRawUsageRecordsParams struct {
+	p map[string]interface{}
+}
+
+func (p *RemoveRawUsageRecordsParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["interval"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("interval", vv)
+	}
+	return u
+}
+
+func (p *RemoveRawUsageRecordsParams) SetInterval(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["interval"] = v
+	return
+}
+
+// You should always use this function to get a new RemoveRawUsageRecordsParams instance,
+// as then you are sure you have configured all required params
+func (s *UsageService) NewRemoveRawUsageRecordsParams(interval int) *RemoveRawUsageRecordsParams {
+	p := &RemoveRawUsageRecordsParams{}
+	p.p = make(map[string]interface{})
+	p.p["interval"] = interval
+	return p
+}
+
+// Safely removes raw records from cloud_usage table
+func (s *UsageService) RemoveRawUsageRecords(p *RemoveRawUsageRecordsParams) (*RemoveRawUsageRecordsResponse, error) {
+	resp, err := s.cs.newRequest("removeRawUsageRecords", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r RemoveRawUsageRecordsResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type RemoveRawUsageRecordsResponse struct {
+	Displaytext string `json:"displaytext"`
+	Success     string `json:"success"`
+}
+
+type UpdateTrafficTypeParams struct {
+	p map[string]interface{}
+}
+
+func (p *UpdateTrafficTypeParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["hypervnetworklabel"]; found {
+		u.Set("hypervnetworklabel", v.(string))
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["kvmnetworklabel"]; found {
+		u.Set("kvmnetworklabel", v.(string))
+	}
+	if v, found := p.p["ovm3networklabel"]; found {
+		u.Set("ovm3networklabel", v.(string))
+	}
+	if v, found := p.p["vmwarenetworklabel"]; found {
+		u.Set("vmwarenetworklabel", v.(string))
+	}
+	if v, found := p.p["xennetworklabel"]; found {
+		u.Set("xennetworklabel", v.(string))
+	}
+	return u
+}
+
+func (p *UpdateTrafficTypeParams) SetHypervnetworklabel(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["hypervnetworklabel"] = v
+	return
+}
+
+func (p *UpdateTrafficTypeParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *UpdateTrafficTypeParams) SetKvmnetworklabel(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["kvmnetworklabel"] = v
+	return
+}
+
+func (p *UpdateTrafficTypeParams) SetOvm3networklabel(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["ovm3networklabel"] = v
+	return
+}
+
+func (p *UpdateTrafficTypeParams) SetVmwarenetworklabel(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["vmwarenetworklabel"] = v
+	return
+}
+
+func (p *UpdateTrafficTypeParams) SetXennetworklabel(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["xennetworklabel"] = v
+	return
+}
+
+// You should always use this function to get a new UpdateTrafficTypeParams instance,
+// as then you are sure you have configured all required params
+func (s *UsageService) NewUpdateTrafficTypeParams(id string) *UpdateTrafficTypeParams {
+	p := &UpdateTrafficTypeParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Updates traffic type of a physical network
+func (s *UsageService) UpdateTrafficType(p *UpdateTrafficTypeParams) (*UpdateTrafficTypeResponse, error) {
+	resp, err := s.cs.newRequest("updateTrafficType", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r UpdateTrafficTypeResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type UpdateTrafficTypeResponse struct {
+	JobID              string `json:"jobid"`
+	Hypervnetworklabel string `json:"hypervnetworklabel"`
+	Id                 string `json:"id"`
+	Kvmnetworklabel    string `json:"kvmnetworklabel"`
+	Ovm3networklabel   string `json:"ovm3networklabel"`
+	Physicalnetworkid  string `json:"physicalnetworkid"`
+	Traffictype        string `json:"traffictype"`
+	Vmwarenetworklabel string `json:"vmwarenetworklabel"`
+	Xennetworklabel    string `json:"xennetworklabel"`
+}
diff --git a/vendor/github.com/xanzy/go-cloudstack/cloudstack/UserService.go b/vendor/github.com/xanzy/go-cloudstack/cloudstack/UserService.go
new file mode 100644
index 0000000..e70000c
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/cloudstack/UserService.go
@@ -0,0 +1,1033 @@
+//
+// Copyright 2018, Sander van Harmelen
+//
+// Licensed 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 cloudstack
+
+import (
+	"encoding/json"
+	"fmt"
+	"net/url"
+	"strconv"
+	"strings"
+)
+
+type CreateUserParams struct {
+	p map[string]interface{}
+}
+
+func (p *CreateUserParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["email"]; found {
+		u.Set("email", v.(string))
+	}
+	if v, found := p.p["firstname"]; found {
+		u.Set("firstname", v.(string))
+	}
+	if v, found := p.p["lastname"]; found {
+		u.Set("lastname", v.(string))
+	}
+	if v, found := p.p["password"]; found {
+		u.Set("password", v.(string))
+	}
+	if v, found := p.p["timezone"]; found {
+		u.Set("timezone", v.(string))
+	}
+	if v, found := p.p["userid"]; found {
+		u.Set("userid", v.(string))
+	}
+	if v, found := p.p["username"]; found {
+		u.Set("username", v.(string))
+	}
+	return u
+}
+
+func (p *CreateUserParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *CreateUserParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *CreateUserParams) SetEmail(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["email"] = v
+	return
+}
+
+func (p *CreateUserParams) SetFirstname(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["firstname"] = v
+	return
+}
+
+func (p *CreateUserParams) SetLastname(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["lastname"] = v
+	return
+}
+
+func (p *CreateUserParams) SetPassword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["password"] = v
+	return
+}
+
+func (p *CreateUserParams) SetTimezone(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["timezone"] = v
+	return
+}
+
+func (p *CreateUserParams) SetUserid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["userid"] = v
+	return
+}
+
+func (p *CreateUserParams) SetUsername(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["username"] = v
+	return
+}
+
+// You should always use this function to get a new CreateUserParams instance,
+// as then you are sure you have configured all required params
+func (s *UserService) NewCreateUserParams(account string, email string, firstname string, lastname string, password string, username string) *CreateUserParams {
+	p := &CreateUserParams{}
+	p.p = make(map[string]interface{})
+	p.p["account"] = account
+	p.p["email"] = email
+	p.p["firstname"] = firstname
+	p.p["lastname"] = lastname
+	p.p["password"] = password
+	p.p["username"] = username
+	return p
+}
+
+// Creates a user for an account that already exists
+func (s *UserService) CreateUser(p *CreateUserParams) (*CreateUserResponse, error) {
+	resp, err := s.cs.newRequest("createUser", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	if resp, err = getRawValue(resp); err != nil {
+		return nil, err
+	}
+
+	var r CreateUserResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type CreateUserResponse struct {
+	Account             string `json:"account"`
+	Accountid           string `json:"accountid"`
+	Accounttype         int    `json:"accounttype"`
+	Apikey              string `json:"apikey"`
+	Created             string `json:"created"`
+	Domain              string `json:"domain"`
+	Domainid            string `json:"domainid"`
+	Email               string `json:"email"`
+	Firstname           string `json:"firstname"`
+	Id                  string `json:"id"`
+	Iscallerchilddomain bool   `json:"iscallerchilddomain"`
+	Isdefault           bool   `json:"isdefault"`
+	Lastname            string `json:"lastname"`
+	Roleid              string `json:"roleid"`
+	Rolename            string `json:"rolename"`
+	Roletype            string `json:"roletype"`
+	Secretkey           string `json:"secretkey"`
+	State               string `json:"state"`
+	Timezone            string `json:"timezone"`
+	Username            string `json:"username"`
+}
+
+type DeleteUserParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeleteUserParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *DeleteUserParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new DeleteUserParams instance,
+// as then you are sure you have configured all required params
+func (s *UserService) NewDeleteUserParams(id string) *DeleteUserParams {
+	p := &DeleteUserParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Deletes a user for an account
+func (s *UserService) DeleteUser(p *DeleteUserParams) (*DeleteUserResponse, error) {
+	resp, err := s.cs.newRequest("deleteUser", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeleteUserResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type DeleteUserResponse struct {
+	Displaytext string `json:"displaytext"`
+	Success     string `json:"success"`
+}
+
+type DisableUserParams struct {
+	p map[string]interface{}
+}
+
+func (p *DisableUserParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *DisableUserParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new DisableUserParams instance,
+// as then you are sure you have configured all required params
+func (s *UserService) NewDisableUserParams(id string) *DisableUserParams {
+	p := &DisableUserParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Disables a user account
+func (s *UserService) DisableUser(p *DisableUserParams) (*DisableUserResponse, error) {
+	resp, err := s.cs.newRequest("disableUser", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DisableUserResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type DisableUserResponse struct {
+	JobID               string `json:"jobid"`
+	Account             string `json:"account"`
+	Accountid           string `json:"accountid"`
+	Accounttype         int    `json:"accounttype"`
+	Apikey              string `json:"apikey"`
+	Created             string `json:"created"`
+	Domain              string `json:"domain"`
+	Domainid            string `json:"domainid"`
+	Email               string `json:"email"`
+	Firstname           string `json:"firstname"`
+	Id                  string `json:"id"`
+	Iscallerchilddomain bool   `json:"iscallerchilddomain"`
+	Isdefault           bool   `json:"isdefault"`
+	Lastname            string `json:"lastname"`
+	Roleid              string `json:"roleid"`
+	Rolename            string `json:"rolename"`
+	Roletype            string `json:"roletype"`
+	Secretkey           string `json:"secretkey"`
+	State               string `json:"state"`
+	Timezone            string `json:"timezone"`
+	Username            string `json:"username"`
+}
+
+type EnableUserParams struct {
+	p map[string]interface{}
+}
+
+func (p *EnableUserParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *EnableUserParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new EnableUserParams instance,
+// as then you are sure you have configured all required params
+func (s *UserService) NewEnableUserParams(id string) *EnableUserParams {
+	p := &EnableUserParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Enables a user account
+func (s *UserService) EnableUser(p *EnableUserParams) (*EnableUserResponse, error) {
+	resp, err := s.cs.newRequest("enableUser", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r EnableUserResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type EnableUserResponse struct {
+	Account             string `json:"account"`
+	Accountid           string `json:"accountid"`
+	Accounttype         int    `json:"accounttype"`
+	Apikey              string `json:"apikey"`
+	Created             string `json:"created"`
+	Domain              string `json:"domain"`
+	Domainid            string `json:"domainid"`
+	Email               string `json:"email"`
+	Firstname           string `json:"firstname"`
+	Id                  string `json:"id"`
+	Iscallerchilddomain bool   `json:"iscallerchilddomain"`
+	Isdefault           bool   `json:"isdefault"`
+	Lastname            string `json:"lastname"`
+	Roleid              string `json:"roleid"`
+	Rolename            string `json:"rolename"`
+	Roletype            string `json:"roletype"`
+	Secretkey           string `json:"secretkey"`
+	State               string `json:"state"`
+	Timezone            string `json:"timezone"`
+	Username            string `json:"username"`
+}
+
+type GetUserParams struct {
+	p map[string]interface{}
+}
+
+func (p *GetUserParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["userapikey"]; found {
+		u.Set("userapikey", v.(string))
+	}
+	return u
+}
+
+func (p *GetUserParams) SetUserapikey(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["userapikey"] = v
+	return
+}
+
+// You should always use this function to get a new GetUserParams instance,
+// as then you are sure you have configured all required params
+func (s *UserService) NewGetUserParams(userapikey string) *GetUserParams {
+	p := &GetUserParams{}
+	p.p = make(map[string]interface{})
+	p.p["userapikey"] = userapikey
+	return p
+}
+
+// Find user account by API key
+func (s *UserService) GetUser(p *GetUserParams) (*GetUserResponse, error) {
+	resp, err := s.cs.newRequest("getUser", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r GetUserResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type GetUserResponse struct {
+	Account             string `json:"account"`
+	Accountid           string `json:"accountid"`
+	Accounttype         int    `json:"accounttype"`
+	Apikey              string `json:"apikey"`
+	Created             string `json:"created"`
+	Domain              string `json:"domain"`
+	Domainid            string `json:"domainid"`
+	Email               string `json:"email"`
+	Firstname           string `json:"firstname"`
+	Id                  string `json:"id"`
+	Iscallerchilddomain bool   `json:"iscallerchilddomain"`
+	Isdefault           bool   `json:"isdefault"`
+	Lastname            string `json:"lastname"`
+	Roleid              string `json:"roleid"`
+	Rolename            string `json:"rolename"`
+	Roletype            string `json:"roletype"`
+	Secretkey           string `json:"secretkey"`
+	State               string `json:"state"`
+	Timezone            string `json:"timezone"`
+	Username            string `json:"username"`
+}
+
+type GetVirtualMachineUserDataParams struct {
+	p map[string]interface{}
+}
+
+func (p *GetVirtualMachineUserDataParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["virtualmachineid"]; found {
+		u.Set("virtualmachineid", v.(string))
+	}
+	return u
+}
+
+func (p *GetVirtualMachineUserDataParams) SetVirtualmachineid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["virtualmachineid"] = v
+	return
+}
+
+// You should always use this function to get a new GetVirtualMachineUserDataParams instance,
+// as then you are sure you have configured all required params
+func (s *UserService) NewGetVirtualMachineUserDataParams(virtualmachineid string) *GetVirtualMachineUserDataParams {
+	p := &GetVirtualMachineUserDataParams{}
+	p.p = make(map[string]interface{})
+	p.p["virtualmachineid"] = virtualmachineid
+	return p
+}
+
+// Returns user data associated with the VM
+func (s *UserService) GetVirtualMachineUserData(p *GetVirtualMachineUserDataParams) (*GetVirtualMachineUserDataResponse, error) {
+	resp, err := s.cs.newRequest("getVirtualMachineUserData", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r GetVirtualMachineUserDataResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type GetVirtualMachineUserDataResponse struct {
+	Userdata         string `json:"userdata"`
+	Virtualmachineid string `json:"virtualmachineid"`
+}
+
+type ListUsersParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListUsersParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["accounttype"]; found {
+		vv := strconv.FormatInt(v.(int64), 10)
+		u.Set("accounttype", vv)
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["isrecursive"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("isrecursive", vv)
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["listall"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("listall", vv)
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["state"]; found {
+		u.Set("state", v.(string))
+	}
+	if v, found := p.p["username"]; found {
+		u.Set("username", v.(string))
+	}
+	return u
+}
+
+func (p *ListUsersParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *ListUsersParams) SetAccounttype(v int64) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["accounttype"] = v
+	return
+}
+
+func (p *ListUsersParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *ListUsersParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ListUsersParams) SetIsrecursive(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isrecursive"] = v
+	return
+}
+
+func (p *ListUsersParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListUsersParams) SetListall(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["listall"] = v
+	return
+}
+
+func (p *ListUsersParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListUsersParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListUsersParams) SetState(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["state"] = v
+	return
+}
+
+func (p *ListUsersParams) SetUsername(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["username"] = v
+	return
+}
+
+// You should always use this function to get a new ListUsersParams instance,
+// as then you are sure you have configured all required params
+func (s *UserService) NewListUsersParams() *ListUsersParams {
+	p := &ListUsersParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *UserService) GetUserByID(id string, opts ...OptionFunc) (*User, int, error) {
+	p := &ListUsersParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["id"] = id
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return nil, -1, err
+		}
+	}
+
+	l, err := s.ListUsers(p)
+	if err != nil {
+		if strings.Contains(err.Error(), fmt.Sprintf(
+			"Invalid parameter id value=%s due to incorrect long value format, "+
+				"or entity does not exist", id)) {
+			return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
+		}
+		return nil, -1, err
+	}
+
+	if l.Count == 0 {
+		return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
+	}
+
+	if l.Count == 1 {
+		return l.Users[0], l.Count, nil
+	}
+	return nil, l.Count, fmt.Errorf("There is more then one result for User UUID: %s!", id)
+}
+
+// Lists user accounts
+func (s *UserService) ListUsers(p *ListUsersParams) (*ListUsersResponse, error) {
+	resp, err := s.cs.newRequest("listUsers", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListUsersResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListUsersResponse struct {
+	Count int     `json:"count"`
+	Users []*User `json:"user"`
+}
+
+type User struct {
+	Account             string `json:"account"`
+	Accountid           string `json:"accountid"`
+	Accounttype         int    `json:"accounttype"`
+	Apikey              string `json:"apikey"`
+	Created             string `json:"created"`
+	Domain              string `json:"domain"`
+	Domainid            string `json:"domainid"`
+	Email               string `json:"email"`
+	Firstname           string `json:"firstname"`
+	Id                  string `json:"id"`
+	Iscallerchilddomain bool   `json:"iscallerchilddomain"`
+	Isdefault           bool   `json:"isdefault"`
+	Lastname            string `json:"lastname"`
+	Roleid              string `json:"roleid"`
+	Rolename            string `json:"rolename"`
+	Roletype            string `json:"roletype"`
+	Secretkey           string `json:"secretkey"`
+	State               string `json:"state"`
+	Timezone            string `json:"timezone"`
+	Username            string `json:"username"`
+}
+
+type LockUserParams struct {
+	p map[string]interface{}
+}
+
+func (p *LockUserParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *LockUserParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new LockUserParams instance,
+// as then you are sure you have configured all required params
+func (s *UserService) NewLockUserParams(id string) *LockUserParams {
+	p := &LockUserParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Locks a user account
+func (s *UserService) LockUser(p *LockUserParams) (*LockUserResponse, error) {
+	resp, err := s.cs.newRequest("lockUser", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r LockUserResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type LockUserResponse struct {
+	Account             string `json:"account"`
+	Accountid           string `json:"accountid"`
+	Accounttype         int    `json:"accounttype"`
+	Apikey              string `json:"apikey"`
+	Created             string `json:"created"`
+	Domain              string `json:"domain"`
+	Domainid            string `json:"domainid"`
+	Email               string `json:"email"`
+	Firstname           string `json:"firstname"`
+	Id                  string `json:"id"`
+	Iscallerchilddomain bool   `json:"iscallerchilddomain"`
+	Isdefault           bool   `json:"isdefault"`
+	Lastname            string `json:"lastname"`
+	Roleid              string `json:"roleid"`
+	Rolename            string `json:"rolename"`
+	Roletype            string `json:"roletype"`
+	Secretkey           string `json:"secretkey"`
+	State               string `json:"state"`
+	Timezone            string `json:"timezone"`
+	Username            string `json:"username"`
+}
+
+type RegisterUserKeysParams struct {
+	p map[string]interface{}
+}
+
+func (p *RegisterUserKeysParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *RegisterUserKeysParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new RegisterUserKeysParams instance,
+// as then you are sure you have configured all required params
+func (s *UserService) NewRegisterUserKeysParams(id string) *RegisterUserKeysParams {
+	p := &RegisterUserKeysParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// This command allows a user to register for the developer API, returning a secret key and an API key. This request is made through the integration API port, so it is a privileged command and must be made on behalf of a user. It is up to the implementer just how the username and password are entered, and then how that translates to an integration API request. Both secret key and API key should be returned to the user
+func (s *UserService) RegisterUserKeys(p *RegisterUserKeysParams) (*RegisterUserKeysResponse, error) {
+	resp, err := s.cs.newRequest("registerUserKeys", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	if resp, err = getRawValue(resp); err != nil {
+		return nil, err
+	}
+
+	var r RegisterUserKeysResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type RegisterUserKeysResponse struct {
+	Apikey    string `json:"apikey"`
+	Secretkey string `json:"secretkey"`
+}
+
+type UpdateUserParams struct {
+	p map[string]interface{}
+}
+
+func (p *UpdateUserParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["email"]; found {
+		u.Set("email", v.(string))
+	}
+	if v, found := p.p["firstname"]; found {
+		u.Set("firstname", v.(string))
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["lastname"]; found {
+		u.Set("lastname", v.(string))
+	}
+	if v, found := p.p["password"]; found {
+		u.Set("password", v.(string))
+	}
+	if v, found := p.p["timezone"]; found {
+		u.Set("timezone", v.(string))
+	}
+	if v, found := p.p["userapikey"]; found {
+		u.Set("userapikey", v.(string))
+	}
+	if v, found := p.p["username"]; found {
+		u.Set("username", v.(string))
+	}
+	if v, found := p.p["usersecretkey"]; found {
+		u.Set("usersecretkey", v.(string))
+	}
+	return u
+}
+
+func (p *UpdateUserParams) SetEmail(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["email"] = v
+	return
+}
+
+func (p *UpdateUserParams) SetFirstname(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["firstname"] = v
+	return
+}
+
+func (p *UpdateUserParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *UpdateUserParams) SetLastname(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["lastname"] = v
+	return
+}
+
+func (p *UpdateUserParams) SetPassword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["password"] = v
+	return
+}
+
+func (p *UpdateUserParams) SetTimezone(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["timezone"] = v
+	return
+}
+
+func (p *UpdateUserParams) SetUserapikey(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["userapikey"] = v
+	return
+}
+
+func (p *UpdateUserParams) SetUsername(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["username"] = v
+	return
+}
+
+func (p *UpdateUserParams) SetUsersecretkey(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["usersecretkey"] = v
+	return
+}
+
+// You should always use this function to get a new UpdateUserParams instance,
+// as then you are sure you have configured all required params
+func (s *UserService) NewUpdateUserParams(id string) *UpdateUserParams {
+	p := &UpdateUserParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Updates a user account
+func (s *UserService) UpdateUser(p *UpdateUserParams) (*UpdateUserResponse, error) {
+	resp, err := s.cs.newRequest("updateUser", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r UpdateUserResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type UpdateUserResponse struct {
+	Account             string `json:"account"`
+	Accountid           string `json:"accountid"`
+	Accounttype         int    `json:"accounttype"`
+	Apikey              string `json:"apikey"`
+	Created             string `json:"created"`
+	Domain              string `json:"domain"`
+	Domainid            string `json:"domainid"`
+	Email               string `json:"email"`
+	Firstname           string `json:"firstname"`
+	Id                  string `json:"id"`
+	Iscallerchilddomain bool   `json:"iscallerchilddomain"`
+	Isdefault           bool   `json:"isdefault"`
+	Lastname            string `json:"lastname"`
+	Roleid              string `json:"roleid"`
+	Rolename            string `json:"rolename"`
+	Roletype            string `json:"roletype"`
+	Secretkey           string `json:"secretkey"`
+	State               string `json:"state"`
+	Timezone            string `json:"timezone"`
+	Username            string `json:"username"`
+}
diff --git a/vendor/github.com/xanzy/go-cloudstack/cloudstack/VLANService.go b/vendor/github.com/xanzy/go-cloudstack/cloudstack/VLANService.go
new file mode 100644
index 0000000..6f306e7
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/cloudstack/VLANService.go
@@ -0,0 +1,938 @@
+//
+// Copyright 2018, Sander van Harmelen
+//
+// Licensed 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 cloudstack
+
+import (
+	"encoding/json"
+	"fmt"
+	"net/url"
+	"strconv"
+	"strings"
+)
+
+type CreateVlanIpRangeParams struct {
+	p map[string]interface{}
+}
+
+func (p *CreateVlanIpRangeParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["endip"]; found {
+		u.Set("endip", v.(string))
+	}
+	if v, found := p.p["endipv6"]; found {
+		u.Set("endipv6", v.(string))
+	}
+	if v, found := p.p["forvirtualnetwork"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("forvirtualnetwork", vv)
+	}
+	if v, found := p.p["gateway"]; found {
+		u.Set("gateway", v.(string))
+	}
+	if v, found := p.p["ip6cidr"]; found {
+		u.Set("ip6cidr", v.(string))
+	}
+	if v, found := p.p["ip6gateway"]; found {
+		u.Set("ip6gateway", v.(string))
+	}
+	if v, found := p.p["netmask"]; found {
+		u.Set("netmask", v.(string))
+	}
+	if v, found := p.p["networkid"]; found {
+		u.Set("networkid", v.(string))
+	}
+	if v, found := p.p["physicalnetworkid"]; found {
+		u.Set("physicalnetworkid", v.(string))
+	}
+	if v, found := p.p["podid"]; found {
+		u.Set("podid", v.(string))
+	}
+	if v, found := p.p["projectid"]; found {
+		u.Set("projectid", v.(string))
+	}
+	if v, found := p.p["startip"]; found {
+		u.Set("startip", v.(string))
+	}
+	if v, found := p.p["startipv6"]; found {
+		u.Set("startipv6", v.(string))
+	}
+	if v, found := p.p["vlan"]; found {
+		u.Set("vlan", v.(string))
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *CreateVlanIpRangeParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *CreateVlanIpRangeParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *CreateVlanIpRangeParams) SetEndip(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["endip"] = v
+	return
+}
+
+func (p *CreateVlanIpRangeParams) SetEndipv6(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["endipv6"] = v
+	return
+}
+
+func (p *CreateVlanIpRangeParams) SetForvirtualnetwork(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["forvirtualnetwork"] = v
+	return
+}
+
+func (p *CreateVlanIpRangeParams) SetGateway(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["gateway"] = v
+	return
+}
+
+func (p *CreateVlanIpRangeParams) SetIp6cidr(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["ip6cidr"] = v
+	return
+}
+
+func (p *CreateVlanIpRangeParams) SetIp6gateway(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["ip6gateway"] = v
+	return
+}
+
+func (p *CreateVlanIpRangeParams) SetNetmask(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["netmask"] = v
+	return
+}
+
+func (p *CreateVlanIpRangeParams) SetNetworkid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["networkid"] = v
+	return
+}
+
+func (p *CreateVlanIpRangeParams) SetPhysicalnetworkid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["physicalnetworkid"] = v
+	return
+}
+
+func (p *CreateVlanIpRangeParams) SetPodid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["podid"] = v
+	return
+}
+
+func (p *CreateVlanIpRangeParams) SetProjectid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectid"] = v
+	return
+}
+
+func (p *CreateVlanIpRangeParams) SetStartip(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["startip"] = v
+	return
+}
+
+func (p *CreateVlanIpRangeParams) SetStartipv6(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["startipv6"] = v
+	return
+}
+
+func (p *CreateVlanIpRangeParams) SetVlan(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["vlan"] = v
+	return
+}
+
+func (p *CreateVlanIpRangeParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new CreateVlanIpRangeParams instance,
+// as then you are sure you have configured all required params
+func (s *VLANService) NewCreateVlanIpRangeParams() *CreateVlanIpRangeParams {
+	p := &CreateVlanIpRangeParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// Creates a VLAN IP range.
+func (s *VLANService) CreateVlanIpRange(p *CreateVlanIpRangeParams) (*CreateVlanIpRangeResponse, error) {
+	resp, err := s.cs.newRequest("createVlanIpRange", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r CreateVlanIpRangeResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type CreateVlanIpRangeResponse struct {
+	Account           string `json:"account"`
+	Description       string `json:"description"`
+	Domain            string `json:"domain"`
+	Domainid          string `json:"domainid"`
+	Endip             string `json:"endip"`
+	Endipv6           string `json:"endipv6"`
+	Forvirtualnetwork bool   `json:"forvirtualnetwork"`
+	Gateway           string `json:"gateway"`
+	Id                string `json:"id"`
+	Ip6cidr           string `json:"ip6cidr"`
+	Ip6gateway        string `json:"ip6gateway"`
+	Netmask           string `json:"netmask"`
+	Networkid         string `json:"networkid"`
+	Physicalnetworkid string `json:"physicalnetworkid"`
+	Podid             string `json:"podid"`
+	Podname           string `json:"podname"`
+	Project           string `json:"project"`
+	Projectid         string `json:"projectid"`
+	Startip           string `json:"startip"`
+	Startipv6         string `json:"startipv6"`
+	Vlan              string `json:"vlan"`
+	Zoneid            string `json:"zoneid"`
+}
+
+type DedicateGuestVlanRangeParams struct {
+	p map[string]interface{}
+}
+
+func (p *DedicateGuestVlanRangeParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["physicalnetworkid"]; found {
+		u.Set("physicalnetworkid", v.(string))
+	}
+	if v, found := p.p["projectid"]; found {
+		u.Set("projectid", v.(string))
+	}
+	if v, found := p.p["vlanrange"]; found {
+		u.Set("vlanrange", v.(string))
+	}
+	return u
+}
+
+func (p *DedicateGuestVlanRangeParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *DedicateGuestVlanRangeParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *DedicateGuestVlanRangeParams) SetPhysicalnetworkid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["physicalnetworkid"] = v
+	return
+}
+
+func (p *DedicateGuestVlanRangeParams) SetProjectid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectid"] = v
+	return
+}
+
+func (p *DedicateGuestVlanRangeParams) SetVlanrange(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["vlanrange"] = v
+	return
+}
+
+// You should always use this function to get a new DedicateGuestVlanRangeParams instance,
+// as then you are sure you have configured all required params
+func (s *VLANService) NewDedicateGuestVlanRangeParams(physicalnetworkid string, vlanrange string) *DedicateGuestVlanRangeParams {
+	p := &DedicateGuestVlanRangeParams{}
+	p.p = make(map[string]interface{})
+	p.p["physicalnetworkid"] = physicalnetworkid
+	p.p["vlanrange"] = vlanrange
+	return p
+}
+
+// Dedicates a guest vlan range to an account
+func (s *VLANService) DedicateGuestVlanRange(p *DedicateGuestVlanRangeParams) (*DedicateGuestVlanRangeResponse, error) {
+	resp, err := s.cs.newRequest("dedicateGuestVlanRange", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DedicateGuestVlanRangeResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type DedicateGuestVlanRangeResponse struct {
+	Account           string `json:"account"`
+	Domain            string `json:"domain"`
+	Domainid          string `json:"domainid"`
+	Guestvlanrange    string `json:"guestvlanrange"`
+	Id                string `json:"id"`
+	Physicalnetworkid int64  `json:"physicalnetworkid"`
+	Project           string `json:"project"`
+	Projectid         string `json:"projectid"`
+	Zoneid            int64  `json:"zoneid"`
+}
+
+type DeleteVlanIpRangeParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeleteVlanIpRangeParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *DeleteVlanIpRangeParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new DeleteVlanIpRangeParams instance,
+// as then you are sure you have configured all required params
+func (s *VLANService) NewDeleteVlanIpRangeParams(id string) *DeleteVlanIpRangeParams {
+	p := &DeleteVlanIpRangeParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Creates a VLAN IP range.
+func (s *VLANService) DeleteVlanIpRange(p *DeleteVlanIpRangeParams) (*DeleteVlanIpRangeResponse, error) {
+	resp, err := s.cs.newRequest("deleteVlanIpRange", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeleteVlanIpRangeResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type DeleteVlanIpRangeResponse struct {
+	Displaytext string `json:"displaytext"`
+	Success     string `json:"success"`
+}
+
+type ListDedicatedGuestVlanRangesParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListDedicatedGuestVlanRangesParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["guestvlanrange"]; found {
+		u.Set("guestvlanrange", v.(string))
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["physicalnetworkid"]; found {
+		u.Set("physicalnetworkid", v.(string))
+	}
+	if v, found := p.p["projectid"]; found {
+		u.Set("projectid", v.(string))
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *ListDedicatedGuestVlanRangesParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *ListDedicatedGuestVlanRangesParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *ListDedicatedGuestVlanRangesParams) SetGuestvlanrange(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["guestvlanrange"] = v
+	return
+}
+
+func (p *ListDedicatedGuestVlanRangesParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ListDedicatedGuestVlanRangesParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListDedicatedGuestVlanRangesParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListDedicatedGuestVlanRangesParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListDedicatedGuestVlanRangesParams) SetPhysicalnetworkid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["physicalnetworkid"] = v
+	return
+}
+
+func (p *ListDedicatedGuestVlanRangesParams) SetProjectid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectid"] = v
+	return
+}
+
+func (p *ListDedicatedGuestVlanRangesParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new ListDedicatedGuestVlanRangesParams instance,
+// as then you are sure you have configured all required params
+func (s *VLANService) NewListDedicatedGuestVlanRangesParams() *ListDedicatedGuestVlanRangesParams {
+	p := &ListDedicatedGuestVlanRangesParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *VLANService) GetDedicatedGuestVlanRangeByID(id string, opts ...OptionFunc) (*DedicatedGuestVlanRange, int, error) {
+	p := &ListDedicatedGuestVlanRangesParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["id"] = id
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return nil, -1, err
+		}
+	}
+
+	l, err := s.ListDedicatedGuestVlanRanges(p)
+	if err != nil {
+		if strings.Contains(err.Error(), fmt.Sprintf(
+			"Invalid parameter id value=%s due to incorrect long value format, "+
+				"or entity does not exist", id)) {
+			return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
+		}
+		return nil, -1, err
+	}
+
+	if l.Count == 0 {
+		return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
+	}
+
+	if l.Count == 1 {
+		return l.DedicatedGuestVlanRanges[0], l.Count, nil
+	}
+	return nil, l.Count, fmt.Errorf("There is more then one result for DedicatedGuestVlanRange UUID: %s!", id)
+}
+
+// Lists dedicated guest vlan ranges
+func (s *VLANService) ListDedicatedGuestVlanRanges(p *ListDedicatedGuestVlanRangesParams) (*ListDedicatedGuestVlanRangesResponse, error) {
+	resp, err := s.cs.newRequest("listDedicatedGuestVlanRanges", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListDedicatedGuestVlanRangesResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListDedicatedGuestVlanRangesResponse struct {
+	Count                    int                        `json:"count"`
+	DedicatedGuestVlanRanges []*DedicatedGuestVlanRange `json:"dedicatedguestvlanrange"`
+}
+
+type DedicatedGuestVlanRange struct {
+	Account           string `json:"account"`
+	Domain            string `json:"domain"`
+	Domainid          string `json:"domainid"`
+	Guestvlanrange    string `json:"guestvlanrange"`
+	Id                string `json:"id"`
+	Physicalnetworkid int64  `json:"physicalnetworkid"`
+	Project           string `json:"project"`
+	Projectid         string `json:"projectid"`
+	Zoneid            int64  `json:"zoneid"`
+}
+
+type ListVlanIpRangesParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListVlanIpRangesParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["forvirtualnetwork"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("forvirtualnetwork", vv)
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["networkid"]; found {
+		u.Set("networkid", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["physicalnetworkid"]; found {
+		u.Set("physicalnetworkid", v.(string))
+	}
+	if v, found := p.p["podid"]; found {
+		u.Set("podid", v.(string))
+	}
+	if v, found := p.p["projectid"]; found {
+		u.Set("projectid", v.(string))
+	}
+	if v, found := p.p["vlan"]; found {
+		u.Set("vlan", v.(string))
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *ListVlanIpRangesParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *ListVlanIpRangesParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *ListVlanIpRangesParams) SetForvirtualnetwork(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["forvirtualnetwork"] = v
+	return
+}
+
+func (p *ListVlanIpRangesParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ListVlanIpRangesParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListVlanIpRangesParams) SetNetworkid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["networkid"] = v
+	return
+}
+
+func (p *ListVlanIpRangesParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListVlanIpRangesParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListVlanIpRangesParams) SetPhysicalnetworkid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["physicalnetworkid"] = v
+	return
+}
+
+func (p *ListVlanIpRangesParams) SetPodid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["podid"] = v
+	return
+}
+
+func (p *ListVlanIpRangesParams) SetProjectid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectid"] = v
+	return
+}
+
+func (p *ListVlanIpRangesParams) SetVlan(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["vlan"] = v
+	return
+}
+
+func (p *ListVlanIpRangesParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new ListVlanIpRangesParams instance,
+// as then you are sure you have configured all required params
+func (s *VLANService) NewListVlanIpRangesParams() *ListVlanIpRangesParams {
+	p := &ListVlanIpRangesParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *VLANService) GetVlanIpRangeByID(id string, opts ...OptionFunc) (*VlanIpRange, int, error) {
+	p := &ListVlanIpRangesParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["id"] = id
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return nil, -1, err
+		}
+	}
+
+	l, err := s.ListVlanIpRanges(p)
+	if err != nil {
+		if strings.Contains(err.Error(), fmt.Sprintf(
+			"Invalid parameter id value=%s due to incorrect long value format, "+
+				"or entity does not exist", id)) {
+			return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
+		}
+		return nil, -1, err
+	}
+
+	if l.Count == 0 {
+		return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
+	}
+
+	if l.Count == 1 {
+		return l.VlanIpRanges[0], l.Count, nil
+	}
+	return nil, l.Count, fmt.Errorf("There is more then one result for VlanIpRange UUID: %s!", id)
+}
+
+// Lists all VLAN IP ranges.
+func (s *VLANService) ListVlanIpRanges(p *ListVlanIpRangesParams) (*ListVlanIpRangesResponse, error) {
+	resp, err := s.cs.newRequest("listVlanIpRanges", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListVlanIpRangesResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListVlanIpRangesResponse struct {
+	Count        int            `json:"count"`
+	VlanIpRanges []*VlanIpRange `json:"vlaniprange"`
+}
+
+type VlanIpRange struct {
+	Account           string `json:"account"`
+	Description       string `json:"description"`
+	Domain            string `json:"domain"`
+	Domainid          string `json:"domainid"`
+	Endip             string `json:"endip"`
+	Endipv6           string `json:"endipv6"`
+	Forvirtualnetwork bool   `json:"forvirtualnetwork"`
+	Gateway           string `json:"gateway"`
+	Id                string `json:"id"`
+	Ip6cidr           string `json:"ip6cidr"`
+	Ip6gateway        string `json:"ip6gateway"`
+	Netmask           string `json:"netmask"`
+	Networkid         string `json:"networkid"`
+	Physicalnetworkid string `json:"physicalnetworkid"`
+	Podid             string `json:"podid"`
+	Podname           string `json:"podname"`
+	Project           string `json:"project"`
+	Projectid         string `json:"projectid"`
+	Startip           string `json:"startip"`
+	Startipv6         string `json:"startipv6"`
+	Vlan              string `json:"vlan"`
+	Zoneid            string `json:"zoneid"`
+}
+
+type ReleaseDedicatedGuestVlanRangeParams struct {
+	p map[string]interface{}
+}
+
+func (p *ReleaseDedicatedGuestVlanRangeParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *ReleaseDedicatedGuestVlanRangeParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new ReleaseDedicatedGuestVlanRangeParams instance,
+// as then you are sure you have configured all required params
+func (s *VLANService) NewReleaseDedicatedGuestVlanRangeParams(id string) *ReleaseDedicatedGuestVlanRangeParams {
+	p := &ReleaseDedicatedGuestVlanRangeParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Releases a dedicated guest vlan range to the system
+func (s *VLANService) ReleaseDedicatedGuestVlanRange(p *ReleaseDedicatedGuestVlanRangeParams) (*ReleaseDedicatedGuestVlanRangeResponse, error) {
+	resp, err := s.cs.newRequest("releaseDedicatedGuestVlanRange", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ReleaseDedicatedGuestVlanRangeResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type ReleaseDedicatedGuestVlanRangeResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
diff --git a/vendor/github.com/xanzy/go-cloudstack/cloudstack/VMGroupService.go b/vendor/github.com/xanzy/go-cloudstack/cloudstack/VMGroupService.go
new file mode 100644
index 0000000..58cabe5
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/cloudstack/VMGroupService.go
@@ -0,0 +1,485 @@
+//
+// Copyright 2018, Sander van Harmelen
+//
+// Licensed 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 cloudstack
+
+import (
+	"encoding/json"
+	"fmt"
+	"net/url"
+	"strconv"
+	"strings"
+)
+
+type CreateInstanceGroupParams struct {
+	p map[string]interface{}
+}
+
+func (p *CreateInstanceGroupParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["projectid"]; found {
+		u.Set("projectid", v.(string))
+	}
+	return u
+}
+
+func (p *CreateInstanceGroupParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *CreateInstanceGroupParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *CreateInstanceGroupParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *CreateInstanceGroupParams) SetProjectid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectid"] = v
+	return
+}
+
+// You should always use this function to get a new CreateInstanceGroupParams instance,
+// as then you are sure you have configured all required params
+func (s *VMGroupService) NewCreateInstanceGroupParams(name string) *CreateInstanceGroupParams {
+	p := &CreateInstanceGroupParams{}
+	p.p = make(map[string]interface{})
+	p.p["name"] = name
+	return p
+}
+
+// Creates a vm group
+func (s *VMGroupService) CreateInstanceGroup(p *CreateInstanceGroupParams) (*CreateInstanceGroupResponse, error) {
+	resp, err := s.cs.newRequest("createInstanceGroup", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r CreateInstanceGroupResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type CreateInstanceGroupResponse struct {
+	Account   string `json:"account"`
+	Created   string `json:"created"`
+	Domain    string `json:"domain"`
+	Domainid  string `json:"domainid"`
+	Id        string `json:"id"`
+	Name      string `json:"name"`
+	Project   string `json:"project"`
+	Projectid string `json:"projectid"`
+}
+
+type DeleteInstanceGroupParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeleteInstanceGroupParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *DeleteInstanceGroupParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new DeleteInstanceGroupParams instance,
+// as then you are sure you have configured all required params
+func (s *VMGroupService) NewDeleteInstanceGroupParams(id string) *DeleteInstanceGroupParams {
+	p := &DeleteInstanceGroupParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Deletes a vm group
+func (s *VMGroupService) DeleteInstanceGroup(p *DeleteInstanceGroupParams) (*DeleteInstanceGroupResponse, error) {
+	resp, err := s.cs.newRequest("deleteInstanceGroup", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeleteInstanceGroupResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type DeleteInstanceGroupResponse struct {
+	Displaytext string `json:"displaytext"`
+	Success     string `json:"success"`
+}
+
+type ListInstanceGroupsParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListInstanceGroupsParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["isrecursive"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("isrecursive", vv)
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["listall"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("listall", vv)
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["projectid"]; found {
+		u.Set("projectid", v.(string))
+	}
+	return u
+}
+
+func (p *ListInstanceGroupsParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *ListInstanceGroupsParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *ListInstanceGroupsParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ListInstanceGroupsParams) SetIsrecursive(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isrecursive"] = v
+	return
+}
+
+func (p *ListInstanceGroupsParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListInstanceGroupsParams) SetListall(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["listall"] = v
+	return
+}
+
+func (p *ListInstanceGroupsParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *ListInstanceGroupsParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListInstanceGroupsParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListInstanceGroupsParams) SetProjectid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectid"] = v
+	return
+}
+
+// You should always use this function to get a new ListInstanceGroupsParams instance,
+// as then you are sure you have configured all required params
+func (s *VMGroupService) NewListInstanceGroupsParams() *ListInstanceGroupsParams {
+	p := &ListInstanceGroupsParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *VMGroupService) GetInstanceGroupID(name string, opts ...OptionFunc) (string, int, error) {
+	p := &ListInstanceGroupsParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["name"] = name
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return "", -1, err
+		}
+	}
+
+	l, err := s.ListInstanceGroups(p)
+	if err != nil {
+		return "", -1, err
+	}
+
+	if l.Count == 0 {
+		return "", l.Count, fmt.Errorf("No match found for %s: %+v", name, l)
+	}
+
+	if l.Count == 1 {
+		return l.InstanceGroups[0].Id, l.Count, nil
+	}
+
+	if l.Count > 1 {
+		for _, v := range l.InstanceGroups {
+			if v.Name == name {
+				return v.Id, l.Count, nil
+			}
+		}
+	}
+	return "", l.Count, fmt.Errorf("Could not find an exact match for %s: %+v", name, l)
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *VMGroupService) GetInstanceGroupByName(name string, opts ...OptionFunc) (*InstanceGroup, int, error) {
+	id, count, err := s.GetInstanceGroupID(name, opts...)
+	if err != nil {
+		return nil, count, err
+	}
+
+	r, count, err := s.GetInstanceGroupByID(id, opts...)
+	if err != nil {
+		return nil, count, err
+	}
+	return r, count, nil
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *VMGroupService) GetInstanceGroupByID(id string, opts ...OptionFunc) (*InstanceGroup, int, error) {
+	p := &ListInstanceGroupsParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["id"] = id
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return nil, -1, err
+		}
+	}
+
+	l, err := s.ListInstanceGroups(p)
+	if err != nil {
+		if strings.Contains(err.Error(), fmt.Sprintf(
+			"Invalid parameter id value=%s due to incorrect long value format, "+
+				"or entity does not exist", id)) {
+			return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
+		}
+		return nil, -1, err
+	}
+
+	if l.Count == 0 {
+		return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
+	}
+
+	if l.Count == 1 {
+		return l.InstanceGroups[0], l.Count, nil
+	}
+	return nil, l.Count, fmt.Errorf("There is more then one result for InstanceGroup UUID: %s!", id)
+}
+
+// Lists vm groups
+func (s *VMGroupService) ListInstanceGroups(p *ListInstanceGroupsParams) (*ListInstanceGroupsResponse, error) {
+	resp, err := s.cs.newRequest("listInstanceGroups", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListInstanceGroupsResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListInstanceGroupsResponse struct {
+	Count          int              `json:"count"`
+	InstanceGroups []*InstanceGroup `json:"instancegroup"`
+}
+
+type InstanceGroup struct {
+	Account   string `json:"account"`
+	Created   string `json:"created"`
+	Domain    string `json:"domain"`
+	Domainid  string `json:"domainid"`
+	Id        string `json:"id"`
+	Name      string `json:"name"`
+	Project   string `json:"project"`
+	Projectid string `json:"projectid"`
+}
+
+type UpdateInstanceGroupParams struct {
+	p map[string]interface{}
+}
+
+func (p *UpdateInstanceGroupParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	return u
+}
+
+func (p *UpdateInstanceGroupParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *UpdateInstanceGroupParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+// You should always use this function to get a new UpdateInstanceGroupParams instance,
+// as then you are sure you have configured all required params
+func (s *VMGroupService) NewUpdateInstanceGroupParams(id string) *UpdateInstanceGroupParams {
+	p := &UpdateInstanceGroupParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Updates a vm group
+func (s *VMGroupService) UpdateInstanceGroup(p *UpdateInstanceGroupParams) (*UpdateInstanceGroupResponse, error) {
+	resp, err := s.cs.newRequest("updateInstanceGroup", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r UpdateInstanceGroupResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type UpdateInstanceGroupResponse struct {
+	Account   string `json:"account"`
+	Created   string `json:"created"`
+	Domain    string `json:"domain"`
+	Domainid  string `json:"domainid"`
+	Id        string `json:"id"`
+	Name      string `json:"name"`
+	Project   string `json:"project"`
+	Projectid string `json:"projectid"`
+}
diff --git a/vendor/github.com/xanzy/go-cloudstack/cloudstack/VPCService.go b/vendor/github.com/xanzy/go-cloudstack/cloudstack/VPCService.go
new file mode 100644
index 0000000..5583e44
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/cloudstack/VPCService.go
@@ -0,0 +1,2858 @@
+//
+// Copyright 2018, Sander van Harmelen
+//
+// Licensed 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 cloudstack
+
+import (
+	"encoding/json"
+	"fmt"
+	"net/url"
+	"strconv"
+	"strings"
+)
+
+type CreatePrivateGatewayParams struct {
+	p map[string]interface{}
+}
+
+func (p *CreatePrivateGatewayParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["aclid"]; found {
+		u.Set("aclid", v.(string))
+	}
+	if v, found := p.p["gateway"]; found {
+		u.Set("gateway", v.(string))
+	}
+	if v, found := p.p["ipaddress"]; found {
+		u.Set("ipaddress", v.(string))
+	}
+	if v, found := p.p["netmask"]; found {
+		u.Set("netmask", v.(string))
+	}
+	if v, found := p.p["networkofferingid"]; found {
+		u.Set("networkofferingid", v.(string))
+	}
+	if v, found := p.p["physicalnetworkid"]; found {
+		u.Set("physicalnetworkid", v.(string))
+	}
+	if v, found := p.p["sourcenatsupported"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("sourcenatsupported", vv)
+	}
+	if v, found := p.p["vlan"]; found {
+		u.Set("vlan", v.(string))
+	}
+	if v, found := p.p["vpcid"]; found {
+		u.Set("vpcid", v.(string))
+	}
+	return u
+}
+
+func (p *CreatePrivateGatewayParams) SetAclid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["aclid"] = v
+	return
+}
+
+func (p *CreatePrivateGatewayParams) SetGateway(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["gateway"] = v
+	return
+}
+
+func (p *CreatePrivateGatewayParams) SetIpaddress(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["ipaddress"] = v
+	return
+}
+
+func (p *CreatePrivateGatewayParams) SetNetmask(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["netmask"] = v
+	return
+}
+
+func (p *CreatePrivateGatewayParams) SetNetworkofferingid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["networkofferingid"] = v
+	return
+}
+
+func (p *CreatePrivateGatewayParams) SetPhysicalnetworkid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["physicalnetworkid"] = v
+	return
+}
+
+func (p *CreatePrivateGatewayParams) SetSourcenatsupported(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["sourcenatsupported"] = v
+	return
+}
+
+func (p *CreatePrivateGatewayParams) SetVlan(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["vlan"] = v
+	return
+}
+
+func (p *CreatePrivateGatewayParams) SetVpcid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["vpcid"] = v
+	return
+}
+
+// You should always use this function to get a new CreatePrivateGatewayParams instance,
+// as then you are sure you have configured all required params
+func (s *VPCService) NewCreatePrivateGatewayParams(gateway string, ipaddress string, netmask string, vlan string, vpcid string) *CreatePrivateGatewayParams {
+	p := &CreatePrivateGatewayParams{}
+	p.p = make(map[string]interface{})
+	p.p["gateway"] = gateway
+	p.p["ipaddress"] = ipaddress
+	p.p["netmask"] = netmask
+	p.p["vlan"] = vlan
+	p.p["vpcid"] = vpcid
+	return p
+}
+
+// Creates a private gateway
+func (s *VPCService) CreatePrivateGateway(p *CreatePrivateGatewayParams) (*CreatePrivateGatewayResponse, error) {
+	resp, err := s.cs.newRequest("createPrivateGateway", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r CreatePrivateGatewayResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type CreatePrivateGatewayResponse struct {
+	JobID              string `json:"jobid"`
+	Account            string `json:"account"`
+	Aclid              string `json:"aclid"`
+	Domain             string `json:"domain"`
+	Domainid           string `json:"domainid"`
+	Gateway            string `json:"gateway"`
+	Id                 string `json:"id"`
+	Ipaddress          string `json:"ipaddress"`
+	Netmask            string `json:"netmask"`
+	Physicalnetworkid  string `json:"physicalnetworkid"`
+	Project            string `json:"project"`
+	Projectid          string `json:"projectid"`
+	Sourcenatsupported bool   `json:"sourcenatsupported"`
+	State              string `json:"state"`
+	Vlan               string `json:"vlan"`
+	Vpcid              string `json:"vpcid"`
+	Zoneid             string `json:"zoneid"`
+	Zonename           string `json:"zonename"`
+}
+
+type CreateStaticRouteParams struct {
+	p map[string]interface{}
+}
+
+func (p *CreateStaticRouteParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["cidr"]; found {
+		u.Set("cidr", v.(string))
+	}
+	if v, found := p.p["gatewayid"]; found {
+		u.Set("gatewayid", v.(string))
+	}
+	return u
+}
+
+func (p *CreateStaticRouteParams) SetCidr(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["cidr"] = v
+	return
+}
+
+func (p *CreateStaticRouteParams) SetGatewayid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["gatewayid"] = v
+	return
+}
+
+// You should always use this function to get a new CreateStaticRouteParams instance,
+// as then you are sure you have configured all required params
+func (s *VPCService) NewCreateStaticRouteParams(cidr string, gatewayid string) *CreateStaticRouteParams {
+	p := &CreateStaticRouteParams{}
+	p.p = make(map[string]interface{})
+	p.p["cidr"] = cidr
+	p.p["gatewayid"] = gatewayid
+	return p
+}
+
+// Creates a static route
+func (s *VPCService) CreateStaticRoute(p *CreateStaticRouteParams) (*CreateStaticRouteResponse, error) {
+	resp, err := s.cs.newRequest("createStaticRoute", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r CreateStaticRouteResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type CreateStaticRouteResponse struct {
+	JobID     string `json:"jobid"`
+	Account   string `json:"account"`
+	Cidr      string `json:"cidr"`
+	Domain    string `json:"domain"`
+	Domainid  string `json:"domainid"`
+	Gatewayid string `json:"gatewayid"`
+	Id        string `json:"id"`
+	Project   string `json:"project"`
+	Projectid string `json:"projectid"`
+	State     string `json:"state"`
+	Tags      []struct {
+		Account      string `json:"account"`
+		Customer     string `json:"customer"`
+		Domain       string `json:"domain"`
+		Domainid     string `json:"domainid"`
+		Key          string `json:"key"`
+		Project      string `json:"project"`
+		Projectid    string `json:"projectid"`
+		Resourceid   string `json:"resourceid"`
+		Resourcetype string `json:"resourcetype"`
+		Value        string `json:"value"`
+	} `json:"tags"`
+	Vpcid string `json:"vpcid"`
+}
+
+type CreateVPCParams struct {
+	p map[string]interface{}
+}
+
+func (p *CreateVPCParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["cidr"]; found {
+		u.Set("cidr", v.(string))
+	}
+	if v, found := p.p["displaytext"]; found {
+		u.Set("displaytext", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["fordisplay"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("fordisplay", vv)
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["networkdomain"]; found {
+		u.Set("networkdomain", v.(string))
+	}
+	if v, found := p.p["projectid"]; found {
+		u.Set("projectid", v.(string))
+	}
+	if v, found := p.p["start"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("start", vv)
+	}
+	if v, found := p.p["vpcofferingid"]; found {
+		u.Set("vpcofferingid", v.(string))
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *CreateVPCParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *CreateVPCParams) SetCidr(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["cidr"] = v
+	return
+}
+
+func (p *CreateVPCParams) SetDisplaytext(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["displaytext"] = v
+	return
+}
+
+func (p *CreateVPCParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *CreateVPCParams) SetFordisplay(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["fordisplay"] = v
+	return
+}
+
+func (p *CreateVPCParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *CreateVPCParams) SetNetworkdomain(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["networkdomain"] = v
+	return
+}
+
+func (p *CreateVPCParams) SetProjectid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectid"] = v
+	return
+}
+
+func (p *CreateVPCParams) SetStart(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["start"] = v
+	return
+}
+
+func (p *CreateVPCParams) SetVpcofferingid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["vpcofferingid"] = v
+	return
+}
+
+func (p *CreateVPCParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new CreateVPCParams instance,
+// as then you are sure you have configured all required params
+func (s *VPCService) NewCreateVPCParams(cidr string, displaytext string, name string, vpcofferingid string, zoneid string) *CreateVPCParams {
+	p := &CreateVPCParams{}
+	p.p = make(map[string]interface{})
+	p.p["cidr"] = cidr
+	p.p["displaytext"] = displaytext
+	p.p["name"] = name
+	p.p["vpcofferingid"] = vpcofferingid
+	p.p["zoneid"] = zoneid
+	return p
+}
+
+// Creates a VPC
+func (s *VPCService) CreateVPC(p *CreateVPCParams) (*CreateVPCResponse, error) {
+	resp, err := s.cs.newRequest("createVPC", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r CreateVPCResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type CreateVPCResponse struct {
+	JobID                string `json:"jobid"`
+	Account              string `json:"account"`
+	Cidr                 string `json:"cidr"`
+	Created              string `json:"created"`
+	Displaytext          string `json:"displaytext"`
+	Distributedvpcrouter bool   `json:"distributedvpcrouter"`
+	Domain               string `json:"domain"`
+	Domainid             string `json:"domainid"`
+	Fordisplay           bool   `json:"fordisplay"`
+	Id                   string `json:"id"`
+	Name                 string `json:"name"`
+	Network              []struct {
+		Account                     string `json:"account"`
+		Aclid                       string `json:"aclid"`
+		Acltype                     string `json:"acltype"`
+		Broadcastdomaintype         string `json:"broadcastdomaintype"`
+		Broadcasturi                string `json:"broadcasturi"`
+		Canusefordeploy             bool   `json:"canusefordeploy"`
+		Cidr                        string `json:"cidr"`
+		Displaynetwork              bool   `json:"displaynetwork"`
+		Displaytext                 string `json:"displaytext"`
+		Dns1                        string `json:"dns1"`
+		Dns2                        string `json:"dns2"`
+		Domain                      string `json:"domain"`
+		Domainid                    string `json:"domainid"`
+		Gateway                     string `json:"gateway"`
+		Id                          string `json:"id"`
+		Ip6cidr                     string `json:"ip6cidr"`
+		Ip6gateway                  string `json:"ip6gateway"`
+		Isdefault                   bool   `json:"isdefault"`
+		Ispersistent                bool   `json:"ispersistent"`
+		Issystem                    bool   `json:"issystem"`
+		Name                        string `json:"name"`
+		Netmask                     string `json:"netmask"`
+		Networkcidr                 string `json:"networkcidr"`
+		Networkdomain               string `json:"networkdomain"`
+		Networkofferingavailability string `json:"networkofferingavailability"`
+		Networkofferingconservemode bool   `json:"networkofferingconservemode"`
+		Networkofferingdisplaytext  string `json:"networkofferingdisplaytext"`
+		Networkofferingid           string `json:"networkofferingid"`
+		Networkofferingname         string `json:"networkofferingname"`
+		Physicalnetworkid           string `json:"physicalnetworkid"`
+		Project                     string `json:"project"`
+		Projectid                   string `json:"projectid"`
+		Related                     string `json:"related"`
+		Reservediprange             string `json:"reservediprange"`
+		Restartrequired             bool   `json:"restartrequired"`
+		Service                     []struct {
+			Capability []struct {
+				Canchooseservicecapability bool   `json:"canchooseservicecapability"`
+				Name                       string `json:"name"`
+				Value                      string `json:"value"`
+			} `json:"capability"`
+			Name     string `json:"name"`
+			Provider []struct {
+				Canenableindividualservice   bool     `json:"canenableindividualservice"`
+				Destinationphysicalnetworkid string   `json:"destinationphysicalnetworkid"`
+				Id                           string   `json:"id"`
+				Name                         string   `json:"name"`
+				Physicalnetworkid            string   `json:"physicalnetworkid"`
+				Servicelist                  []string `json:"servicelist"`
+				State                        string   `json:"state"`
+			} `json:"provider"`
+		} `json:"service"`
+		Specifyipranges  bool   `json:"specifyipranges"`
+		State            string `json:"state"`
+		Strechedl2subnet bool   `json:"strechedl2subnet"`
+		Subdomainaccess  bool   `json:"subdomainaccess"`
+		Tags             []struct {
+			Account      string `json:"account"`
+			Customer     string `json:"customer"`
+			Domain       string `json:"domain"`
+			Domainid     string `json:"domainid"`
+			Key          string `json:"key"`
+			Project      string `json:"project"`
+			Projectid    string `json:"projectid"`
+			Resourceid   string `json:"resourceid"`
+			Resourcetype string `json:"resourcetype"`
+			Value        string `json:"value"`
+		} `json:"tags"`
+		Traffictype       string        `json:"traffictype"`
+		Type              string        `json:"type"`
+		Vlan              string        `json:"vlan"`
+		Vpcid             string        `json:"vpcid"`
+		Zoneid            string        `json:"zoneid"`
+		Zonename          string        `json:"zonename"`
+		Zonesnetworkspans []interface{} `json:"zonesnetworkspans"`
+	} `json:"network"`
+	Networkdomain      string `json:"networkdomain"`
+	Project            string `json:"project"`
+	Projectid          string `json:"projectid"`
+	Redundantvpcrouter bool   `json:"redundantvpcrouter"`
+	Regionlevelvpc     bool   `json:"regionlevelvpc"`
+	Restartrequired    bool   `json:"restartrequired"`
+	Service            []struct {
+		Capability []struct {
+			Canchooseservicecapability bool   `json:"canchooseservicecapability"`
+			Name                       string `json:"name"`
+			Value                      string `json:"value"`
+		} `json:"capability"`
+		Name     string `json:"name"`
+		Provider []struct {
+			Canenableindividualservice   bool     `json:"canenableindividualservice"`
+			Destinationphysicalnetworkid string   `json:"destinationphysicalnetworkid"`
+			Id                           string   `json:"id"`
+			Name                         string   `json:"name"`
+			Physicalnetworkid            string   `json:"physicalnetworkid"`
+			Servicelist                  []string `json:"servicelist"`
+			State                        string   `json:"state"`
+		} `json:"provider"`
+	} `json:"service"`
+	State string `json:"state"`
+	Tags  []struct {
+		Account      string `json:"account"`
+		Customer     string `json:"customer"`
+		Domain       string `json:"domain"`
+		Domainid     string `json:"domainid"`
+		Key          string `json:"key"`
+		Project      string `json:"project"`
+		Projectid    string `json:"projectid"`
+		Resourceid   string `json:"resourceid"`
+		Resourcetype string `json:"resourcetype"`
+		Value        string `json:"value"`
+	} `json:"tags"`
+	Vpcofferingid string `json:"vpcofferingid"`
+	Zoneid        string `json:"zoneid"`
+	Zonename      string `json:"zonename"`
+}
+
+type CreateVPCOfferingParams struct {
+	p map[string]interface{}
+}
+
+func (p *CreateVPCOfferingParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["displaytext"]; found {
+		u.Set("displaytext", v.(string))
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["servicecapabilitylist"]; found {
+		i := 0
+		for k, vv := range v.(map[string]string) {
+			u.Set(fmt.Sprintf("servicecapabilitylist[%d].key", i), k)
+			u.Set(fmt.Sprintf("servicecapabilitylist[%d].value", i), vv)
+			i++
+		}
+	}
+	if v, found := p.p["serviceofferingid"]; found {
+		u.Set("serviceofferingid", v.(string))
+	}
+	if v, found := p.p["serviceproviderlist"]; found {
+		i := 0
+		for k, vv := range v.(map[string]string) {
+			u.Set(fmt.Sprintf("serviceproviderlist[%d].service", i), k)
+			u.Set(fmt.Sprintf("serviceproviderlist[%d].provider", i), vv)
+			i++
+		}
+	}
+	if v, found := p.p["supportedservices"]; found {
+		vv := strings.Join(v.([]string), ",")
+		u.Set("supportedservices", vv)
+	}
+	return u
+}
+
+func (p *CreateVPCOfferingParams) SetDisplaytext(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["displaytext"] = v
+	return
+}
+
+func (p *CreateVPCOfferingParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *CreateVPCOfferingParams) SetServicecapabilitylist(v map[string]string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["servicecapabilitylist"] = v
+	return
+}
+
+func (p *CreateVPCOfferingParams) SetServiceofferingid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["serviceofferingid"] = v
+	return
+}
+
+func (p *CreateVPCOfferingParams) SetServiceproviderlist(v map[string]string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["serviceproviderlist"] = v
+	return
+}
+
+func (p *CreateVPCOfferingParams) SetSupportedservices(v []string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["supportedservices"] = v
+	return
+}
+
+// You should always use this function to get a new CreateVPCOfferingParams instance,
+// as then you are sure you have configured all required params
+func (s *VPCService) NewCreateVPCOfferingParams(displaytext string, name string, supportedservices []string) *CreateVPCOfferingParams {
+	p := &CreateVPCOfferingParams{}
+	p.p = make(map[string]interface{})
+	p.p["displaytext"] = displaytext
+	p.p["name"] = name
+	p.p["supportedservices"] = supportedservices
+	return p
+}
+
+// Creates VPC offering
+func (s *VPCService) CreateVPCOffering(p *CreateVPCOfferingParams) (*CreateVPCOfferingResponse, error) {
+	resp, err := s.cs.newRequest("createVPCOffering", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r CreateVPCOfferingResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type CreateVPCOfferingResponse struct {
+	JobID                string `json:"jobid"`
+	Created              string `json:"created"`
+	Displaytext          string `json:"displaytext"`
+	Distributedvpcrouter bool   `json:"distributedvpcrouter"`
+	Id                   string `json:"id"`
+	Isdefault            bool   `json:"isdefault"`
+	Name                 string `json:"name"`
+	Service              []struct {
+		Capability []struct {
+			Canchooseservicecapability bool   `json:"canchooseservicecapability"`
+			Name                       string `json:"name"`
+			Value                      string `json:"value"`
+		} `json:"capability"`
+		Name     string `json:"name"`
+		Provider []struct {
+			Canenableindividualservice   bool     `json:"canenableindividualservice"`
+			Destinationphysicalnetworkid string   `json:"destinationphysicalnetworkid"`
+			Id                           string   `json:"id"`
+			Name                         string   `json:"name"`
+			Physicalnetworkid            string   `json:"physicalnetworkid"`
+			Servicelist                  []string `json:"servicelist"`
+			State                        string   `json:"state"`
+		} `json:"provider"`
+	} `json:"service"`
+	State                  string `json:"state"`
+	SupportsregionLevelvpc bool   `json:"supportsregionLevelvpc"`
+}
+
+type DeletePrivateGatewayParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeletePrivateGatewayParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *DeletePrivateGatewayParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new DeletePrivateGatewayParams instance,
+// as then you are sure you have configured all required params
+func (s *VPCService) NewDeletePrivateGatewayParams(id string) *DeletePrivateGatewayParams {
+	p := &DeletePrivateGatewayParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Deletes a Private gateway
+func (s *VPCService) DeletePrivateGateway(p *DeletePrivateGatewayParams) (*DeletePrivateGatewayResponse, error) {
+	resp, err := s.cs.newRequest("deletePrivateGateway", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeletePrivateGatewayResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type DeletePrivateGatewayResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
+
+type DeleteStaticRouteParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeleteStaticRouteParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *DeleteStaticRouteParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new DeleteStaticRouteParams instance,
+// as then you are sure you have configured all required params
+func (s *VPCService) NewDeleteStaticRouteParams(id string) *DeleteStaticRouteParams {
+	p := &DeleteStaticRouteParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Deletes a static route
+func (s *VPCService) DeleteStaticRoute(p *DeleteStaticRouteParams) (*DeleteStaticRouteResponse, error) {
+	resp, err := s.cs.newRequest("deleteStaticRoute", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeleteStaticRouteResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type DeleteStaticRouteResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
+
+type DeleteVPCParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeleteVPCParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *DeleteVPCParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new DeleteVPCParams instance,
+// as then you are sure you have configured all required params
+func (s *VPCService) NewDeleteVPCParams(id string) *DeleteVPCParams {
+	p := &DeleteVPCParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Deletes a VPC
+func (s *VPCService) DeleteVPC(p *DeleteVPCParams) (*DeleteVPCResponse, error) {
+	resp, err := s.cs.newRequest("deleteVPC", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeleteVPCResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type DeleteVPCResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
+
+type DeleteVPCOfferingParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeleteVPCOfferingParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *DeleteVPCOfferingParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new DeleteVPCOfferingParams instance,
+// as then you are sure you have configured all required params
+func (s *VPCService) NewDeleteVPCOfferingParams(id string) *DeleteVPCOfferingParams {
+	p := &DeleteVPCOfferingParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Deletes VPC offering
+func (s *VPCService) DeleteVPCOffering(p *DeleteVPCOfferingParams) (*DeleteVPCOfferingResponse, error) {
+	resp, err := s.cs.newRequest("deleteVPCOffering", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeleteVPCOfferingResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type DeleteVPCOfferingResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
+
+type ListPrivateGatewaysParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListPrivateGatewaysParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["ipaddress"]; found {
+		u.Set("ipaddress", v.(string))
+	}
+	if v, found := p.p["isrecursive"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("isrecursive", vv)
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["listall"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("listall", vv)
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["projectid"]; found {
+		u.Set("projectid", v.(string))
+	}
+	if v, found := p.p["state"]; found {
+		u.Set("state", v.(string))
+	}
+	if v, found := p.p["vlan"]; found {
+		u.Set("vlan", v.(string))
+	}
+	if v, found := p.p["vpcid"]; found {
+		u.Set("vpcid", v.(string))
+	}
+	return u
+}
+
+func (p *ListPrivateGatewaysParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *ListPrivateGatewaysParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *ListPrivateGatewaysParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ListPrivateGatewaysParams) SetIpaddress(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["ipaddress"] = v
+	return
+}
+
+func (p *ListPrivateGatewaysParams) SetIsrecursive(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isrecursive"] = v
+	return
+}
+
+func (p *ListPrivateGatewaysParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListPrivateGatewaysParams) SetListall(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["listall"] = v
+	return
+}
+
+func (p *ListPrivateGatewaysParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListPrivateGatewaysParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListPrivateGatewaysParams) SetProjectid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectid"] = v
+	return
+}
+
+func (p *ListPrivateGatewaysParams) SetState(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["state"] = v
+	return
+}
+
+func (p *ListPrivateGatewaysParams) SetVlan(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["vlan"] = v
+	return
+}
+
+func (p *ListPrivateGatewaysParams) SetVpcid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["vpcid"] = v
+	return
+}
+
+// You should always use this function to get a new ListPrivateGatewaysParams instance,
+// as then you are sure you have configured all required params
+func (s *VPCService) NewListPrivateGatewaysParams() *ListPrivateGatewaysParams {
+	p := &ListPrivateGatewaysParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *VPCService) GetPrivateGatewayByID(id string, opts ...OptionFunc) (*PrivateGateway, int, error) {
+	p := &ListPrivateGatewaysParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["id"] = id
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return nil, -1, err
+		}
+	}
+
+	l, err := s.ListPrivateGateways(p)
+	if err != nil {
+		if strings.Contains(err.Error(), fmt.Sprintf(
+			"Invalid parameter id value=%s due to incorrect long value format, "+
+				"or entity does not exist", id)) {
+			return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
+		}
+		return nil, -1, err
+	}
+
+	if l.Count == 0 {
+		return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
+	}
+
+	if l.Count == 1 {
+		return l.PrivateGateways[0], l.Count, nil
+	}
+	return nil, l.Count, fmt.Errorf("There is more then one result for PrivateGateway UUID: %s!", id)
+}
+
+// List private gateways
+func (s *VPCService) ListPrivateGateways(p *ListPrivateGatewaysParams) (*ListPrivateGatewaysResponse, error) {
+	resp, err := s.cs.newRequest("listPrivateGateways", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListPrivateGatewaysResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListPrivateGatewaysResponse struct {
+	Count           int               `json:"count"`
+	PrivateGateways []*PrivateGateway `json:"privategateway"`
+}
+
+type PrivateGateway struct {
+	Account            string `json:"account"`
+	Aclid              string `json:"aclid"`
+	Domain             string `json:"domain"`
+	Domainid           string `json:"domainid"`
+	Gateway            string `json:"gateway"`
+	Id                 string `json:"id"`
+	Ipaddress          string `json:"ipaddress"`
+	Netmask            string `json:"netmask"`
+	Physicalnetworkid  string `json:"physicalnetworkid"`
+	Project            string `json:"project"`
+	Projectid          string `json:"projectid"`
+	Sourcenatsupported bool   `json:"sourcenatsupported"`
+	State              string `json:"state"`
+	Vlan               string `json:"vlan"`
+	Vpcid              string `json:"vpcid"`
+	Zoneid             string `json:"zoneid"`
+	Zonename           string `json:"zonename"`
+}
+
+type ListStaticRoutesParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListStaticRoutesParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["gatewayid"]; found {
+		u.Set("gatewayid", v.(string))
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["isrecursive"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("isrecursive", vv)
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["listall"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("listall", vv)
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["projectid"]; found {
+		u.Set("projectid", v.(string))
+	}
+	if v, found := p.p["tags"]; found {
+		i := 0
+		for k, vv := range v.(map[string]string) {
+			u.Set(fmt.Sprintf("tags[%d].key", i), k)
+			u.Set(fmt.Sprintf("tags[%d].value", i), vv)
+			i++
+		}
+	}
+	if v, found := p.p["vpcid"]; found {
+		u.Set("vpcid", v.(string))
+	}
+	return u
+}
+
+func (p *ListStaticRoutesParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *ListStaticRoutesParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *ListStaticRoutesParams) SetGatewayid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["gatewayid"] = v
+	return
+}
+
+func (p *ListStaticRoutesParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ListStaticRoutesParams) SetIsrecursive(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isrecursive"] = v
+	return
+}
+
+func (p *ListStaticRoutesParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListStaticRoutesParams) SetListall(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["listall"] = v
+	return
+}
+
+func (p *ListStaticRoutesParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListStaticRoutesParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListStaticRoutesParams) SetProjectid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectid"] = v
+	return
+}
+
+func (p *ListStaticRoutesParams) SetTags(v map[string]string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["tags"] = v
+	return
+}
+
+func (p *ListStaticRoutesParams) SetVpcid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["vpcid"] = v
+	return
+}
+
+// You should always use this function to get a new ListStaticRoutesParams instance,
+// as then you are sure you have configured all required params
+func (s *VPCService) NewListStaticRoutesParams() *ListStaticRoutesParams {
+	p := &ListStaticRoutesParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *VPCService) GetStaticRouteByID(id string, opts ...OptionFunc) (*StaticRoute, int, error) {
+	p := &ListStaticRoutesParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["id"] = id
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return nil, -1, err
+		}
+	}
+
+	l, err := s.ListStaticRoutes(p)
+	if err != nil {
+		if strings.Contains(err.Error(), fmt.Sprintf(
+			"Invalid parameter id value=%s due to incorrect long value format, "+
+				"or entity does not exist", id)) {
+			return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
+		}
+		return nil, -1, err
+	}
+
+	if l.Count == 0 {
+		return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
+	}
+
+	if l.Count == 1 {
+		return l.StaticRoutes[0], l.Count, nil
+	}
+	return nil, l.Count, fmt.Errorf("There is more then one result for StaticRoute UUID: %s!", id)
+}
+
+// Lists all static routes
+func (s *VPCService) ListStaticRoutes(p *ListStaticRoutesParams) (*ListStaticRoutesResponse, error) {
+	resp, err := s.cs.newRequest("listStaticRoutes", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListStaticRoutesResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListStaticRoutesResponse struct {
+	Count        int            `json:"count"`
+	StaticRoutes []*StaticRoute `json:"staticroute"`
+}
+
+type StaticRoute struct {
+	Account   string `json:"account"`
+	Cidr      string `json:"cidr"`
+	Domain    string `json:"domain"`
+	Domainid  string `json:"domainid"`
+	Gatewayid string `json:"gatewayid"`
+	Id        string `json:"id"`
+	Project   string `json:"project"`
+	Projectid string `json:"projectid"`
+	State     string `json:"state"`
+	Tags      []struct {
+		Account      string `json:"account"`
+		Customer     string `json:"customer"`
+		Domain       string `json:"domain"`
+		Domainid     string `json:"domainid"`
+		Key          string `json:"key"`
+		Project      string `json:"project"`
+		Projectid    string `json:"projectid"`
+		Resourceid   string `json:"resourceid"`
+		Resourcetype string `json:"resourcetype"`
+		Value        string `json:"value"`
+	} `json:"tags"`
+	Vpcid string `json:"vpcid"`
+}
+
+type ListVPCOfferingsParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListVPCOfferingsParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["displaytext"]; found {
+		u.Set("displaytext", v.(string))
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["isdefault"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("isdefault", vv)
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["state"]; found {
+		u.Set("state", v.(string))
+	}
+	if v, found := p.p["supportedservices"]; found {
+		vv := strings.Join(v.([]string), ",")
+		u.Set("supportedservices", vv)
+	}
+	return u
+}
+
+func (p *ListVPCOfferingsParams) SetDisplaytext(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["displaytext"] = v
+	return
+}
+
+func (p *ListVPCOfferingsParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ListVPCOfferingsParams) SetIsdefault(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isdefault"] = v
+	return
+}
+
+func (p *ListVPCOfferingsParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListVPCOfferingsParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *ListVPCOfferingsParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListVPCOfferingsParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListVPCOfferingsParams) SetState(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["state"] = v
+	return
+}
+
+func (p *ListVPCOfferingsParams) SetSupportedservices(v []string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["supportedservices"] = v
+	return
+}
+
+// You should always use this function to get a new ListVPCOfferingsParams instance,
+// as then you are sure you have configured all required params
+func (s *VPCService) NewListVPCOfferingsParams() *ListVPCOfferingsParams {
+	p := &ListVPCOfferingsParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *VPCService) GetVPCOfferingID(name string, opts ...OptionFunc) (string, int, error) {
+	p := &ListVPCOfferingsParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["name"] = name
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return "", -1, err
+		}
+	}
+
+	l, err := s.ListVPCOfferings(p)
+	if err != nil {
+		return "", -1, err
+	}
+
+	if l.Count == 0 {
+		return "", l.Count, fmt.Errorf("No match found for %s: %+v", name, l)
+	}
+
+	if l.Count == 1 {
+		return l.VPCOfferings[0].Id, l.Count, nil
+	}
+
+	if l.Count > 1 {
+		for _, v := range l.VPCOfferings {
+			if v.Name == name {
+				return v.Id, l.Count, nil
+			}
+		}
+	}
+	return "", l.Count, fmt.Errorf("Could not find an exact match for %s: %+v", name, l)
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *VPCService) GetVPCOfferingByName(name string, opts ...OptionFunc) (*VPCOffering, int, error) {
+	id, count, err := s.GetVPCOfferingID(name, opts...)
+	if err != nil {
+		return nil, count, err
+	}
+
+	r, count, err := s.GetVPCOfferingByID(id, opts...)
+	if err != nil {
+		return nil, count, err
+	}
+	return r, count, nil
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *VPCService) GetVPCOfferingByID(id string, opts ...OptionFunc) (*VPCOffering, int, error) {
+	p := &ListVPCOfferingsParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["id"] = id
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return nil, -1, err
+		}
+	}
+
+	l, err := s.ListVPCOfferings(p)
+	if err != nil {
+		if strings.Contains(err.Error(), fmt.Sprintf(
+			"Invalid parameter id value=%s due to incorrect long value format, "+
+				"or entity does not exist", id)) {
+			return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
+		}
+		return nil, -1, err
+	}
+
+	if l.Count == 0 {
+		return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
+	}
+
+	if l.Count == 1 {
+		return l.VPCOfferings[0], l.Count, nil
+	}
+	return nil, l.Count, fmt.Errorf("There is more then one result for VPCOffering UUID: %s!", id)
+}
+
+// Lists VPC offerings
+func (s *VPCService) ListVPCOfferings(p *ListVPCOfferingsParams) (*ListVPCOfferingsResponse, error) {
+	resp, err := s.cs.newRequest("listVPCOfferings", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListVPCOfferingsResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListVPCOfferingsResponse struct {
+	Count        int            `json:"count"`
+	VPCOfferings []*VPCOffering `json:"vpcoffering"`
+}
+
+type VPCOffering struct {
+	Created              string `json:"created"`
+	Displaytext          string `json:"displaytext"`
+	Distributedvpcrouter bool   `json:"distributedvpcrouter"`
+	Id                   string `json:"id"`
+	Isdefault            bool   `json:"isdefault"`
+	Name                 string `json:"name"`
+	Service              []struct {
+		Capability []struct {
+			Canchooseservicecapability bool   `json:"canchooseservicecapability"`
+			Name                       string `json:"name"`
+			Value                      string `json:"value"`
+		} `json:"capability"`
+		Name     string `json:"name"`
+		Provider []struct {
+			Canenableindividualservice   bool     `json:"canenableindividualservice"`
+			Destinationphysicalnetworkid string   `json:"destinationphysicalnetworkid"`
+			Id                           string   `json:"id"`
+			Name                         string   `json:"name"`
+			Physicalnetworkid            string   `json:"physicalnetworkid"`
+			Servicelist                  []string `json:"servicelist"`
+			State                        string   `json:"state"`
+		} `json:"provider"`
+	} `json:"service"`
+	State                  string `json:"state"`
+	SupportsregionLevelvpc bool   `json:"supportsregionLevelvpc"`
+}
+
+type ListVPCsParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListVPCsParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["cidr"]; found {
+		u.Set("cidr", v.(string))
+	}
+	if v, found := p.p["displaytext"]; found {
+		u.Set("displaytext", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["fordisplay"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("fordisplay", vv)
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["isrecursive"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("isrecursive", vv)
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["listall"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("listall", vv)
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["projectid"]; found {
+		u.Set("projectid", v.(string))
+	}
+	if v, found := p.p["restartrequired"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("restartrequired", vv)
+	}
+	if v, found := p.p["state"]; found {
+		u.Set("state", v.(string))
+	}
+	if v, found := p.p["supportedservices"]; found {
+		vv := strings.Join(v.([]string), ",")
+		u.Set("supportedservices", vv)
+	}
+	if v, found := p.p["tags"]; found {
+		i := 0
+		for k, vv := range v.(map[string]string) {
+			u.Set(fmt.Sprintf("tags[%d].key", i), k)
+			u.Set(fmt.Sprintf("tags[%d].value", i), vv)
+			i++
+		}
+	}
+	if v, found := p.p["vpcofferingid"]; found {
+		u.Set("vpcofferingid", v.(string))
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *ListVPCsParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *ListVPCsParams) SetCidr(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["cidr"] = v
+	return
+}
+
+func (p *ListVPCsParams) SetDisplaytext(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["displaytext"] = v
+	return
+}
+
+func (p *ListVPCsParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *ListVPCsParams) SetFordisplay(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["fordisplay"] = v
+	return
+}
+
+func (p *ListVPCsParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ListVPCsParams) SetIsrecursive(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isrecursive"] = v
+	return
+}
+
+func (p *ListVPCsParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListVPCsParams) SetListall(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["listall"] = v
+	return
+}
+
+func (p *ListVPCsParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *ListVPCsParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListVPCsParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListVPCsParams) SetProjectid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectid"] = v
+	return
+}
+
+func (p *ListVPCsParams) SetRestartrequired(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["restartrequired"] = v
+	return
+}
+
+func (p *ListVPCsParams) SetState(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["state"] = v
+	return
+}
+
+func (p *ListVPCsParams) SetSupportedservices(v []string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["supportedservices"] = v
+	return
+}
+
+func (p *ListVPCsParams) SetTags(v map[string]string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["tags"] = v
+	return
+}
+
+func (p *ListVPCsParams) SetVpcofferingid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["vpcofferingid"] = v
+	return
+}
+
+func (p *ListVPCsParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new ListVPCsParams instance,
+// as then you are sure you have configured all required params
+func (s *VPCService) NewListVPCsParams() *ListVPCsParams {
+	p := &ListVPCsParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *VPCService) GetVPCID(name string, opts ...OptionFunc) (string, int, error) {
+	p := &ListVPCsParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["name"] = name
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return "", -1, err
+		}
+	}
+
+	l, err := s.ListVPCs(p)
+	if err != nil {
+		return "", -1, err
+	}
+
+	if l.Count == 0 {
+		return "", l.Count, fmt.Errorf("No match found for %s: %+v", name, l)
+	}
+
+	if l.Count == 1 {
+		return l.VPCs[0].Id, l.Count, nil
+	}
+
+	if l.Count > 1 {
+		for _, v := range l.VPCs {
+			if v.Name == name {
+				return v.Id, l.Count, nil
+			}
+		}
+	}
+	return "", l.Count, fmt.Errorf("Could not find an exact match for %s: %+v", name, l)
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *VPCService) GetVPCByName(name string, opts ...OptionFunc) (*VPC, int, error) {
+	id, count, err := s.GetVPCID(name, opts...)
+	if err != nil {
+		return nil, count, err
+	}
+
+	r, count, err := s.GetVPCByID(id, opts...)
+	if err != nil {
+		return nil, count, err
+	}
+	return r, count, nil
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *VPCService) GetVPCByID(id string, opts ...OptionFunc) (*VPC, int, error) {
+	p := &ListVPCsParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["id"] = id
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return nil, -1, err
+		}
+	}
+
+	l, err := s.ListVPCs(p)
+	if err != nil {
+		if strings.Contains(err.Error(), fmt.Sprintf(
+			"Invalid parameter id value=%s due to incorrect long value format, "+
+				"or entity does not exist", id)) {
+			return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
+		}
+		return nil, -1, err
+	}
+
+	if l.Count == 0 {
+		return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
+	}
+
+	if l.Count == 1 {
+		return l.VPCs[0], l.Count, nil
+	}
+	return nil, l.Count, fmt.Errorf("There is more then one result for VPC UUID: %s!", id)
+}
+
+// Lists VPCs
+func (s *VPCService) ListVPCs(p *ListVPCsParams) (*ListVPCsResponse, error) {
+	resp, err := s.cs.newRequest("listVPCs", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListVPCsResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListVPCsResponse struct {
+	Count int    `json:"count"`
+	VPCs  []*VPC `json:"vpc"`
+}
+
+type VPC struct {
+	Account              string `json:"account"`
+	Cidr                 string `json:"cidr"`
+	Created              string `json:"created"`
+	Displaytext          string `json:"displaytext"`
+	Distributedvpcrouter bool   `json:"distributedvpcrouter"`
+	Domain               string `json:"domain"`
+	Domainid             string `json:"domainid"`
+	Fordisplay           bool   `json:"fordisplay"`
+	Id                   string `json:"id"`
+	Name                 string `json:"name"`
+	Network              []struct {
+		Account                     string `json:"account"`
+		Aclid                       string `json:"aclid"`
+		Acltype                     string `json:"acltype"`
+		Broadcastdomaintype         string `json:"broadcastdomaintype"`
+		Broadcasturi                string `json:"broadcasturi"`
+		Canusefordeploy             bool   `json:"canusefordeploy"`
+		Cidr                        string `json:"cidr"`
+		Displaynetwork              bool   `json:"displaynetwork"`
+		Displaytext                 string `json:"displaytext"`
+		Dns1                        string `json:"dns1"`
+		Dns2                        string `json:"dns2"`
+		Domain                      string `json:"domain"`
+		Domainid                    string `json:"domainid"`
+		Gateway                     string `json:"gateway"`
+		Id                          string `json:"id"`
+		Ip6cidr                     string `json:"ip6cidr"`
+		Ip6gateway                  string `json:"ip6gateway"`
+		Isdefault                   bool   `json:"isdefault"`
+		Ispersistent                bool   `json:"ispersistent"`
+		Issystem                    bool   `json:"issystem"`
+		Name                        string `json:"name"`
+		Netmask                     string `json:"netmask"`
+		Networkcidr                 string `json:"networkcidr"`
+		Networkdomain               string `json:"networkdomain"`
+		Networkofferingavailability string `json:"networkofferingavailability"`
+		Networkofferingconservemode bool   `json:"networkofferingconservemode"`
+		Networkofferingdisplaytext  string `json:"networkofferingdisplaytext"`
+		Networkofferingid           string `json:"networkofferingid"`
+		Networkofferingname         string `json:"networkofferingname"`
+		Physicalnetworkid           string `json:"physicalnetworkid"`
+		Project                     string `json:"project"`
+		Projectid                   string `json:"projectid"`
+		Related                     string `json:"related"`
+		Reservediprange             string `json:"reservediprange"`
+		Restartrequired             bool   `json:"restartrequired"`
+		Service                     []struct {
+			Capability []struct {
+				Canchooseservicecapability bool   `json:"canchooseservicecapability"`
+				Name                       string `json:"name"`
+				Value                      string `json:"value"`
+			} `json:"capability"`
+			Name     string `json:"name"`
+			Provider []struct {
+				Canenableindividualservice   bool     `json:"canenableindividualservice"`
+				Destinationphysicalnetworkid string   `json:"destinationphysicalnetworkid"`
+				Id                           string   `json:"id"`
+				Name                         string   `json:"name"`
+				Physicalnetworkid            string   `json:"physicalnetworkid"`
+				Servicelist                  []string `json:"servicelist"`
+				State                        string   `json:"state"`
+			} `json:"provider"`
+		} `json:"service"`
+		Specifyipranges  bool   `json:"specifyipranges"`
+		State            string `json:"state"`
+		Strechedl2subnet bool   `json:"strechedl2subnet"`
+		Subdomainaccess  bool   `json:"subdomainaccess"`
+		Tags             []struct {
+			Account      string `json:"account"`
+			Customer     string `json:"customer"`
+			Domain       string `json:"domain"`
+			Domainid     string `json:"domainid"`
+			Key          string `json:"key"`
+			Project      string `json:"project"`
+			Projectid    string `json:"projectid"`
+			Resourceid   string `json:"resourceid"`
+			Resourcetype string `json:"resourcetype"`
+			Value        string `json:"value"`
+		} `json:"tags"`
+		Traffictype       string        `json:"traffictype"`
+		Type              string        `json:"type"`
+		Vlan              string        `json:"vlan"`
+		Vpcid             string        `json:"vpcid"`
+		Zoneid            string        `json:"zoneid"`
+		Zonename          string        `json:"zonename"`
+		Zonesnetworkspans []interface{} `json:"zonesnetworkspans"`
+	} `json:"network"`
+	Networkdomain      string `json:"networkdomain"`
+	Project            string `json:"project"`
+	Projectid          string `json:"projectid"`
+	Redundantvpcrouter bool   `json:"redundantvpcrouter"`
+	Regionlevelvpc     bool   `json:"regionlevelvpc"`
+	Restartrequired    bool   `json:"restartrequired"`
+	Service            []struct {
+		Capability []struct {
+			Canchooseservicecapability bool   `json:"canchooseservicecapability"`
+			Name                       string `json:"name"`
+			Value                      string `json:"value"`
+		} `json:"capability"`
+		Name     string `json:"name"`
+		Provider []struct {
+			Canenableindividualservice   bool     `json:"canenableindividualservice"`
+			Destinationphysicalnetworkid string   `json:"destinationphysicalnetworkid"`
+			Id                           string   `json:"id"`
+			Name                         string   `json:"name"`
+			Physicalnetworkid            string   `json:"physicalnetworkid"`
+			Servicelist                  []string `json:"servicelist"`
+			State                        string   `json:"state"`
+		} `json:"provider"`
+	} `json:"service"`
+	State string `json:"state"`
+	Tags  []struct {
+		Account      string `json:"account"`
+		Customer     string `json:"customer"`
+		Domain       string `json:"domain"`
+		Domainid     string `json:"domainid"`
+		Key          string `json:"key"`
+		Project      string `json:"project"`
+		Projectid    string `json:"projectid"`
+		Resourceid   string `json:"resourceid"`
+		Resourcetype string `json:"resourcetype"`
+		Value        string `json:"value"`
+	} `json:"tags"`
+	Vpcofferingid string `json:"vpcofferingid"`
+	Zoneid        string `json:"zoneid"`
+	Zonename      string `json:"zonename"`
+}
+
+type RestartVPCParams struct {
+	p map[string]interface{}
+}
+
+func (p *RestartVPCParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["cleanup"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("cleanup", vv)
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["makeredundant"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("makeredundant", vv)
+	}
+	return u
+}
+
+func (p *RestartVPCParams) SetCleanup(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["cleanup"] = v
+	return
+}
+
+func (p *RestartVPCParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *RestartVPCParams) SetMakeredundant(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["makeredundant"] = v
+	return
+}
+
+// You should always use this function to get a new RestartVPCParams instance,
+// as then you are sure you have configured all required params
+func (s *VPCService) NewRestartVPCParams(id string) *RestartVPCParams {
+	p := &RestartVPCParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Restarts a VPC
+func (s *VPCService) RestartVPC(p *RestartVPCParams) (*RestartVPCResponse, error) {
+	resp, err := s.cs.newRequest("restartVPC", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r RestartVPCResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type RestartVPCResponse struct {
+	JobID                string `json:"jobid"`
+	Account              string `json:"account"`
+	Cidr                 string `json:"cidr"`
+	Created              string `json:"created"`
+	Displaytext          string `json:"displaytext"`
+	Distributedvpcrouter bool   `json:"distributedvpcrouter"`
+	Domain               string `json:"domain"`
+	Domainid             string `json:"domainid"`
+	Fordisplay           bool   `json:"fordisplay"`
+	Id                   string `json:"id"`
+	Name                 string `json:"name"`
+	Network              []struct {
+		Account                     string `json:"account"`
+		Aclid                       string `json:"aclid"`
+		Acltype                     string `json:"acltype"`
+		Broadcastdomaintype         string `json:"broadcastdomaintype"`
+		Broadcasturi                string `json:"broadcasturi"`
+		Canusefordeploy             bool   `json:"canusefordeploy"`
+		Cidr                        string `json:"cidr"`
+		Displaynetwork              bool   `json:"displaynetwork"`
+		Displaytext                 string `json:"displaytext"`
+		Dns1                        string `json:"dns1"`
+		Dns2                        string `json:"dns2"`
+		Domain                      string `json:"domain"`
+		Domainid                    string `json:"domainid"`
+		Gateway                     string `json:"gateway"`
+		Id                          string `json:"id"`
+		Ip6cidr                     string `json:"ip6cidr"`
+		Ip6gateway                  string `json:"ip6gateway"`
+		Isdefault                   bool   `json:"isdefault"`
+		Ispersistent                bool   `json:"ispersistent"`
+		Issystem                    bool   `json:"issystem"`
+		Name                        string `json:"name"`
+		Netmask                     string `json:"netmask"`
+		Networkcidr                 string `json:"networkcidr"`
+		Networkdomain               string `json:"networkdomain"`
+		Networkofferingavailability string `json:"networkofferingavailability"`
+		Networkofferingconservemode bool   `json:"networkofferingconservemode"`
+		Networkofferingdisplaytext  string `json:"networkofferingdisplaytext"`
+		Networkofferingid           string `json:"networkofferingid"`
+		Networkofferingname         string `json:"networkofferingname"`
+		Physicalnetworkid           string `json:"physicalnetworkid"`
+		Project                     string `json:"project"`
+		Projectid                   string `json:"projectid"`
+		Related                     string `json:"related"`
+		Reservediprange             string `json:"reservediprange"`
+		Restartrequired             bool   `json:"restartrequired"`
+		Service                     []struct {
+			Capability []struct {
+				Canchooseservicecapability bool   `json:"canchooseservicecapability"`
+				Name                       string `json:"name"`
+				Value                      string `json:"value"`
+			} `json:"capability"`
+			Name     string `json:"name"`
+			Provider []struct {
+				Canenableindividualservice   bool     `json:"canenableindividualservice"`
+				Destinationphysicalnetworkid string   `json:"destinationphysicalnetworkid"`
+				Id                           string   `json:"id"`
+				Name                         string   `json:"name"`
+				Physicalnetworkid            string   `json:"physicalnetworkid"`
+				Servicelist                  []string `json:"servicelist"`
+				State                        string   `json:"state"`
+			} `json:"provider"`
+		} `json:"service"`
+		Specifyipranges  bool   `json:"specifyipranges"`
+		State            string `json:"state"`
+		Strechedl2subnet bool   `json:"strechedl2subnet"`
+		Subdomainaccess  bool   `json:"subdomainaccess"`
+		Tags             []struct {
+			Account      string `json:"account"`
+			Customer     string `json:"customer"`
+			Domain       string `json:"domain"`
+			Domainid     string `json:"domainid"`
+			Key          string `json:"key"`
+			Project      string `json:"project"`
+			Projectid    string `json:"projectid"`
+			Resourceid   string `json:"resourceid"`
+			Resourcetype string `json:"resourcetype"`
+			Value        string `json:"value"`
+		} `json:"tags"`
+		Traffictype       string        `json:"traffictype"`
+		Type              string        `json:"type"`
+		Vlan              string        `json:"vlan"`
+		Vpcid             string        `json:"vpcid"`
+		Zoneid            string        `json:"zoneid"`
+		Zonename          string        `json:"zonename"`
+		Zonesnetworkspans []interface{} `json:"zonesnetworkspans"`
+	} `json:"network"`
+	Networkdomain      string `json:"networkdomain"`
+	Project            string `json:"project"`
+	Projectid          string `json:"projectid"`
+	Redundantvpcrouter bool   `json:"redundantvpcrouter"`
+	Regionlevelvpc     bool   `json:"regionlevelvpc"`
+	Restartrequired    bool   `json:"restartrequired"`
+	Service            []struct {
+		Capability []struct {
+			Canchooseservicecapability bool   `json:"canchooseservicecapability"`
+			Name                       string `json:"name"`
+			Value                      string `json:"value"`
+		} `json:"capability"`
+		Name     string `json:"name"`
+		Provider []struct {
+			Canenableindividualservice   bool     `json:"canenableindividualservice"`
+			Destinationphysicalnetworkid string   `json:"destinationphysicalnetworkid"`
+			Id                           string   `json:"id"`
+			Name                         string   `json:"name"`
+			Physicalnetworkid            string   `json:"physicalnetworkid"`
+			Servicelist                  []string `json:"servicelist"`
+			State                        string   `json:"state"`
+		} `json:"provider"`
+	} `json:"service"`
+	State string `json:"state"`
+	Tags  []struct {
+		Account      string `json:"account"`
+		Customer     string `json:"customer"`
+		Domain       string `json:"domain"`
+		Domainid     string `json:"domainid"`
+		Key          string `json:"key"`
+		Project      string `json:"project"`
+		Projectid    string `json:"projectid"`
+		Resourceid   string `json:"resourceid"`
+		Resourcetype string `json:"resourcetype"`
+		Value        string `json:"value"`
+	} `json:"tags"`
+	Vpcofferingid string `json:"vpcofferingid"`
+	Zoneid        string `json:"zoneid"`
+	Zonename      string `json:"zonename"`
+}
+
+type UpdateVPCParams struct {
+	p map[string]interface{}
+}
+
+func (p *UpdateVPCParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["customid"]; found {
+		u.Set("customid", v.(string))
+	}
+	if v, found := p.p["displaytext"]; found {
+		u.Set("displaytext", v.(string))
+	}
+	if v, found := p.p["fordisplay"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("fordisplay", vv)
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	return u
+}
+
+func (p *UpdateVPCParams) SetCustomid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["customid"] = v
+	return
+}
+
+func (p *UpdateVPCParams) SetDisplaytext(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["displaytext"] = v
+	return
+}
+
+func (p *UpdateVPCParams) SetFordisplay(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["fordisplay"] = v
+	return
+}
+
+func (p *UpdateVPCParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *UpdateVPCParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+// You should always use this function to get a new UpdateVPCParams instance,
+// as then you are sure you have configured all required params
+func (s *VPCService) NewUpdateVPCParams(id string) *UpdateVPCParams {
+	p := &UpdateVPCParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Updates a VPC
+func (s *VPCService) UpdateVPC(p *UpdateVPCParams) (*UpdateVPCResponse, error) {
+	resp, err := s.cs.newRequest("updateVPC", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r UpdateVPCResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type UpdateVPCResponse struct {
+	JobID                string `json:"jobid"`
+	Account              string `json:"account"`
+	Cidr                 string `json:"cidr"`
+	Created              string `json:"created"`
+	Displaytext          string `json:"displaytext"`
+	Distributedvpcrouter bool   `json:"distributedvpcrouter"`
+	Domain               string `json:"domain"`
+	Domainid             string `json:"domainid"`
+	Fordisplay           bool   `json:"fordisplay"`
+	Id                   string `json:"id"`
+	Name                 string `json:"name"`
+	Network              []struct {
+		Account                     string `json:"account"`
+		Aclid                       string `json:"aclid"`
+		Acltype                     string `json:"acltype"`
+		Broadcastdomaintype         string `json:"broadcastdomaintype"`
+		Broadcasturi                string `json:"broadcasturi"`
+		Canusefordeploy             bool   `json:"canusefordeploy"`
+		Cidr                        string `json:"cidr"`
+		Displaynetwork              bool   `json:"displaynetwork"`
+		Displaytext                 string `json:"displaytext"`
+		Dns1                        string `json:"dns1"`
+		Dns2                        string `json:"dns2"`
+		Domain                      string `json:"domain"`
+		Domainid                    string `json:"domainid"`
+		Gateway                     string `json:"gateway"`
+		Id                          string `json:"id"`
+		Ip6cidr                     string `json:"ip6cidr"`
+		Ip6gateway                  string `json:"ip6gateway"`
+		Isdefault                   bool   `json:"isdefault"`
+		Ispersistent                bool   `json:"ispersistent"`
+		Issystem                    bool   `json:"issystem"`
+		Name                        string `json:"name"`
+		Netmask                     string `json:"netmask"`
+		Networkcidr                 string `json:"networkcidr"`
+		Networkdomain               string `json:"networkdomain"`
+		Networkofferingavailability string `json:"networkofferingavailability"`
+		Networkofferingconservemode bool   `json:"networkofferingconservemode"`
+		Networkofferingdisplaytext  string `json:"networkofferingdisplaytext"`
+		Networkofferingid           string `json:"networkofferingid"`
+		Networkofferingname         string `json:"networkofferingname"`
+		Physicalnetworkid           string `json:"physicalnetworkid"`
+		Project                     string `json:"project"`
+		Projectid                   string `json:"projectid"`
+		Related                     string `json:"related"`
+		Reservediprange             string `json:"reservediprange"`
+		Restartrequired             bool   `json:"restartrequired"`
+		Service                     []struct {
+			Capability []struct {
+				Canchooseservicecapability bool   `json:"canchooseservicecapability"`
+				Name                       string `json:"name"`
+				Value                      string `json:"value"`
+			} `json:"capability"`
+			Name     string `json:"name"`
+			Provider []struct {
+				Canenableindividualservice   bool     `json:"canenableindividualservice"`
+				Destinationphysicalnetworkid string   `json:"destinationphysicalnetworkid"`
+				Id                           string   `json:"id"`
+				Name                         string   `json:"name"`
+				Physicalnetworkid            string   `json:"physicalnetworkid"`
+				Servicelist                  []string `json:"servicelist"`
+				State                        string   `json:"state"`
+			} `json:"provider"`
+		} `json:"service"`
+		Specifyipranges  bool   `json:"specifyipranges"`
+		State            string `json:"state"`
+		Strechedl2subnet bool   `json:"strechedl2subnet"`
+		Subdomainaccess  bool   `json:"subdomainaccess"`
+		Tags             []struct {
+			Account      string `json:"account"`
+			Customer     string `json:"customer"`
+			Domain       string `json:"domain"`
+			Domainid     string `json:"domainid"`
+			Key          string `json:"key"`
+			Project      string `json:"project"`
+			Projectid    string `json:"projectid"`
+			Resourceid   string `json:"resourceid"`
+			Resourcetype string `json:"resourcetype"`
+			Value        string `json:"value"`
+		} `json:"tags"`
+		Traffictype       string        `json:"traffictype"`
+		Type              string        `json:"type"`
+		Vlan              string        `json:"vlan"`
+		Vpcid             string        `json:"vpcid"`
+		Zoneid            string        `json:"zoneid"`
+		Zonename          string        `json:"zonename"`
+		Zonesnetworkspans []interface{} `json:"zonesnetworkspans"`
+	} `json:"network"`
+	Networkdomain      string `json:"networkdomain"`
+	Project            string `json:"project"`
+	Projectid          string `json:"projectid"`
+	Redundantvpcrouter bool   `json:"redundantvpcrouter"`
+	Regionlevelvpc     bool   `json:"regionlevelvpc"`
+	Restartrequired    bool   `json:"restartrequired"`
+	Service            []struct {
+		Capability []struct {
+			Canchooseservicecapability bool   `json:"canchooseservicecapability"`
+			Name                       string `json:"name"`
+			Value                      string `json:"value"`
+		} `json:"capability"`
+		Name     string `json:"name"`
+		Provider []struct {
+			Canenableindividualservice   bool     `json:"canenableindividualservice"`
+			Destinationphysicalnetworkid string   `json:"destinationphysicalnetworkid"`
+			Id                           string   `json:"id"`
+			Name                         string   `json:"name"`
+			Physicalnetworkid            string   `json:"physicalnetworkid"`
+			Servicelist                  []string `json:"servicelist"`
+			State                        string   `json:"state"`
+		} `json:"provider"`
+	} `json:"service"`
+	State string `json:"state"`
+	Tags  []struct {
+		Account      string `json:"account"`
+		Customer     string `json:"customer"`
+		Domain       string `json:"domain"`
+		Domainid     string `json:"domainid"`
+		Key          string `json:"key"`
+		Project      string `json:"project"`
+		Projectid    string `json:"projectid"`
+		Resourceid   string `json:"resourceid"`
+		Resourcetype string `json:"resourcetype"`
+		Value        string `json:"value"`
+	} `json:"tags"`
+	Vpcofferingid string `json:"vpcofferingid"`
+	Zoneid        string `json:"zoneid"`
+	Zonename      string `json:"zonename"`
+}
+
+type UpdateVPCOfferingParams struct {
+	p map[string]interface{}
+}
+
+func (p *UpdateVPCOfferingParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["displaytext"]; found {
+		u.Set("displaytext", v.(string))
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["state"]; found {
+		u.Set("state", v.(string))
+	}
+	return u
+}
+
+func (p *UpdateVPCOfferingParams) SetDisplaytext(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["displaytext"] = v
+	return
+}
+
+func (p *UpdateVPCOfferingParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *UpdateVPCOfferingParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *UpdateVPCOfferingParams) SetState(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["state"] = v
+	return
+}
+
+// You should always use this function to get a new UpdateVPCOfferingParams instance,
+// as then you are sure you have configured all required params
+func (s *VPCService) NewUpdateVPCOfferingParams(id string) *UpdateVPCOfferingParams {
+	p := &UpdateVPCOfferingParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Updates VPC offering
+func (s *VPCService) UpdateVPCOffering(p *UpdateVPCOfferingParams) (*UpdateVPCOfferingResponse, error) {
+	resp, err := s.cs.newRequest("updateVPCOffering", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r UpdateVPCOfferingResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type UpdateVPCOfferingResponse struct {
+	JobID                string `json:"jobid"`
+	Created              string `json:"created"`
+	Displaytext          string `json:"displaytext"`
+	Distributedvpcrouter bool   `json:"distributedvpcrouter"`
+	Id                   string `json:"id"`
+	Isdefault            bool   `json:"isdefault"`
+	Name                 string `json:"name"`
+	Service              []struct {
+		Capability []struct {
+			Canchooseservicecapability bool   `json:"canchooseservicecapability"`
+			Name                       string `json:"name"`
+			Value                      string `json:"value"`
+		} `json:"capability"`
+		Name     string `json:"name"`
+		Provider []struct {
+			Canenableindividualservice   bool     `json:"canenableindividualservice"`
+			Destinationphysicalnetworkid string   `json:"destinationphysicalnetworkid"`
+			Id                           string   `json:"id"`
+			Name                         string   `json:"name"`
+			Physicalnetworkid            string   `json:"physicalnetworkid"`
+			Servicelist                  []string `json:"servicelist"`
+			State                        string   `json:"state"`
+		} `json:"provider"`
+	} `json:"service"`
+	State                  string `json:"state"`
+	SupportsregionLevelvpc bool   `json:"supportsregionLevelvpc"`
+}
diff --git a/vendor/github.com/xanzy/go-cloudstack/cloudstack/VPNService.go b/vendor/github.com/xanzy/go-cloudstack/cloudstack/VPNService.go
new file mode 100644
index 0000000..796de85
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/cloudstack/VPNService.go
@@ -0,0 +1,2894 @@
+//
+// Copyright 2018, Sander van Harmelen
+//
+// Licensed 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 cloudstack
+
+import (
+	"encoding/json"
+	"fmt"
+	"net/url"
+	"strconv"
+	"strings"
+)
+
+type AddVpnUserParams struct {
+	p map[string]interface{}
+}
+
+func (p *AddVpnUserParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["password"]; found {
+		u.Set("password", v.(string))
+	}
+	if v, found := p.p["projectid"]; found {
+		u.Set("projectid", v.(string))
+	}
+	if v, found := p.p["username"]; found {
+		u.Set("username", v.(string))
+	}
+	return u
+}
+
+func (p *AddVpnUserParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *AddVpnUserParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *AddVpnUserParams) SetPassword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["password"] = v
+	return
+}
+
+func (p *AddVpnUserParams) SetProjectid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectid"] = v
+	return
+}
+
+func (p *AddVpnUserParams) SetUsername(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["username"] = v
+	return
+}
+
+// You should always use this function to get a new AddVpnUserParams instance,
+// as then you are sure you have configured all required params
+func (s *VPNService) NewAddVpnUserParams(password string, username string) *AddVpnUserParams {
+	p := &AddVpnUserParams{}
+	p.p = make(map[string]interface{})
+	p.p["password"] = password
+	p.p["username"] = username
+	return p
+}
+
+// Adds vpn users
+func (s *VPNService) AddVpnUser(p *AddVpnUserParams) (*AddVpnUserResponse, error) {
+	resp, err := s.cs.newRequest("addVpnUser", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r AddVpnUserResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type AddVpnUserResponse struct {
+	JobID     string `json:"jobid"`
+	Account   string `json:"account"`
+	Domain    string `json:"domain"`
+	Domainid  string `json:"domainid"`
+	Id        string `json:"id"`
+	Project   string `json:"project"`
+	Projectid string `json:"projectid"`
+	State     string `json:"state"`
+	Username  string `json:"username"`
+}
+
+type CreateRemoteAccessVpnParams struct {
+	p map[string]interface{}
+}
+
+func (p *CreateRemoteAccessVpnParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["fordisplay"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("fordisplay", vv)
+	}
+	if v, found := p.p["iprange"]; found {
+		u.Set("iprange", v.(string))
+	}
+	if v, found := p.p["openfirewall"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("openfirewall", vv)
+	}
+	if v, found := p.p["publicipid"]; found {
+		u.Set("publicipid", v.(string))
+	}
+	return u
+}
+
+func (p *CreateRemoteAccessVpnParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *CreateRemoteAccessVpnParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *CreateRemoteAccessVpnParams) SetFordisplay(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["fordisplay"] = v
+	return
+}
+
+func (p *CreateRemoteAccessVpnParams) SetIprange(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["iprange"] = v
+	return
+}
+
+func (p *CreateRemoteAccessVpnParams) SetOpenfirewall(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["openfirewall"] = v
+	return
+}
+
+func (p *CreateRemoteAccessVpnParams) SetPublicipid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["publicipid"] = v
+	return
+}
+
+// You should always use this function to get a new CreateRemoteAccessVpnParams instance,
+// as then you are sure you have configured all required params
+func (s *VPNService) NewCreateRemoteAccessVpnParams(publicipid string) *CreateRemoteAccessVpnParams {
+	p := &CreateRemoteAccessVpnParams{}
+	p.p = make(map[string]interface{})
+	p.p["publicipid"] = publicipid
+	return p
+}
+
+// Creates a l2tp/ipsec remote access vpn
+func (s *VPNService) CreateRemoteAccessVpn(p *CreateRemoteAccessVpnParams) (*CreateRemoteAccessVpnResponse, error) {
+	resp, err := s.cs.newRequest("createRemoteAccessVpn", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r CreateRemoteAccessVpnResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type CreateRemoteAccessVpnResponse struct {
+	JobID        string `json:"jobid"`
+	Account      string `json:"account"`
+	Domain       string `json:"domain"`
+	Domainid     string `json:"domainid"`
+	Fordisplay   bool   `json:"fordisplay"`
+	Id           string `json:"id"`
+	Iprange      string `json:"iprange"`
+	Presharedkey string `json:"presharedkey"`
+	Project      string `json:"project"`
+	Projectid    string `json:"projectid"`
+	Publicip     string `json:"publicip"`
+	Publicipid   string `json:"publicipid"`
+	State        string `json:"state"`
+}
+
+type CreateVpnConnectionParams struct {
+	p map[string]interface{}
+}
+
+func (p *CreateVpnConnectionParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["fordisplay"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("fordisplay", vv)
+	}
+	if v, found := p.p["passive"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("passive", vv)
+	}
+	if v, found := p.p["s2scustomergatewayid"]; found {
+		u.Set("s2scustomergatewayid", v.(string))
+	}
+	if v, found := p.p["s2svpngatewayid"]; found {
+		u.Set("s2svpngatewayid", v.(string))
+	}
+	return u
+}
+
+func (p *CreateVpnConnectionParams) SetFordisplay(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["fordisplay"] = v
+	return
+}
+
+func (p *CreateVpnConnectionParams) SetPassive(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["passive"] = v
+	return
+}
+
+func (p *CreateVpnConnectionParams) SetS2scustomergatewayid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["s2scustomergatewayid"] = v
+	return
+}
+
+func (p *CreateVpnConnectionParams) SetS2svpngatewayid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["s2svpngatewayid"] = v
+	return
+}
+
+// You should always use this function to get a new CreateVpnConnectionParams instance,
+// as then you are sure you have configured all required params
+func (s *VPNService) NewCreateVpnConnectionParams(s2scustomergatewayid string, s2svpngatewayid string) *CreateVpnConnectionParams {
+	p := &CreateVpnConnectionParams{}
+	p.p = make(map[string]interface{})
+	p.p["s2scustomergatewayid"] = s2scustomergatewayid
+	p.p["s2svpngatewayid"] = s2svpngatewayid
+	return p
+}
+
+// Create site to site vpn connection
+func (s *VPNService) CreateVpnConnection(p *CreateVpnConnectionParams) (*CreateVpnConnectionResponse, error) {
+	resp, err := s.cs.newRequest("createVpnConnection", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r CreateVpnConnectionResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type CreateVpnConnectionResponse struct {
+	JobID                string `json:"jobid"`
+	Account              string `json:"account"`
+	Cidrlist             string `json:"cidrlist"`
+	Created              string `json:"created"`
+	Domain               string `json:"domain"`
+	Domainid             string `json:"domainid"`
+	Dpd                  bool   `json:"dpd"`
+	Esplifetime          int64  `json:"esplifetime"`
+	Esppolicy            string `json:"esppolicy"`
+	Forceencap           bool   `json:"forceencap"`
+	Fordisplay           bool   `json:"fordisplay"`
+	Gateway              string `json:"gateway"`
+	Id                   string `json:"id"`
+	Ikelifetime          int64  `json:"ikelifetime"`
+	Ikepolicy            string `json:"ikepolicy"`
+	Ipsecpsk             string `json:"ipsecpsk"`
+	Passive              bool   `json:"passive"`
+	Project              string `json:"project"`
+	Projectid            string `json:"projectid"`
+	Publicip             string `json:"publicip"`
+	Removed              string `json:"removed"`
+	S2scustomergatewayid string `json:"s2scustomergatewayid"`
+	S2svpngatewayid      string `json:"s2svpngatewayid"`
+	State                string `json:"state"`
+}
+
+type CreateVpnCustomerGatewayParams struct {
+	p map[string]interface{}
+}
+
+func (p *CreateVpnCustomerGatewayParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["cidrlist"]; found {
+		u.Set("cidrlist", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["dpd"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("dpd", vv)
+	}
+	if v, found := p.p["esplifetime"]; found {
+		vv := strconv.FormatInt(v.(int64), 10)
+		u.Set("esplifetime", vv)
+	}
+	if v, found := p.p["esppolicy"]; found {
+		u.Set("esppolicy", v.(string))
+	}
+	if v, found := p.p["forceencap"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("forceencap", vv)
+	}
+	if v, found := p.p["gateway"]; found {
+		u.Set("gateway", v.(string))
+	}
+	if v, found := p.p["ikelifetime"]; found {
+		vv := strconv.FormatInt(v.(int64), 10)
+		u.Set("ikelifetime", vv)
+	}
+	if v, found := p.p["ikepolicy"]; found {
+		u.Set("ikepolicy", v.(string))
+	}
+	if v, found := p.p["ipsecpsk"]; found {
+		u.Set("ipsecpsk", v.(string))
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["projectid"]; found {
+		u.Set("projectid", v.(string))
+	}
+	return u
+}
+
+func (p *CreateVpnCustomerGatewayParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *CreateVpnCustomerGatewayParams) SetCidrlist(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["cidrlist"] = v
+	return
+}
+
+func (p *CreateVpnCustomerGatewayParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *CreateVpnCustomerGatewayParams) SetDpd(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["dpd"] = v
+	return
+}
+
+func (p *CreateVpnCustomerGatewayParams) SetEsplifetime(v int64) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["esplifetime"] = v
+	return
+}
+
+func (p *CreateVpnCustomerGatewayParams) SetEsppolicy(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["esppolicy"] = v
+	return
+}
+
+func (p *CreateVpnCustomerGatewayParams) SetForceencap(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["forceencap"] = v
+	return
+}
+
+func (p *CreateVpnCustomerGatewayParams) SetGateway(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["gateway"] = v
+	return
+}
+
+func (p *CreateVpnCustomerGatewayParams) SetIkelifetime(v int64) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["ikelifetime"] = v
+	return
+}
+
+func (p *CreateVpnCustomerGatewayParams) SetIkepolicy(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["ikepolicy"] = v
+	return
+}
+
+func (p *CreateVpnCustomerGatewayParams) SetIpsecpsk(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["ipsecpsk"] = v
+	return
+}
+
+func (p *CreateVpnCustomerGatewayParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *CreateVpnCustomerGatewayParams) SetProjectid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectid"] = v
+	return
+}
+
+// You should always use this function to get a new CreateVpnCustomerGatewayParams instance,
+// as then you are sure you have configured all required params
+func (s *VPNService) NewCreateVpnCustomerGatewayParams(cidrlist string, esppolicy string, gateway string, ikepolicy string, ipsecpsk string) *CreateVpnCustomerGatewayParams {
+	p := &CreateVpnCustomerGatewayParams{}
+	p.p = make(map[string]interface{})
+	p.p["cidrlist"] = cidrlist
+	p.p["esppolicy"] = esppolicy
+	p.p["gateway"] = gateway
+	p.p["ikepolicy"] = ikepolicy
+	p.p["ipsecpsk"] = ipsecpsk
+	return p
+}
+
+// Creates site to site vpn customer gateway
+func (s *VPNService) CreateVpnCustomerGateway(p *CreateVpnCustomerGatewayParams) (*CreateVpnCustomerGatewayResponse, error) {
+	resp, err := s.cs.newRequest("createVpnCustomerGateway", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r CreateVpnCustomerGatewayResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type CreateVpnCustomerGatewayResponse struct {
+	JobID       string `json:"jobid"`
+	Account     string `json:"account"`
+	Cidrlist    string `json:"cidrlist"`
+	Domain      string `json:"domain"`
+	Domainid    string `json:"domainid"`
+	Dpd         bool   `json:"dpd"`
+	Esplifetime int64  `json:"esplifetime"`
+	Esppolicy   string `json:"esppolicy"`
+	Forceencap  bool   `json:"forceencap"`
+	Gateway     string `json:"gateway"`
+	Id          string `json:"id"`
+	Ikelifetime int64  `json:"ikelifetime"`
+	Ikepolicy   string `json:"ikepolicy"`
+	Ipaddress   string `json:"ipaddress"`
+	Ipsecpsk    string `json:"ipsecpsk"`
+	Name        string `json:"name"`
+	Project     string `json:"project"`
+	Projectid   string `json:"projectid"`
+	Removed     string `json:"removed"`
+}
+
+type CreateVpnGatewayParams struct {
+	p map[string]interface{}
+}
+
+func (p *CreateVpnGatewayParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["fordisplay"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("fordisplay", vv)
+	}
+	if v, found := p.p["vpcid"]; found {
+		u.Set("vpcid", v.(string))
+	}
+	return u
+}
+
+func (p *CreateVpnGatewayParams) SetFordisplay(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["fordisplay"] = v
+	return
+}
+
+func (p *CreateVpnGatewayParams) SetVpcid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["vpcid"] = v
+	return
+}
+
+// You should always use this function to get a new CreateVpnGatewayParams instance,
+// as then you are sure you have configured all required params
+func (s *VPNService) NewCreateVpnGatewayParams(vpcid string) *CreateVpnGatewayParams {
+	p := &CreateVpnGatewayParams{}
+	p.p = make(map[string]interface{})
+	p.p["vpcid"] = vpcid
+	return p
+}
+
+// Creates site to site vpn local gateway
+func (s *VPNService) CreateVpnGateway(p *CreateVpnGatewayParams) (*CreateVpnGatewayResponse, error) {
+	resp, err := s.cs.newRequest("createVpnGateway", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r CreateVpnGatewayResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type CreateVpnGatewayResponse struct {
+	JobID      string `json:"jobid"`
+	Account    string `json:"account"`
+	Domain     string `json:"domain"`
+	Domainid   string `json:"domainid"`
+	Fordisplay bool   `json:"fordisplay"`
+	Id         string `json:"id"`
+	Project    string `json:"project"`
+	Projectid  string `json:"projectid"`
+	Publicip   string `json:"publicip"`
+	Removed    string `json:"removed"`
+	Vpcid      string `json:"vpcid"`
+}
+
+type DeleteRemoteAccessVpnParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeleteRemoteAccessVpnParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["publicipid"]; found {
+		u.Set("publicipid", v.(string))
+	}
+	return u
+}
+
+func (p *DeleteRemoteAccessVpnParams) SetPublicipid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["publicipid"] = v
+	return
+}
+
+// You should always use this function to get a new DeleteRemoteAccessVpnParams instance,
+// as then you are sure you have configured all required params
+func (s *VPNService) NewDeleteRemoteAccessVpnParams(publicipid string) *DeleteRemoteAccessVpnParams {
+	p := &DeleteRemoteAccessVpnParams{}
+	p.p = make(map[string]interface{})
+	p.p["publicipid"] = publicipid
+	return p
+}
+
+// Destroys a l2tp/ipsec remote access vpn
+func (s *VPNService) DeleteRemoteAccessVpn(p *DeleteRemoteAccessVpnParams) (*DeleteRemoteAccessVpnResponse, error) {
+	resp, err := s.cs.newRequest("deleteRemoteAccessVpn", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeleteRemoteAccessVpnResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type DeleteRemoteAccessVpnResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
+
+type DeleteVpnConnectionParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeleteVpnConnectionParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *DeleteVpnConnectionParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new DeleteVpnConnectionParams instance,
+// as then you are sure you have configured all required params
+func (s *VPNService) NewDeleteVpnConnectionParams(id string) *DeleteVpnConnectionParams {
+	p := &DeleteVpnConnectionParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Delete site to site vpn connection
+func (s *VPNService) DeleteVpnConnection(p *DeleteVpnConnectionParams) (*DeleteVpnConnectionResponse, error) {
+	resp, err := s.cs.newRequest("deleteVpnConnection", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeleteVpnConnectionResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type DeleteVpnConnectionResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
+
+type DeleteVpnCustomerGatewayParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeleteVpnCustomerGatewayParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *DeleteVpnCustomerGatewayParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new DeleteVpnCustomerGatewayParams instance,
+// as then you are sure you have configured all required params
+func (s *VPNService) NewDeleteVpnCustomerGatewayParams(id string) *DeleteVpnCustomerGatewayParams {
+	p := &DeleteVpnCustomerGatewayParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Delete site to site vpn customer gateway
+func (s *VPNService) DeleteVpnCustomerGateway(p *DeleteVpnCustomerGatewayParams) (*DeleteVpnCustomerGatewayResponse, error) {
+	resp, err := s.cs.newRequest("deleteVpnCustomerGateway", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeleteVpnCustomerGatewayResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type DeleteVpnCustomerGatewayResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
+
+type DeleteVpnGatewayParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeleteVpnGatewayParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *DeleteVpnGatewayParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new DeleteVpnGatewayParams instance,
+// as then you are sure you have configured all required params
+func (s *VPNService) NewDeleteVpnGatewayParams(id string) *DeleteVpnGatewayParams {
+	p := &DeleteVpnGatewayParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Delete site to site vpn gateway
+func (s *VPNService) DeleteVpnGateway(p *DeleteVpnGatewayParams) (*DeleteVpnGatewayResponse, error) {
+	resp, err := s.cs.newRequest("deleteVpnGateway", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeleteVpnGatewayResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type DeleteVpnGatewayResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
+
+type ListRemoteAccessVpnsParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListRemoteAccessVpnsParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["fordisplay"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("fordisplay", vv)
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["isrecursive"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("isrecursive", vv)
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["listall"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("listall", vv)
+	}
+	if v, found := p.p["networkid"]; found {
+		u.Set("networkid", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["projectid"]; found {
+		u.Set("projectid", v.(string))
+	}
+	if v, found := p.p["publicipid"]; found {
+		u.Set("publicipid", v.(string))
+	}
+	return u
+}
+
+func (p *ListRemoteAccessVpnsParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *ListRemoteAccessVpnsParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *ListRemoteAccessVpnsParams) SetFordisplay(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["fordisplay"] = v
+	return
+}
+
+func (p *ListRemoteAccessVpnsParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ListRemoteAccessVpnsParams) SetIsrecursive(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isrecursive"] = v
+	return
+}
+
+func (p *ListRemoteAccessVpnsParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListRemoteAccessVpnsParams) SetListall(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["listall"] = v
+	return
+}
+
+func (p *ListRemoteAccessVpnsParams) SetNetworkid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["networkid"] = v
+	return
+}
+
+func (p *ListRemoteAccessVpnsParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListRemoteAccessVpnsParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListRemoteAccessVpnsParams) SetProjectid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectid"] = v
+	return
+}
+
+func (p *ListRemoteAccessVpnsParams) SetPublicipid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["publicipid"] = v
+	return
+}
+
+// You should always use this function to get a new ListRemoteAccessVpnsParams instance,
+// as then you are sure you have configured all required params
+func (s *VPNService) NewListRemoteAccessVpnsParams() *ListRemoteAccessVpnsParams {
+	p := &ListRemoteAccessVpnsParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *VPNService) GetRemoteAccessVpnByID(id string, opts ...OptionFunc) (*RemoteAccessVpn, int, error) {
+	p := &ListRemoteAccessVpnsParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["id"] = id
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return nil, -1, err
+		}
+	}
+
+	l, err := s.ListRemoteAccessVpns(p)
+	if err != nil {
+		if strings.Contains(err.Error(), fmt.Sprintf(
+			"Invalid parameter id value=%s due to incorrect long value format, "+
+				"or entity does not exist", id)) {
+			return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
+		}
+		return nil, -1, err
+	}
+
+	if l.Count == 0 {
+		return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
+	}
+
+	if l.Count == 1 {
+		return l.RemoteAccessVpns[0], l.Count, nil
+	}
+	return nil, l.Count, fmt.Errorf("There is more then one result for RemoteAccessVpn UUID: %s!", id)
+}
+
+// Lists remote access vpns
+func (s *VPNService) ListRemoteAccessVpns(p *ListRemoteAccessVpnsParams) (*ListRemoteAccessVpnsResponse, error) {
+	resp, err := s.cs.newRequest("listRemoteAccessVpns", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListRemoteAccessVpnsResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListRemoteAccessVpnsResponse struct {
+	Count            int                `json:"count"`
+	RemoteAccessVpns []*RemoteAccessVpn `json:"remoteaccessvpn"`
+}
+
+type RemoteAccessVpn struct {
+	Account      string `json:"account"`
+	Domain       string `json:"domain"`
+	Domainid     string `json:"domainid"`
+	Fordisplay   bool   `json:"fordisplay"`
+	Id           string `json:"id"`
+	Iprange      string `json:"iprange"`
+	Presharedkey string `json:"presharedkey"`
+	Project      string `json:"project"`
+	Projectid    string `json:"projectid"`
+	Publicip     string `json:"publicip"`
+	Publicipid   string `json:"publicipid"`
+	State        string `json:"state"`
+}
+
+type ListVpnConnectionsParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListVpnConnectionsParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["fordisplay"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("fordisplay", vv)
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["isrecursive"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("isrecursive", vv)
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["listall"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("listall", vv)
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["projectid"]; found {
+		u.Set("projectid", v.(string))
+	}
+	if v, found := p.p["vpcid"]; found {
+		u.Set("vpcid", v.(string))
+	}
+	return u
+}
+
+func (p *ListVpnConnectionsParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *ListVpnConnectionsParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *ListVpnConnectionsParams) SetFordisplay(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["fordisplay"] = v
+	return
+}
+
+func (p *ListVpnConnectionsParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ListVpnConnectionsParams) SetIsrecursive(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isrecursive"] = v
+	return
+}
+
+func (p *ListVpnConnectionsParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListVpnConnectionsParams) SetListall(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["listall"] = v
+	return
+}
+
+func (p *ListVpnConnectionsParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListVpnConnectionsParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListVpnConnectionsParams) SetProjectid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectid"] = v
+	return
+}
+
+func (p *ListVpnConnectionsParams) SetVpcid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["vpcid"] = v
+	return
+}
+
+// You should always use this function to get a new ListVpnConnectionsParams instance,
+// as then you are sure you have configured all required params
+func (s *VPNService) NewListVpnConnectionsParams() *ListVpnConnectionsParams {
+	p := &ListVpnConnectionsParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *VPNService) GetVpnConnectionByID(id string, opts ...OptionFunc) (*VpnConnection, int, error) {
+	p := &ListVpnConnectionsParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["id"] = id
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return nil, -1, err
+		}
+	}
+
+	l, err := s.ListVpnConnections(p)
+	if err != nil {
+		if strings.Contains(err.Error(), fmt.Sprintf(
+			"Invalid parameter id value=%s due to incorrect long value format, "+
+				"or entity does not exist", id)) {
+			return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
+		}
+		return nil, -1, err
+	}
+
+	if l.Count == 0 {
+		return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
+	}
+
+	if l.Count == 1 {
+		return l.VpnConnections[0], l.Count, nil
+	}
+	return nil, l.Count, fmt.Errorf("There is more then one result for VpnConnection UUID: %s!", id)
+}
+
+// Lists site to site vpn connection gateways
+func (s *VPNService) ListVpnConnections(p *ListVpnConnectionsParams) (*ListVpnConnectionsResponse, error) {
+	resp, err := s.cs.newRequest("listVpnConnections", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListVpnConnectionsResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListVpnConnectionsResponse struct {
+	Count          int              `json:"count"`
+	VpnConnections []*VpnConnection `json:"vpnconnection"`
+}
+
+type VpnConnection struct {
+	Account              string `json:"account"`
+	Cidrlist             string `json:"cidrlist"`
+	Created              string `json:"created"`
+	Domain               string `json:"domain"`
+	Domainid             string `json:"domainid"`
+	Dpd                  bool   `json:"dpd"`
+	Esplifetime          int64  `json:"esplifetime"`
+	Esppolicy            string `json:"esppolicy"`
+	Forceencap           bool   `json:"forceencap"`
+	Fordisplay           bool   `json:"fordisplay"`
+	Gateway              string `json:"gateway"`
+	Id                   string `json:"id"`
+	Ikelifetime          int64  `json:"ikelifetime"`
+	Ikepolicy            string `json:"ikepolicy"`
+	Ipsecpsk             string `json:"ipsecpsk"`
+	Passive              bool   `json:"passive"`
+	Project              string `json:"project"`
+	Projectid            string `json:"projectid"`
+	Publicip             string `json:"publicip"`
+	Removed              string `json:"removed"`
+	S2scustomergatewayid string `json:"s2scustomergatewayid"`
+	S2svpngatewayid      string `json:"s2svpngatewayid"`
+	State                string `json:"state"`
+}
+
+type ListVpnCustomerGatewaysParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListVpnCustomerGatewaysParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["isrecursive"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("isrecursive", vv)
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["listall"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("listall", vv)
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["projectid"]; found {
+		u.Set("projectid", v.(string))
+	}
+	return u
+}
+
+func (p *ListVpnCustomerGatewaysParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *ListVpnCustomerGatewaysParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *ListVpnCustomerGatewaysParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ListVpnCustomerGatewaysParams) SetIsrecursive(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isrecursive"] = v
+	return
+}
+
+func (p *ListVpnCustomerGatewaysParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListVpnCustomerGatewaysParams) SetListall(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["listall"] = v
+	return
+}
+
+func (p *ListVpnCustomerGatewaysParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListVpnCustomerGatewaysParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListVpnCustomerGatewaysParams) SetProjectid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectid"] = v
+	return
+}
+
+// You should always use this function to get a new ListVpnCustomerGatewaysParams instance,
+// as then you are sure you have configured all required params
+func (s *VPNService) NewListVpnCustomerGatewaysParams() *ListVpnCustomerGatewaysParams {
+	p := &ListVpnCustomerGatewaysParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *VPNService) GetVpnCustomerGatewayID(keyword string, opts ...OptionFunc) (string, int, error) {
+	p := &ListVpnCustomerGatewaysParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["keyword"] = keyword
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return "", -1, err
+		}
+	}
+
+	l, err := s.ListVpnCustomerGateways(p)
+	if err != nil {
+		return "", -1, err
+	}
+
+	if l.Count == 0 {
+		return "", l.Count, fmt.Errorf("No match found for %s: %+v", keyword, l)
+	}
+
+	if l.Count == 1 {
+		return l.VpnCustomerGateways[0].Id, l.Count, nil
+	}
+
+	if l.Count > 1 {
+		for _, v := range l.VpnCustomerGateways {
+			if v.Name == keyword {
+				return v.Id, l.Count, nil
+			}
+		}
+	}
+	return "", l.Count, fmt.Errorf("Could not find an exact match for %s: %+v", keyword, l)
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *VPNService) GetVpnCustomerGatewayByName(name string, opts ...OptionFunc) (*VpnCustomerGateway, int, error) {
+	id, count, err := s.GetVpnCustomerGatewayID(name, opts...)
+	if err != nil {
+		return nil, count, err
+	}
+
+	r, count, err := s.GetVpnCustomerGatewayByID(id, opts...)
+	if err != nil {
+		return nil, count, err
+	}
+	return r, count, nil
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *VPNService) GetVpnCustomerGatewayByID(id string, opts ...OptionFunc) (*VpnCustomerGateway, int, error) {
+	p := &ListVpnCustomerGatewaysParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["id"] = id
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return nil, -1, err
+		}
+	}
+
+	l, err := s.ListVpnCustomerGateways(p)
+	if err != nil {
+		if strings.Contains(err.Error(), fmt.Sprintf(
+			"Invalid parameter id value=%s due to incorrect long value format, "+
+				"or entity does not exist", id)) {
+			return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
+		}
+		return nil, -1, err
+	}
+
+	if l.Count == 0 {
+		return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
+	}
+
+	if l.Count == 1 {
+		return l.VpnCustomerGateways[0], l.Count, nil
+	}
+	return nil, l.Count, fmt.Errorf("There is more then one result for VpnCustomerGateway UUID: %s!", id)
+}
+
+// Lists site to site vpn customer gateways
+func (s *VPNService) ListVpnCustomerGateways(p *ListVpnCustomerGatewaysParams) (*ListVpnCustomerGatewaysResponse, error) {
+	resp, err := s.cs.newRequest("listVpnCustomerGateways", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListVpnCustomerGatewaysResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListVpnCustomerGatewaysResponse struct {
+	Count               int                   `json:"count"`
+	VpnCustomerGateways []*VpnCustomerGateway `json:"vpncustomergateway"`
+}
+
+type VpnCustomerGateway struct {
+	Account     string `json:"account"`
+	Cidrlist    string `json:"cidrlist"`
+	Domain      string `json:"domain"`
+	Domainid    string `json:"domainid"`
+	Dpd         bool   `json:"dpd"`
+	Esplifetime int64  `json:"esplifetime"`
+	Esppolicy   string `json:"esppolicy"`
+	Forceencap  bool   `json:"forceencap"`
+	Gateway     string `json:"gateway"`
+	Id          string `json:"id"`
+	Ikelifetime int64  `json:"ikelifetime"`
+	Ikepolicy   string `json:"ikepolicy"`
+	Ipaddress   string `json:"ipaddress"`
+	Ipsecpsk    string `json:"ipsecpsk"`
+	Name        string `json:"name"`
+	Project     string `json:"project"`
+	Projectid   string `json:"projectid"`
+	Removed     string `json:"removed"`
+}
+
+type ListVpnGatewaysParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListVpnGatewaysParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["fordisplay"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("fordisplay", vv)
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["isrecursive"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("isrecursive", vv)
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["listall"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("listall", vv)
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["projectid"]; found {
+		u.Set("projectid", v.(string))
+	}
+	if v, found := p.p["vpcid"]; found {
+		u.Set("vpcid", v.(string))
+	}
+	return u
+}
+
+func (p *ListVpnGatewaysParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *ListVpnGatewaysParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *ListVpnGatewaysParams) SetFordisplay(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["fordisplay"] = v
+	return
+}
+
+func (p *ListVpnGatewaysParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ListVpnGatewaysParams) SetIsrecursive(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isrecursive"] = v
+	return
+}
+
+func (p *ListVpnGatewaysParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListVpnGatewaysParams) SetListall(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["listall"] = v
+	return
+}
+
+func (p *ListVpnGatewaysParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListVpnGatewaysParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListVpnGatewaysParams) SetProjectid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectid"] = v
+	return
+}
+
+func (p *ListVpnGatewaysParams) SetVpcid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["vpcid"] = v
+	return
+}
+
+// You should always use this function to get a new ListVpnGatewaysParams instance,
+// as then you are sure you have configured all required params
+func (s *VPNService) NewListVpnGatewaysParams() *ListVpnGatewaysParams {
+	p := &ListVpnGatewaysParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *VPNService) GetVpnGatewayByID(id string, opts ...OptionFunc) (*VpnGateway, int, error) {
+	p := &ListVpnGatewaysParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["id"] = id
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return nil, -1, err
+		}
+	}
+
+	l, err := s.ListVpnGateways(p)
+	if err != nil {
+		if strings.Contains(err.Error(), fmt.Sprintf(
+			"Invalid parameter id value=%s due to incorrect long value format, "+
+				"or entity does not exist", id)) {
+			return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
+		}
+		return nil, -1, err
+	}
+
+	if l.Count == 0 {
+		return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
+	}
+
+	if l.Count == 1 {
+		return l.VpnGateways[0], l.Count, nil
+	}
+	return nil, l.Count, fmt.Errorf("There is more then one result for VpnGateway UUID: %s!", id)
+}
+
+// Lists site 2 site vpn gateways
+func (s *VPNService) ListVpnGateways(p *ListVpnGatewaysParams) (*ListVpnGatewaysResponse, error) {
+	resp, err := s.cs.newRequest("listVpnGateways", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListVpnGatewaysResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListVpnGatewaysResponse struct {
+	Count       int           `json:"count"`
+	VpnGateways []*VpnGateway `json:"vpngateway"`
+}
+
+type VpnGateway struct {
+	Account    string `json:"account"`
+	Domain     string `json:"domain"`
+	Domainid   string `json:"domainid"`
+	Fordisplay bool   `json:"fordisplay"`
+	Id         string `json:"id"`
+	Project    string `json:"project"`
+	Projectid  string `json:"projectid"`
+	Publicip   string `json:"publicip"`
+	Removed    string `json:"removed"`
+	Vpcid      string `json:"vpcid"`
+}
+
+type ListVpnUsersParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListVpnUsersParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["isrecursive"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("isrecursive", vv)
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["listall"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("listall", vv)
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["projectid"]; found {
+		u.Set("projectid", v.(string))
+	}
+	if v, found := p.p["username"]; found {
+		u.Set("username", v.(string))
+	}
+	return u
+}
+
+func (p *ListVpnUsersParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *ListVpnUsersParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *ListVpnUsersParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ListVpnUsersParams) SetIsrecursive(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isrecursive"] = v
+	return
+}
+
+func (p *ListVpnUsersParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListVpnUsersParams) SetListall(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["listall"] = v
+	return
+}
+
+func (p *ListVpnUsersParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListVpnUsersParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListVpnUsersParams) SetProjectid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectid"] = v
+	return
+}
+
+func (p *ListVpnUsersParams) SetUsername(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["username"] = v
+	return
+}
+
+// You should always use this function to get a new ListVpnUsersParams instance,
+// as then you are sure you have configured all required params
+func (s *VPNService) NewListVpnUsersParams() *ListVpnUsersParams {
+	p := &ListVpnUsersParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *VPNService) GetVpnUserByID(id string, opts ...OptionFunc) (*VpnUser, int, error) {
+	p := &ListVpnUsersParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["id"] = id
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return nil, -1, err
+		}
+	}
+
+	l, err := s.ListVpnUsers(p)
+	if err != nil {
+		if strings.Contains(err.Error(), fmt.Sprintf(
+			"Invalid parameter id value=%s due to incorrect long value format, "+
+				"or entity does not exist", id)) {
+			return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
+		}
+		return nil, -1, err
+	}
+
+	if l.Count == 0 {
+		return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
+	}
+
+	if l.Count == 1 {
+		return l.VpnUsers[0], l.Count, nil
+	}
+	return nil, l.Count, fmt.Errorf("There is more then one result for VpnUser UUID: %s!", id)
+}
+
+// Lists vpn users
+func (s *VPNService) ListVpnUsers(p *ListVpnUsersParams) (*ListVpnUsersResponse, error) {
+	resp, err := s.cs.newRequest("listVpnUsers", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListVpnUsersResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListVpnUsersResponse struct {
+	Count    int        `json:"count"`
+	VpnUsers []*VpnUser `json:"vpnuser"`
+}
+
+type VpnUser struct {
+	Account   string `json:"account"`
+	Domain    string `json:"domain"`
+	Domainid  string `json:"domainid"`
+	Id        string `json:"id"`
+	Project   string `json:"project"`
+	Projectid string `json:"projectid"`
+	State     string `json:"state"`
+	Username  string `json:"username"`
+}
+
+type RemoveVpnUserParams struct {
+	p map[string]interface{}
+}
+
+func (p *RemoveVpnUserParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["projectid"]; found {
+		u.Set("projectid", v.(string))
+	}
+	if v, found := p.p["username"]; found {
+		u.Set("username", v.(string))
+	}
+	return u
+}
+
+func (p *RemoveVpnUserParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *RemoveVpnUserParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *RemoveVpnUserParams) SetProjectid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectid"] = v
+	return
+}
+
+func (p *RemoveVpnUserParams) SetUsername(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["username"] = v
+	return
+}
+
+// You should always use this function to get a new RemoveVpnUserParams instance,
+// as then you are sure you have configured all required params
+func (s *VPNService) NewRemoveVpnUserParams(username string) *RemoveVpnUserParams {
+	p := &RemoveVpnUserParams{}
+	p.p = make(map[string]interface{})
+	p.p["username"] = username
+	return p
+}
+
+// Removes vpn user
+func (s *VPNService) RemoveVpnUser(p *RemoveVpnUserParams) (*RemoveVpnUserResponse, error) {
+	resp, err := s.cs.newRequest("removeVpnUser", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r RemoveVpnUserResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type RemoveVpnUserResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
+
+type ResetVpnConnectionParams struct {
+	p map[string]interface{}
+}
+
+func (p *ResetVpnConnectionParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *ResetVpnConnectionParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *ResetVpnConnectionParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *ResetVpnConnectionParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new ResetVpnConnectionParams instance,
+// as then you are sure you have configured all required params
+func (s *VPNService) NewResetVpnConnectionParams(id string) *ResetVpnConnectionParams {
+	p := &ResetVpnConnectionParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Reset site to site vpn connection
+func (s *VPNService) ResetVpnConnection(p *ResetVpnConnectionParams) (*ResetVpnConnectionResponse, error) {
+	resp, err := s.cs.newRequest("resetVpnConnection", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ResetVpnConnectionResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type ResetVpnConnectionResponse struct {
+	JobID                string `json:"jobid"`
+	Account              string `json:"account"`
+	Cidrlist             string `json:"cidrlist"`
+	Created              string `json:"created"`
+	Domain               string `json:"domain"`
+	Domainid             string `json:"domainid"`
+	Dpd                  bool   `json:"dpd"`
+	Esplifetime          int64  `json:"esplifetime"`
+	Esppolicy            string `json:"esppolicy"`
+	Forceencap           bool   `json:"forceencap"`
+	Fordisplay           bool   `json:"fordisplay"`
+	Gateway              string `json:"gateway"`
+	Id                   string `json:"id"`
+	Ikelifetime          int64  `json:"ikelifetime"`
+	Ikepolicy            string `json:"ikepolicy"`
+	Ipsecpsk             string `json:"ipsecpsk"`
+	Passive              bool   `json:"passive"`
+	Project              string `json:"project"`
+	Projectid            string `json:"projectid"`
+	Publicip             string `json:"publicip"`
+	Removed              string `json:"removed"`
+	S2scustomergatewayid string `json:"s2scustomergatewayid"`
+	S2svpngatewayid      string `json:"s2svpngatewayid"`
+	State                string `json:"state"`
+}
+
+type UpdateRemoteAccessVpnParams struct {
+	p map[string]interface{}
+}
+
+func (p *UpdateRemoteAccessVpnParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["customid"]; found {
+		u.Set("customid", v.(string))
+	}
+	if v, found := p.p["fordisplay"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("fordisplay", vv)
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *UpdateRemoteAccessVpnParams) SetCustomid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["customid"] = v
+	return
+}
+
+func (p *UpdateRemoteAccessVpnParams) SetFordisplay(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["fordisplay"] = v
+	return
+}
+
+func (p *UpdateRemoteAccessVpnParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new UpdateRemoteAccessVpnParams instance,
+// as then you are sure you have configured all required params
+func (s *VPNService) NewUpdateRemoteAccessVpnParams(id string) *UpdateRemoteAccessVpnParams {
+	p := &UpdateRemoteAccessVpnParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Updates remote access vpn
+func (s *VPNService) UpdateRemoteAccessVpn(p *UpdateRemoteAccessVpnParams) (*UpdateRemoteAccessVpnResponse, error) {
+	resp, err := s.cs.newRequest("updateRemoteAccessVpn", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r UpdateRemoteAccessVpnResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type UpdateRemoteAccessVpnResponse struct {
+	JobID        string `json:"jobid"`
+	Account      string `json:"account"`
+	Domain       string `json:"domain"`
+	Domainid     string `json:"domainid"`
+	Fordisplay   bool   `json:"fordisplay"`
+	Id           string `json:"id"`
+	Iprange      string `json:"iprange"`
+	Presharedkey string `json:"presharedkey"`
+	Project      string `json:"project"`
+	Projectid    string `json:"projectid"`
+	Publicip     string `json:"publicip"`
+	Publicipid   string `json:"publicipid"`
+	State        string `json:"state"`
+}
+
+type UpdateVpnConnectionParams struct {
+	p map[string]interface{}
+}
+
+func (p *UpdateVpnConnectionParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["customid"]; found {
+		u.Set("customid", v.(string))
+	}
+	if v, found := p.p["fordisplay"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("fordisplay", vv)
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *UpdateVpnConnectionParams) SetCustomid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["customid"] = v
+	return
+}
+
+func (p *UpdateVpnConnectionParams) SetFordisplay(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["fordisplay"] = v
+	return
+}
+
+func (p *UpdateVpnConnectionParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new UpdateVpnConnectionParams instance,
+// as then you are sure you have configured all required params
+func (s *VPNService) NewUpdateVpnConnectionParams(id string) *UpdateVpnConnectionParams {
+	p := &UpdateVpnConnectionParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Updates site to site vpn connection
+func (s *VPNService) UpdateVpnConnection(p *UpdateVpnConnectionParams) (*UpdateVpnConnectionResponse, error) {
+	resp, err := s.cs.newRequest("updateVpnConnection", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r UpdateVpnConnectionResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type UpdateVpnConnectionResponse struct {
+	JobID                string `json:"jobid"`
+	Account              string `json:"account"`
+	Cidrlist             string `json:"cidrlist"`
+	Created              string `json:"created"`
+	Domain               string `json:"domain"`
+	Domainid             string `json:"domainid"`
+	Dpd                  bool   `json:"dpd"`
+	Esplifetime          int64  `json:"esplifetime"`
+	Esppolicy            string `json:"esppolicy"`
+	Forceencap           bool   `json:"forceencap"`
+	Fordisplay           bool   `json:"fordisplay"`
+	Gateway              string `json:"gateway"`
+	Id                   string `json:"id"`
+	Ikelifetime          int64  `json:"ikelifetime"`
+	Ikepolicy            string `json:"ikepolicy"`
+	Ipsecpsk             string `json:"ipsecpsk"`
+	Passive              bool   `json:"passive"`
+	Project              string `json:"project"`
+	Projectid            string `json:"projectid"`
+	Publicip             string `json:"publicip"`
+	Removed              string `json:"removed"`
+	S2scustomergatewayid string `json:"s2scustomergatewayid"`
+	S2svpngatewayid      string `json:"s2svpngatewayid"`
+	State                string `json:"state"`
+}
+
+type UpdateVpnCustomerGatewayParams struct {
+	p map[string]interface{}
+}
+
+func (p *UpdateVpnCustomerGatewayParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["cidrlist"]; found {
+		u.Set("cidrlist", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["dpd"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("dpd", vv)
+	}
+	if v, found := p.p["esplifetime"]; found {
+		vv := strconv.FormatInt(v.(int64), 10)
+		u.Set("esplifetime", vv)
+	}
+	if v, found := p.p["esppolicy"]; found {
+		u.Set("esppolicy", v.(string))
+	}
+	if v, found := p.p["forceencap"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("forceencap", vv)
+	}
+	if v, found := p.p["gateway"]; found {
+		u.Set("gateway", v.(string))
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["ikelifetime"]; found {
+		vv := strconv.FormatInt(v.(int64), 10)
+		u.Set("ikelifetime", vv)
+	}
+	if v, found := p.p["ikepolicy"]; found {
+		u.Set("ikepolicy", v.(string))
+	}
+	if v, found := p.p["ipsecpsk"]; found {
+		u.Set("ipsecpsk", v.(string))
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	return u
+}
+
+func (p *UpdateVpnCustomerGatewayParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *UpdateVpnCustomerGatewayParams) SetCidrlist(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["cidrlist"] = v
+	return
+}
+
+func (p *UpdateVpnCustomerGatewayParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *UpdateVpnCustomerGatewayParams) SetDpd(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["dpd"] = v
+	return
+}
+
+func (p *UpdateVpnCustomerGatewayParams) SetEsplifetime(v int64) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["esplifetime"] = v
+	return
+}
+
+func (p *UpdateVpnCustomerGatewayParams) SetEsppolicy(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["esppolicy"] = v
+	return
+}
+
+func (p *UpdateVpnCustomerGatewayParams) SetForceencap(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["forceencap"] = v
+	return
+}
+
+func (p *UpdateVpnCustomerGatewayParams) SetGateway(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["gateway"] = v
+	return
+}
+
+func (p *UpdateVpnCustomerGatewayParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *UpdateVpnCustomerGatewayParams) SetIkelifetime(v int64) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["ikelifetime"] = v
+	return
+}
+
+func (p *UpdateVpnCustomerGatewayParams) SetIkepolicy(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["ikepolicy"] = v
+	return
+}
+
+func (p *UpdateVpnCustomerGatewayParams) SetIpsecpsk(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["ipsecpsk"] = v
+	return
+}
+
+func (p *UpdateVpnCustomerGatewayParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+// You should always use this function to get a new UpdateVpnCustomerGatewayParams instance,
+// as then you are sure you have configured all required params
+func (s *VPNService) NewUpdateVpnCustomerGatewayParams(cidrlist string, esppolicy string, gateway string, id string, ikepolicy string, ipsecpsk string) *UpdateVpnCustomerGatewayParams {
+	p := &UpdateVpnCustomerGatewayParams{}
+	p.p = make(map[string]interface{})
+	p.p["cidrlist"] = cidrlist
+	p.p["esppolicy"] = esppolicy
+	p.p["gateway"] = gateway
+	p.p["id"] = id
+	p.p["ikepolicy"] = ikepolicy
+	p.p["ipsecpsk"] = ipsecpsk
+	return p
+}
+
+// Update site to site vpn customer gateway
+func (s *VPNService) UpdateVpnCustomerGateway(p *UpdateVpnCustomerGatewayParams) (*UpdateVpnCustomerGatewayResponse, error) {
+	resp, err := s.cs.newRequest("updateVpnCustomerGateway", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r UpdateVpnCustomerGatewayResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type UpdateVpnCustomerGatewayResponse struct {
+	JobID       string `json:"jobid"`
+	Account     string `json:"account"`
+	Cidrlist    string `json:"cidrlist"`
+	Domain      string `json:"domain"`
+	Domainid    string `json:"domainid"`
+	Dpd         bool   `json:"dpd"`
+	Esplifetime int64  `json:"esplifetime"`
+	Esppolicy   string `json:"esppolicy"`
+	Forceencap  bool   `json:"forceencap"`
+	Gateway     string `json:"gateway"`
+	Id          string `json:"id"`
+	Ikelifetime int64  `json:"ikelifetime"`
+	Ikepolicy   string `json:"ikepolicy"`
+	Ipaddress   string `json:"ipaddress"`
+	Ipsecpsk    string `json:"ipsecpsk"`
+	Name        string `json:"name"`
+	Project     string `json:"project"`
+	Projectid   string `json:"projectid"`
+	Removed     string `json:"removed"`
+}
+
+type UpdateVpnGatewayParams struct {
+	p map[string]interface{}
+}
+
+func (p *UpdateVpnGatewayParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["customid"]; found {
+		u.Set("customid", v.(string))
+	}
+	if v, found := p.p["fordisplay"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("fordisplay", vv)
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *UpdateVpnGatewayParams) SetCustomid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["customid"] = v
+	return
+}
+
+func (p *UpdateVpnGatewayParams) SetFordisplay(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["fordisplay"] = v
+	return
+}
+
+func (p *UpdateVpnGatewayParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new UpdateVpnGatewayParams instance,
+// as then you are sure you have configured all required params
+func (s *VPNService) NewUpdateVpnGatewayParams(id string) *UpdateVpnGatewayParams {
+	p := &UpdateVpnGatewayParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Updates site to site vpn local gateway
+func (s *VPNService) UpdateVpnGateway(p *UpdateVpnGatewayParams) (*UpdateVpnGatewayResponse, error) {
+	resp, err := s.cs.newRequest("updateVpnGateway", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r UpdateVpnGatewayResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type UpdateVpnGatewayResponse struct {
+	JobID      string `json:"jobid"`
+	Account    string `json:"account"`
+	Domain     string `json:"domain"`
+	Domainid   string `json:"domainid"`
+	Fordisplay bool   `json:"fordisplay"`
+	Id         string `json:"id"`
+	Project    string `json:"project"`
+	Projectid  string `json:"projectid"`
+	Publicip   string `json:"publicip"`
+	Removed    string `json:"removed"`
+	Vpcid      string `json:"vpcid"`
+}
diff --git a/vendor/github.com/xanzy/go-cloudstack/cloudstack/VirtualMachineService.go b/vendor/github.com/xanzy/go-cloudstack/cloudstack/VirtualMachineService.go
new file mode 100644
index 0000000..de873e1
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/cloudstack/VirtualMachineService.go
@@ -0,0 +1,5367 @@
+//
+// Copyright 2018, Sander van Harmelen
+//
+// Licensed 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 cloudstack
+
+import (
+	"encoding/json"
+	"fmt"
+	"net/url"
+	"strconv"
+	"strings"
+)
+
+type AddNicToVirtualMachineParams struct {
+	p map[string]interface{}
+}
+
+func (p *AddNicToVirtualMachineParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["ipaddress"]; found {
+		u.Set("ipaddress", v.(string))
+	}
+	if v, found := p.p["networkid"]; found {
+		u.Set("networkid", v.(string))
+	}
+	if v, found := p.p["virtualmachineid"]; found {
+		u.Set("virtualmachineid", v.(string))
+	}
+	return u
+}
+
+func (p *AddNicToVirtualMachineParams) SetIpaddress(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["ipaddress"] = v
+	return
+}
+
+func (p *AddNicToVirtualMachineParams) SetNetworkid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["networkid"] = v
+	return
+}
+
+func (p *AddNicToVirtualMachineParams) SetVirtualmachineid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["virtualmachineid"] = v
+	return
+}
+
+// You should always use this function to get a new AddNicToVirtualMachineParams instance,
+// as then you are sure you have configured all required params
+func (s *VirtualMachineService) NewAddNicToVirtualMachineParams(networkid string, virtualmachineid string) *AddNicToVirtualMachineParams {
+	p := &AddNicToVirtualMachineParams{}
+	p.p = make(map[string]interface{})
+	p.p["networkid"] = networkid
+	p.p["virtualmachineid"] = virtualmachineid
+	return p
+}
+
+// Adds VM to specified network by creating a NIC
+func (s *VirtualMachineService) AddNicToVirtualMachine(p *AddNicToVirtualMachineParams) (*AddNicToVirtualMachineResponse, error) {
+	resp, err := s.cs.newRequest("addNicToVirtualMachine", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r AddNicToVirtualMachineResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type AddNicToVirtualMachineResponse struct {
+	JobID         string `json:"jobid"`
+	Account       string `json:"account"`
+	Affinitygroup []struct {
+		Account           string   `json:"account"`
+		Description       string   `json:"description"`
+		Domain            string   `json:"domain"`
+		Domainid          string   `json:"domainid"`
+		Id                string   `json:"id"`
+		Name              string   `json:"name"`
+		Project           string   `json:"project"`
+		Projectid         string   `json:"projectid"`
+		Type              string   `json:"type"`
+		VirtualmachineIds []string `json:"virtualmachineIds"`
+	} `json:"affinitygroup"`
+	Cpunumber             int               `json:"cpunumber"`
+	Cpuspeed              int               `json:"cpuspeed"`
+	Cpuused               string            `json:"cpuused"`
+	Created               string            `json:"created"`
+	Details               map[string]string `json:"details"`
+	Diskioread            int64             `json:"diskioread"`
+	Diskiowrite           int64             `json:"diskiowrite"`
+	Diskkbsread           int64             `json:"diskkbsread"`
+	Diskkbswrite          int64             `json:"diskkbswrite"`
+	Diskofferingid        string            `json:"diskofferingid"`
+	Diskofferingname      string            `json:"diskofferingname"`
+	Displayname           string            `json:"displayname"`
+	Displayvm             bool              `json:"displayvm"`
+	Domain                string            `json:"domain"`
+	Domainid              string            `json:"domainid"`
+	Forvirtualnetwork     bool              `json:"forvirtualnetwork"`
+	Group                 string            `json:"group"`
+	Groupid               string            `json:"groupid"`
+	Guestosid             string            `json:"guestosid"`
+	Haenable              bool              `json:"haenable"`
+	Hostid                string            `json:"hostid"`
+	Hostname              string            `json:"hostname"`
+	Hypervisor            string            `json:"hypervisor"`
+	Id                    string            `json:"id"`
+	Instancename          string            `json:"instancename"`
+	Isdynamicallyscalable bool              `json:"isdynamicallyscalable"`
+	Isodisplaytext        string            `json:"isodisplaytext"`
+	Isoid                 string            `json:"isoid"`
+	Isoname               string            `json:"isoname"`
+	Keypair               string            `json:"keypair"`
+	Memory                int               `json:"memory"`
+	Memoryintfreekbs      int64             `json:"memoryintfreekbs"`
+	Memorykbs             int64             `json:"memorykbs"`
+	Memorytargetkbs       int64             `json:"memorytargetkbs"`
+	Name                  string            `json:"name"`
+	Networkkbsread        int64             `json:"networkkbsread"`
+	Networkkbswrite       int64             `json:"networkkbswrite"`
+	Nic                   []struct {
+		Broadcasturi         string `json:"broadcasturi"`
+		Deviceid             string `json:"deviceid"`
+		Gateway              string `json:"gateway"`
+		Id                   string `json:"id"`
+		Ip6address           string `json:"ip6address"`
+		Ip6cidr              string `json:"ip6cidr"`
+		Ip6gateway           string `json:"ip6gateway"`
+		Ipaddress            string `json:"ipaddress"`
+		Isdefault            bool   `json:"isdefault"`
+		Isolationuri         string `json:"isolationuri"`
+		Macaddress           string `json:"macaddress"`
+		Netmask              string `json:"netmask"`
+		Networkid            string `json:"networkid"`
+		Networkname          string `json:"networkname"`
+		Nsxlogicalswitch     string `json:"nsxlogicalswitch"`
+		Nsxlogicalswitchport string `json:"nsxlogicalswitchport"`
+		Secondaryip          []struct {
+			Id        string `json:"id"`
+			Ipaddress string `json:"ipaddress"`
+		} `json:"secondaryip"`
+		Traffictype      string `json:"traffictype"`
+		Type             string `json:"type"`
+		Virtualmachineid string `json:"virtualmachineid"`
+	} `json:"nic"`
+	Ostypeid        int64  `json:"ostypeid"`
+	Password        string `json:"password"`
+	Passwordenabled bool   `json:"passwordenabled"`
+	Project         string `json:"project"`
+	Projectid       string `json:"projectid"`
+	Publicip        string `json:"publicip"`
+	Publicipid      string `json:"publicipid"`
+	Rootdeviceid    int64  `json:"rootdeviceid"`
+	Rootdevicetype  string `json:"rootdevicetype"`
+	Securitygroup   []struct {
+		Account     string `json:"account"`
+		Description string `json:"description"`
+		Domain      string `json:"domain"`
+		Domainid    string `json:"domainid"`
+		Egressrule  []struct {
+			Account           string `json:"account"`
+			Cidr              string `json:"cidr"`
+			Endport           int    `json:"endport"`
+			Icmpcode          int    `json:"icmpcode"`
+			Icmptype          int    `json:"icmptype"`
+			Protocol          string `json:"protocol"`
+			Ruleid            string `json:"ruleid"`
+			Securitygroupname string `json:"securitygroupname"`
+			Startport         int    `json:"startport"`
+			Tags              []struct {
+				Account      string `json:"account"`
+				Customer     string `json:"customer"`
+				Domain       string `json:"domain"`
+				Domainid     string `json:"domainid"`
+				Key          string `json:"key"`
+				Project      string `json:"project"`
+				Projectid    string `json:"projectid"`
+				Resourceid   string `json:"resourceid"`
+				Resourcetype string `json:"resourcetype"`
+				Value        string `json:"value"`
+			} `json:"tags"`
+		} `json:"egressrule"`
+		Id          string `json:"id"`
+		Ingressrule []struct {
+			Account           string `json:"account"`
+			Cidr              string `json:"cidr"`
+			Endport           int    `json:"endport"`
+			Icmpcode          int    `json:"icmpcode"`
+			Icmptype          int    `json:"icmptype"`
+			Protocol          string `json:"protocol"`
+			Ruleid            string `json:"ruleid"`
+			Securitygroupname string `json:"securitygroupname"`
+			Startport         int    `json:"startport"`
+			Tags              []struct {
+				Account      string `json:"account"`
+				Customer     string `json:"customer"`
+				Domain       string `json:"domain"`
+				Domainid     string `json:"domainid"`
+				Key          string `json:"key"`
+				Project      string `json:"project"`
+				Projectid    string `json:"projectid"`
+				Resourceid   string `json:"resourceid"`
+				Resourcetype string `json:"resourcetype"`
+				Value        string `json:"value"`
+			} `json:"tags"`
+		} `json:"ingressrule"`
+		Name      string `json:"name"`
+		Project   string `json:"project"`
+		Projectid string `json:"projectid"`
+		Tags      []struct {
+			Account      string `json:"account"`
+			Customer     string `json:"customer"`
+			Domain       string `json:"domain"`
+			Domainid     string `json:"domainid"`
+			Key          string `json:"key"`
+			Project      string `json:"project"`
+			Projectid    string `json:"projectid"`
+			Resourceid   string `json:"resourceid"`
+			Resourcetype string `json:"resourcetype"`
+			Value        string `json:"value"`
+		} `json:"tags"`
+		Virtualmachinecount int           `json:"virtualmachinecount"`
+		Virtualmachineids   []interface{} `json:"virtualmachineids"`
+	} `json:"securitygroup"`
+	Serviceofferingid   string `json:"serviceofferingid"`
+	Serviceofferingname string `json:"serviceofferingname"`
+	Servicestate        string `json:"servicestate"`
+	State               string `json:"state"`
+	Templatedisplaytext string `json:"templatedisplaytext"`
+	Templateid          string `json:"templateid"`
+	Templatename        string `json:"templatename"`
+	Userid              string `json:"userid"`
+	Username            string `json:"username"`
+	Vgpu                string `json:"vgpu"`
+	Zoneid              string `json:"zoneid"`
+	Zonename            string `json:"zonename"`
+}
+
+type AssignVirtualMachineParams struct {
+	p map[string]interface{}
+}
+
+func (p *AssignVirtualMachineParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["networkids"]; found {
+		vv := strings.Join(v.([]string), ",")
+		u.Set("networkids", vv)
+	}
+	if v, found := p.p["securitygroupids"]; found {
+		vv := strings.Join(v.([]string), ",")
+		u.Set("securitygroupids", vv)
+	}
+	if v, found := p.p["virtualmachineid"]; found {
+		u.Set("virtualmachineid", v.(string))
+	}
+	return u
+}
+
+func (p *AssignVirtualMachineParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *AssignVirtualMachineParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *AssignVirtualMachineParams) SetNetworkids(v []string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["networkids"] = v
+	return
+}
+
+func (p *AssignVirtualMachineParams) SetSecuritygroupids(v []string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["securitygroupids"] = v
+	return
+}
+
+func (p *AssignVirtualMachineParams) SetVirtualmachineid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["virtualmachineid"] = v
+	return
+}
+
+// You should always use this function to get a new AssignVirtualMachineParams instance,
+// as then you are sure you have configured all required params
+func (s *VirtualMachineService) NewAssignVirtualMachineParams(account string, domainid string, virtualmachineid string) *AssignVirtualMachineParams {
+	p := &AssignVirtualMachineParams{}
+	p.p = make(map[string]interface{})
+	p.p["account"] = account
+	p.p["domainid"] = domainid
+	p.p["virtualmachineid"] = virtualmachineid
+	return p
+}
+
+// Change ownership of a VM from one account to another. This API is available for Basic zones with security groups and Advanced zones with guest networks. A root administrator can reassign a VM from any account to any other account in any domain. A domain administrator can reassign a VM to any account in the same domain.
+func (s *VirtualMachineService) AssignVirtualMachine(p *AssignVirtualMachineParams) (*AssignVirtualMachineResponse, error) {
+	resp, err := s.cs.newRequest("assignVirtualMachine", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r AssignVirtualMachineResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type AssignVirtualMachineResponse struct {
+	Account       string `json:"account"`
+	Affinitygroup []struct {
+		Account           string   `json:"account"`
+		Description       string   `json:"description"`
+		Domain            string   `json:"domain"`
+		Domainid          string   `json:"domainid"`
+		Id                string   `json:"id"`
+		Name              string   `json:"name"`
+		Project           string   `json:"project"`
+		Projectid         string   `json:"projectid"`
+		Type              string   `json:"type"`
+		VirtualmachineIds []string `json:"virtualmachineIds"`
+	} `json:"affinitygroup"`
+	Cpunumber             int               `json:"cpunumber"`
+	Cpuspeed              int               `json:"cpuspeed"`
+	Cpuused               string            `json:"cpuused"`
+	Created               string            `json:"created"`
+	Details               map[string]string `json:"details"`
+	Diskioread            int64             `json:"diskioread"`
+	Diskiowrite           int64             `json:"diskiowrite"`
+	Diskkbsread           int64             `json:"diskkbsread"`
+	Diskkbswrite          int64             `json:"diskkbswrite"`
+	Diskofferingid        string            `json:"diskofferingid"`
+	Diskofferingname      string            `json:"diskofferingname"`
+	Displayname           string            `json:"displayname"`
+	Displayvm             bool              `json:"displayvm"`
+	Domain                string            `json:"domain"`
+	Domainid              string            `json:"domainid"`
+	Forvirtualnetwork     bool              `json:"forvirtualnetwork"`
+	Group                 string            `json:"group"`
+	Groupid               string            `json:"groupid"`
+	Guestosid             string            `json:"guestosid"`
+	Haenable              bool              `json:"haenable"`
+	Hostid                string            `json:"hostid"`
+	Hostname              string            `json:"hostname"`
+	Hypervisor            string            `json:"hypervisor"`
+	Id                    string            `json:"id"`
+	Instancename          string            `json:"instancename"`
+	Isdynamicallyscalable bool              `json:"isdynamicallyscalable"`
+	Isodisplaytext        string            `json:"isodisplaytext"`
+	Isoid                 string            `json:"isoid"`
+	Isoname               string            `json:"isoname"`
+	Keypair               string            `json:"keypair"`
+	Memory                int               `json:"memory"`
+	Memoryintfreekbs      int64             `json:"memoryintfreekbs"`
+	Memorykbs             int64             `json:"memorykbs"`
+	Memorytargetkbs       int64             `json:"memorytargetkbs"`
+	Name                  string            `json:"name"`
+	Networkkbsread        int64             `json:"networkkbsread"`
+	Networkkbswrite       int64             `json:"networkkbswrite"`
+	Nic                   []struct {
+		Broadcasturi         string `json:"broadcasturi"`
+		Deviceid             string `json:"deviceid"`
+		Gateway              string `json:"gateway"`
+		Id                   string `json:"id"`
+		Ip6address           string `json:"ip6address"`
+		Ip6cidr              string `json:"ip6cidr"`
+		Ip6gateway           string `json:"ip6gateway"`
+		Ipaddress            string `json:"ipaddress"`
+		Isdefault            bool   `json:"isdefault"`
+		Isolationuri         string `json:"isolationuri"`
+		Macaddress           string `json:"macaddress"`
+		Netmask              string `json:"netmask"`
+		Networkid            string `json:"networkid"`
+		Networkname          string `json:"networkname"`
+		Nsxlogicalswitch     string `json:"nsxlogicalswitch"`
+		Nsxlogicalswitchport string `json:"nsxlogicalswitchport"`
+		Secondaryip          []struct {
+			Id        string `json:"id"`
+			Ipaddress string `json:"ipaddress"`
+		} `json:"secondaryip"`
+		Traffictype      string `json:"traffictype"`
+		Type             string `json:"type"`
+		Virtualmachineid string `json:"virtualmachineid"`
+	} `json:"nic"`
+	Ostypeid        int64  `json:"ostypeid"`
+	Password        string `json:"password"`
+	Passwordenabled bool   `json:"passwordenabled"`
+	Project         string `json:"project"`
+	Projectid       string `json:"projectid"`
+	Publicip        string `json:"publicip"`
+	Publicipid      string `json:"publicipid"`
+	Rootdeviceid    int64  `json:"rootdeviceid"`
+	Rootdevicetype  string `json:"rootdevicetype"`
+	Securitygroup   []struct {
+		Account     string `json:"account"`
+		Description string `json:"description"`
+		Domain      string `json:"domain"`
+		Domainid    string `json:"domainid"`
+		Egressrule  []struct {
+			Account           string `json:"account"`
+			Cidr              string `json:"cidr"`
+			Endport           int    `json:"endport"`
+			Icmpcode          int    `json:"icmpcode"`
+			Icmptype          int    `json:"icmptype"`
+			Protocol          string `json:"protocol"`
+			Ruleid            string `json:"ruleid"`
+			Securitygroupname string `json:"securitygroupname"`
+			Startport         int    `json:"startport"`
+			Tags              []struct {
+				Account      string `json:"account"`
+				Customer     string `json:"customer"`
+				Domain       string `json:"domain"`
+				Domainid     string `json:"domainid"`
+				Key          string `json:"key"`
+				Project      string `json:"project"`
+				Projectid    string `json:"projectid"`
+				Resourceid   string `json:"resourceid"`
+				Resourcetype string `json:"resourcetype"`
+				Value        string `json:"value"`
+			} `json:"tags"`
+		} `json:"egressrule"`
+		Id          string `json:"id"`
+		Ingressrule []struct {
+			Account           string `json:"account"`
+			Cidr              string `json:"cidr"`
+			Endport           int    `json:"endport"`
+			Icmpcode          int    `json:"icmpcode"`
+			Icmptype          int    `json:"icmptype"`
+			Protocol          string `json:"protocol"`
+			Ruleid            string `json:"ruleid"`
+			Securitygroupname string `json:"securitygroupname"`
+			Startport         int    `json:"startport"`
+			Tags              []struct {
+				Account      string `json:"account"`
+				Customer     string `json:"customer"`
+				Domain       string `json:"domain"`
+				Domainid     string `json:"domainid"`
+				Key          string `json:"key"`
+				Project      string `json:"project"`
+				Projectid    string `json:"projectid"`
+				Resourceid   string `json:"resourceid"`
+				Resourcetype string `json:"resourcetype"`
+				Value        string `json:"value"`
+			} `json:"tags"`
+		} `json:"ingressrule"`
+		Name      string `json:"name"`
+		Project   string `json:"project"`
+		Projectid string `json:"projectid"`
+		Tags      []struct {
+			Account      string `json:"account"`
+			Customer     string `json:"customer"`
+			Domain       string `json:"domain"`
+			Domainid     string `json:"domainid"`
+			Key          string `json:"key"`
+			Project      string `json:"project"`
+			Projectid    string `json:"projectid"`
+			Resourceid   string `json:"resourceid"`
+			Resourcetype string `json:"resourcetype"`
+			Value        string `json:"value"`
+		} `json:"tags"`
+		Virtualmachinecount int           `json:"virtualmachinecount"`
+		Virtualmachineids   []interface{} `json:"virtualmachineids"`
+	} `json:"securitygroup"`
+	Serviceofferingid   string `json:"serviceofferingid"`
+	Serviceofferingname string `json:"serviceofferingname"`
+	Servicestate        string `json:"servicestate"`
+	State               string `json:"state"`
+	Templatedisplaytext string `json:"templatedisplaytext"`
+	Templateid          string `json:"templateid"`
+	Templatename        string `json:"templatename"`
+	Userid              string `json:"userid"`
+	Username            string `json:"username"`
+	Vgpu                string `json:"vgpu"`
+	Zoneid              string `json:"zoneid"`
+	Zonename            string `json:"zonename"`
+}
+
+type ChangeServiceForVirtualMachineParams struct {
+	p map[string]interface{}
+}
+
+func (p *ChangeServiceForVirtualMachineParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["details"]; found {
+		i := 0
+		for k, vv := range v.(map[string]string) {
+			u.Set(fmt.Sprintf("details[%d].%s", i, k), vv)
+			i++
+		}
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["serviceofferingid"]; found {
+		u.Set("serviceofferingid", v.(string))
+	}
+	return u
+}
+
+func (p *ChangeServiceForVirtualMachineParams) SetDetails(v map[string]string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["details"] = v
+	return
+}
+
+func (p *ChangeServiceForVirtualMachineParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ChangeServiceForVirtualMachineParams) SetServiceofferingid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["serviceofferingid"] = v
+	return
+}
+
+// You should always use this function to get a new ChangeServiceForVirtualMachineParams instance,
+// as then you are sure you have configured all required params
+func (s *VirtualMachineService) NewChangeServiceForVirtualMachineParams(id string, serviceofferingid string) *ChangeServiceForVirtualMachineParams {
+	p := &ChangeServiceForVirtualMachineParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	p.p["serviceofferingid"] = serviceofferingid
+	return p
+}
+
+// Changes the service offering for a virtual machine. The virtual machine must be in a "Stopped" state for this command to take effect.
+func (s *VirtualMachineService) ChangeServiceForVirtualMachine(p *ChangeServiceForVirtualMachineParams) (*ChangeServiceForVirtualMachineResponse, error) {
+	resp, err := s.cs.newRequest("changeServiceForVirtualMachine", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ChangeServiceForVirtualMachineResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ChangeServiceForVirtualMachineResponse struct {
+	Account       string `json:"account"`
+	Affinitygroup []struct {
+		Account           string   `json:"account"`
+		Description       string   `json:"description"`
+		Domain            string   `json:"domain"`
+		Domainid          string   `json:"domainid"`
+		Id                string   `json:"id"`
+		Name              string   `json:"name"`
+		Project           string   `json:"project"`
+		Projectid         string   `json:"projectid"`
+		Type              string   `json:"type"`
+		VirtualmachineIds []string `json:"virtualmachineIds"`
+	} `json:"affinitygroup"`
+	Cpunumber             int               `json:"cpunumber"`
+	Cpuspeed              int               `json:"cpuspeed"`
+	Cpuused               string            `json:"cpuused"`
+	Created               string            `json:"created"`
+	Details               map[string]string `json:"details"`
+	Diskioread            int64             `json:"diskioread"`
+	Diskiowrite           int64             `json:"diskiowrite"`
+	Diskkbsread           int64             `json:"diskkbsread"`
+	Diskkbswrite          int64             `json:"diskkbswrite"`
+	Diskofferingid        string            `json:"diskofferingid"`
+	Diskofferingname      string            `json:"diskofferingname"`
+	Displayname           string            `json:"displayname"`
+	Displayvm             bool              `json:"displayvm"`
+	Domain                string            `json:"domain"`
+	Domainid              string            `json:"domainid"`
+	Forvirtualnetwork     bool              `json:"forvirtualnetwork"`
+	Group                 string            `json:"group"`
+	Groupid               string            `json:"groupid"`
+	Guestosid             string            `json:"guestosid"`
+	Haenable              bool              `json:"haenable"`
+	Hostid                string            `json:"hostid"`
+	Hostname              string            `json:"hostname"`
+	Hypervisor            string            `json:"hypervisor"`
+	Id                    string            `json:"id"`
+	Instancename          string            `json:"instancename"`
+	Isdynamicallyscalable bool              `json:"isdynamicallyscalable"`
+	Isodisplaytext        string            `json:"isodisplaytext"`
+	Isoid                 string            `json:"isoid"`
+	Isoname               string            `json:"isoname"`
+	Keypair               string            `json:"keypair"`
+	Memory                int               `json:"memory"`
+	Memoryintfreekbs      int64             `json:"memoryintfreekbs"`
+	Memorykbs             int64             `json:"memorykbs"`
+	Memorytargetkbs       int64             `json:"memorytargetkbs"`
+	Name                  string            `json:"name"`
+	Networkkbsread        int64             `json:"networkkbsread"`
+	Networkkbswrite       int64             `json:"networkkbswrite"`
+	Nic                   []struct {
+		Broadcasturi         string `json:"broadcasturi"`
+		Deviceid             string `json:"deviceid"`
+		Gateway              string `json:"gateway"`
+		Id                   string `json:"id"`
+		Ip6address           string `json:"ip6address"`
+		Ip6cidr              string `json:"ip6cidr"`
+		Ip6gateway           string `json:"ip6gateway"`
+		Ipaddress            string `json:"ipaddress"`
+		Isdefault            bool   `json:"isdefault"`
+		Isolationuri         string `json:"isolationuri"`
+		Macaddress           string `json:"macaddress"`
+		Netmask              string `json:"netmask"`
+		Networkid            string `json:"networkid"`
+		Networkname          string `json:"networkname"`
+		Nsxlogicalswitch     string `json:"nsxlogicalswitch"`
+		Nsxlogicalswitchport string `json:"nsxlogicalswitchport"`
+		Secondaryip          []struct {
+			Id        string `json:"id"`
+			Ipaddress string `json:"ipaddress"`
+		} `json:"secondaryip"`
+		Traffictype      string `json:"traffictype"`
+		Type             string `json:"type"`
+		Virtualmachineid string `json:"virtualmachineid"`
+	} `json:"nic"`
+	Ostypeid        int64  `json:"ostypeid"`
+	Password        string `json:"password"`
+	Passwordenabled bool   `json:"passwordenabled"`
+	Project         string `json:"project"`
+	Projectid       string `json:"projectid"`
+	Publicip        string `json:"publicip"`
+	Publicipid      string `json:"publicipid"`
+	Rootdeviceid    int64  `json:"rootdeviceid"`
+	Rootdevicetype  string `json:"rootdevicetype"`
+	Securitygroup   []struct {
+		Account     string `json:"account"`
+		Description string `json:"description"`
+		Domain      string `json:"domain"`
+		Domainid    string `json:"domainid"`
+		Egressrule  []struct {
+			Account           string `json:"account"`
+			Cidr              string `json:"cidr"`
+			Endport           int    `json:"endport"`
+			Icmpcode          int    `json:"icmpcode"`
+			Icmptype          int    `json:"icmptype"`
+			Protocol          string `json:"protocol"`
+			Ruleid            string `json:"ruleid"`
+			Securitygroupname string `json:"securitygroupname"`
+			Startport         int    `json:"startport"`
+			Tags              []struct {
+				Account      string `json:"account"`
+				Customer     string `json:"customer"`
+				Domain       string `json:"domain"`
+				Domainid     string `json:"domainid"`
+				Key          string `json:"key"`
+				Project      string `json:"project"`
+				Projectid    string `json:"projectid"`
+				Resourceid   string `json:"resourceid"`
+				Resourcetype string `json:"resourcetype"`
+				Value        string `json:"value"`
+			} `json:"tags"`
+		} `json:"egressrule"`
+		Id          string `json:"id"`
+		Ingressrule []struct {
+			Account           string `json:"account"`
+			Cidr              string `json:"cidr"`
+			Endport           int    `json:"endport"`
+			Icmpcode          int    `json:"icmpcode"`
+			Icmptype          int    `json:"icmptype"`
+			Protocol          string `json:"protocol"`
+			Ruleid            string `json:"ruleid"`
+			Securitygroupname string `json:"securitygroupname"`
+			Startport         int    `json:"startport"`
+			Tags              []struct {
+				Account      string `json:"account"`
+				Customer     string `json:"customer"`
+				Domain       string `json:"domain"`
+				Domainid     string `json:"domainid"`
+				Key          string `json:"key"`
+				Project      string `json:"project"`
+				Projectid    string `json:"projectid"`
+				Resourceid   string `json:"resourceid"`
+				Resourcetype string `json:"resourcetype"`
+				Value        string `json:"value"`
+			} `json:"tags"`
+		} `json:"ingressrule"`
+		Name      string `json:"name"`
+		Project   string `json:"project"`
+		Projectid string `json:"projectid"`
+		Tags      []struct {
+			Account      string `json:"account"`
+			Customer     string `json:"customer"`
+			Domain       string `json:"domain"`
+			Domainid     string `json:"domainid"`
+			Key          string `json:"key"`
+			Project      string `json:"project"`
+			Projectid    string `json:"projectid"`
+			Resourceid   string `json:"resourceid"`
+			Resourcetype string `json:"resourcetype"`
+			Value        string `json:"value"`
+		} `json:"tags"`
+		Virtualmachinecount int           `json:"virtualmachinecount"`
+		Virtualmachineids   []interface{} `json:"virtualmachineids"`
+	} `json:"securitygroup"`
+	Serviceofferingid   string `json:"serviceofferingid"`
+	Serviceofferingname string `json:"serviceofferingname"`
+	Servicestate        string `json:"servicestate"`
+	State               string `json:"state"`
+	Templatedisplaytext string `json:"templatedisplaytext"`
+	Templateid          string `json:"templateid"`
+	Templatename        string `json:"templatename"`
+	Userid              string `json:"userid"`
+	Username            string `json:"username"`
+	Vgpu                string `json:"vgpu"`
+	Zoneid              string `json:"zoneid"`
+	Zonename            string `json:"zonename"`
+}
+
+type CleanVMReservationsParams struct {
+	p map[string]interface{}
+}
+
+func (p *CleanVMReservationsParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	return u
+}
+
+// You should always use this function to get a new CleanVMReservationsParams instance,
+// as then you are sure you have configured all required params
+func (s *VirtualMachineService) NewCleanVMReservationsParams() *CleanVMReservationsParams {
+	p := &CleanVMReservationsParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// Cleanups VM reservations in the database.
+func (s *VirtualMachineService) CleanVMReservations(p *CleanVMReservationsParams) (*CleanVMReservationsResponse, error) {
+	resp, err := s.cs.newRequest("cleanVMReservations", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r CleanVMReservationsResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type CleanVMReservationsResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
+
+type DeployVirtualMachineParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeployVirtualMachineParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["affinitygroupids"]; found {
+		vv := strings.Join(v.([]string), ",")
+		u.Set("affinitygroupids", vv)
+	}
+	if v, found := p.p["affinitygroupnames"]; found {
+		vv := strings.Join(v.([]string), ",")
+		u.Set("affinitygroupnames", vv)
+	}
+	if v, found := p.p["customid"]; found {
+		u.Set("customid", v.(string))
+	}
+	if v, found := p.p["deploymentplanner"]; found {
+		u.Set("deploymentplanner", v.(string))
+	}
+	if v, found := p.p["details"]; found {
+		i := 0
+		for k, vv := range v.(map[string]string) {
+			u.Set(fmt.Sprintf("details[%d].%s", i, k), vv)
+			i++
+		}
+	}
+	if v, found := p.p["diskofferingid"]; found {
+		u.Set("diskofferingid", v.(string))
+	}
+	if v, found := p.p["displayname"]; found {
+		u.Set("displayname", v.(string))
+	}
+	if v, found := p.p["displayvm"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("displayvm", vv)
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["group"]; found {
+		u.Set("group", v.(string))
+	}
+	if v, found := p.p["hostid"]; found {
+		u.Set("hostid", v.(string))
+	}
+	if v, found := p.p["hypervisor"]; found {
+		u.Set("hypervisor", v.(string))
+	}
+	if v, found := p.p["ip6address"]; found {
+		u.Set("ip6address", v.(string))
+	}
+	if v, found := p.p["ipaddress"]; found {
+		u.Set("ipaddress", v.(string))
+	}
+	if v, found := p.p["iptonetworklist"]; found {
+		i := 0
+		for k, vv := range v.(map[string]string) {
+			u.Set(fmt.Sprintf("iptonetworklist[%d].key", i), k)
+			u.Set(fmt.Sprintf("iptonetworklist[%d].value", i), vv)
+			i++
+		}
+	}
+	if v, found := p.p["keyboard"]; found {
+		u.Set("keyboard", v.(string))
+	}
+	if v, found := p.p["keypair"]; found {
+		u.Set("keypair", v.(string))
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["networkids"]; found {
+		vv := strings.Join(v.([]string), ",")
+		u.Set("networkids", vv)
+	}
+	if v, found := p.p["projectid"]; found {
+		u.Set("projectid", v.(string))
+	}
+	if v, found := p.p["rootdisksize"]; found {
+		vv := strconv.FormatInt(v.(int64), 10)
+		u.Set("rootdisksize", vv)
+	}
+	if v, found := p.p["securitygroupids"]; found {
+		vv := strings.Join(v.([]string), ",")
+		u.Set("securitygroupids", vv)
+	}
+	if v, found := p.p["securitygroupnames"]; found {
+		vv := strings.Join(v.([]string), ",")
+		u.Set("securitygroupnames", vv)
+	}
+	if v, found := p.p["serviceofferingid"]; found {
+		u.Set("serviceofferingid", v.(string))
+	}
+	if v, found := p.p["size"]; found {
+		vv := strconv.FormatInt(v.(int64), 10)
+		u.Set("size", vv)
+	}
+	if v, found := p.p["startvm"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("startvm", vv)
+	}
+	if v, found := p.p["templateid"]; found {
+		u.Set("templateid", v.(string))
+	}
+	if v, found := p.p["userdata"]; found {
+		u.Set("userdata", v.(string))
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *DeployVirtualMachineParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *DeployVirtualMachineParams) SetAffinitygroupids(v []string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["affinitygroupids"] = v
+	return
+}
+
+func (p *DeployVirtualMachineParams) SetAffinitygroupnames(v []string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["affinitygroupnames"] = v
+	return
+}
+
+func (p *DeployVirtualMachineParams) SetCustomid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["customid"] = v
+	return
+}
+
+func (p *DeployVirtualMachineParams) SetDeploymentplanner(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["deploymentplanner"] = v
+	return
+}
+
+func (p *DeployVirtualMachineParams) SetDetails(v map[string]string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["details"] = v
+	return
+}
+
+func (p *DeployVirtualMachineParams) SetDiskofferingid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["diskofferingid"] = v
+	return
+}
+
+func (p *DeployVirtualMachineParams) SetDisplayname(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["displayname"] = v
+	return
+}
+
+func (p *DeployVirtualMachineParams) SetDisplayvm(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["displayvm"] = v
+	return
+}
+
+func (p *DeployVirtualMachineParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *DeployVirtualMachineParams) SetGroup(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["group"] = v
+	return
+}
+
+func (p *DeployVirtualMachineParams) SetHostid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["hostid"] = v
+	return
+}
+
+func (p *DeployVirtualMachineParams) SetHypervisor(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["hypervisor"] = v
+	return
+}
+
+func (p *DeployVirtualMachineParams) SetIp6address(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["ip6address"] = v
+	return
+}
+
+func (p *DeployVirtualMachineParams) SetIpaddress(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["ipaddress"] = v
+	return
+}
+
+func (p *DeployVirtualMachineParams) SetIptonetworklist(v map[string]string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["iptonetworklist"] = v
+	return
+}
+
+func (p *DeployVirtualMachineParams) SetKeyboard(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyboard"] = v
+	return
+}
+
+func (p *DeployVirtualMachineParams) SetKeypair(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keypair"] = v
+	return
+}
+
+func (p *DeployVirtualMachineParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *DeployVirtualMachineParams) SetNetworkids(v []string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["networkids"] = v
+	return
+}
+
+func (p *DeployVirtualMachineParams) SetProjectid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectid"] = v
+	return
+}
+
+func (p *DeployVirtualMachineParams) SetRootdisksize(v int64) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["rootdisksize"] = v
+	return
+}
+
+func (p *DeployVirtualMachineParams) SetSecuritygroupids(v []string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["securitygroupids"] = v
+	return
+}
+
+func (p *DeployVirtualMachineParams) SetSecuritygroupnames(v []string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["securitygroupnames"] = v
+	return
+}
+
+func (p *DeployVirtualMachineParams) SetServiceofferingid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["serviceofferingid"] = v
+	return
+}
+
+func (p *DeployVirtualMachineParams) SetSize(v int64) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["size"] = v
+	return
+}
+
+func (p *DeployVirtualMachineParams) SetStartvm(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["startvm"] = v
+	return
+}
+
+func (p *DeployVirtualMachineParams) SetTemplateid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["templateid"] = v
+	return
+}
+
+func (p *DeployVirtualMachineParams) SetUserdata(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["userdata"] = v
+	return
+}
+
+func (p *DeployVirtualMachineParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new DeployVirtualMachineParams instance,
+// as then you are sure you have configured all required params
+func (s *VirtualMachineService) NewDeployVirtualMachineParams(serviceofferingid string, templateid string, zoneid string) *DeployVirtualMachineParams {
+	p := &DeployVirtualMachineParams{}
+	p.p = make(map[string]interface{})
+	p.p["serviceofferingid"] = serviceofferingid
+	p.p["templateid"] = templateid
+	p.p["zoneid"] = zoneid
+	return p
+}
+
+// Creates and automatically starts a virtual machine based on a service offering, disk offering, and template.
+func (s *VirtualMachineService) DeployVirtualMachine(p *DeployVirtualMachineParams) (*DeployVirtualMachineResponse, error) {
+	resp, err := s.cs.newRequest("deployVirtualMachine", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeployVirtualMachineResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type DeployVirtualMachineResponse struct {
+	JobID         string `json:"jobid"`
+	Account       string `json:"account"`
+	Affinitygroup []struct {
+		Account           string   `json:"account"`
+		Description       string   `json:"description"`
+		Domain            string   `json:"domain"`
+		Domainid          string   `json:"domainid"`
+		Id                string   `json:"id"`
+		Name              string   `json:"name"`
+		Project           string   `json:"project"`
+		Projectid         string   `json:"projectid"`
+		Type              string   `json:"type"`
+		VirtualmachineIds []string `json:"virtualmachineIds"`
+	} `json:"affinitygroup"`
+	Cpunumber             int               `json:"cpunumber"`
+	Cpuspeed              int               `json:"cpuspeed"`
+	Cpuused               string            `json:"cpuused"`
+	Created               string            `json:"created"`
+	Details               map[string]string `json:"details"`
+	Diskioread            int64             `json:"diskioread"`
+	Diskiowrite           int64             `json:"diskiowrite"`
+	Diskkbsread           int64             `json:"diskkbsread"`
+	Diskkbswrite          int64             `json:"diskkbswrite"`
+	Diskofferingid        string            `json:"diskofferingid"`
+	Diskofferingname      string            `json:"diskofferingname"`
+	Displayname           string            `json:"displayname"`
+	Displayvm             bool              `json:"displayvm"`
+	Domain                string            `json:"domain"`
+	Domainid              string            `json:"domainid"`
+	Forvirtualnetwork     bool              `json:"forvirtualnetwork"`
+	Group                 string            `json:"group"`
+	Groupid               string            `json:"groupid"`
+	Guestosid             string            `json:"guestosid"`
+	Haenable              bool              `json:"haenable"`
+	Hostid                string            `json:"hostid"`
+	Hostname              string            `json:"hostname"`
+	Hypervisor            string            `json:"hypervisor"`
+	Id                    string            `json:"id"`
+	Instancename          string            `json:"instancename"`
+	Isdynamicallyscalable bool              `json:"isdynamicallyscalable"`
+	Isodisplaytext        string            `json:"isodisplaytext"`
+	Isoid                 string            `json:"isoid"`
+	Isoname               string            `json:"isoname"`
+	Keypair               string            `json:"keypair"`
+	Memory                int               `json:"memory"`
+	Memoryintfreekbs      int64             `json:"memoryintfreekbs"`
+	Memorykbs             int64             `json:"memorykbs"`
+	Memorytargetkbs       int64             `json:"memorytargetkbs"`
+	Name                  string            `json:"name"`
+	Networkkbsread        int64             `json:"networkkbsread"`
+	Networkkbswrite       int64             `json:"networkkbswrite"`
+	Nic                   []struct {
+		Broadcasturi         string `json:"broadcasturi"`
+		Deviceid             string `json:"deviceid"`
+		Gateway              string `json:"gateway"`
+		Id                   string `json:"id"`
+		Ip6address           string `json:"ip6address"`
+		Ip6cidr              string `json:"ip6cidr"`
+		Ip6gateway           string `json:"ip6gateway"`
+		Ipaddress            string `json:"ipaddress"`
+		Isdefault            bool   `json:"isdefault"`
+		Isolationuri         string `json:"isolationuri"`
+		Macaddress           string `json:"macaddress"`
+		Netmask              string `json:"netmask"`
+		Networkid            string `json:"networkid"`
+		Networkname          string `json:"networkname"`
+		Nsxlogicalswitch     string `json:"nsxlogicalswitch"`
+		Nsxlogicalswitchport string `json:"nsxlogicalswitchport"`
+		Secondaryip          []struct {
+			Id        string `json:"id"`
+			Ipaddress string `json:"ipaddress"`
+		} `json:"secondaryip"`
+		Traffictype      string `json:"traffictype"`
+		Type             string `json:"type"`
+		Virtualmachineid string `json:"virtualmachineid"`
+	} `json:"nic"`
+	Ostypeid        int64  `json:"ostypeid"`
+	Password        string `json:"password"`
+	Passwordenabled bool   `json:"passwordenabled"`
+	Project         string `json:"project"`
+	Projectid       string `json:"projectid"`
+	Publicip        string `json:"publicip"`
+	Publicipid      string `json:"publicipid"`
+	Rootdeviceid    int64  `json:"rootdeviceid"`
+	Rootdevicetype  string `json:"rootdevicetype"`
+	Securitygroup   []struct {
+		Account     string `json:"account"`
+		Description string `json:"description"`
+		Domain      string `json:"domain"`
+		Domainid    string `json:"domainid"`
+		Egressrule  []struct {
+			Account           string `json:"account"`
+			Cidr              string `json:"cidr"`
+			Endport           int    `json:"endport"`
+			Icmpcode          int    `json:"icmpcode"`
+			Icmptype          int    `json:"icmptype"`
+			Protocol          string `json:"protocol"`
+			Ruleid            string `json:"ruleid"`
+			Securitygroupname string `json:"securitygroupname"`
+			Startport         int    `json:"startport"`
+			Tags              []struct {
+				Account      string `json:"account"`
+				Customer     string `json:"customer"`
+				Domain       string `json:"domain"`
+				Domainid     string `json:"domainid"`
+				Key          string `json:"key"`
+				Project      string `json:"project"`
+				Projectid    string `json:"projectid"`
+				Resourceid   string `json:"resourceid"`
+				Resourcetype string `json:"resourcetype"`
+				Value        string `json:"value"`
+			} `json:"tags"`
+		} `json:"egressrule"`
+		Id          string `json:"id"`
+		Ingressrule []struct {
+			Account           string `json:"account"`
+			Cidr              string `json:"cidr"`
+			Endport           int    `json:"endport"`
+			Icmpcode          int    `json:"icmpcode"`
+			Icmptype          int    `json:"icmptype"`
+			Protocol          string `json:"protocol"`
+			Ruleid            string `json:"ruleid"`
+			Securitygroupname string `json:"securitygroupname"`
+			Startport         int    `json:"startport"`
+			Tags              []struct {
+				Account      string `json:"account"`
+				Customer     string `json:"customer"`
+				Domain       string `json:"domain"`
+				Domainid     string `json:"domainid"`
+				Key          string `json:"key"`
+				Project      string `json:"project"`
+				Projectid    string `json:"projectid"`
+				Resourceid   string `json:"resourceid"`
+				Resourcetype string `json:"resourcetype"`
+				Value        string `json:"value"`
+			} `json:"tags"`
+		} `json:"ingressrule"`
+		Name      string `json:"name"`
+		Project   string `json:"project"`
+		Projectid string `json:"projectid"`
+		Tags      []struct {
+			Account      string `json:"account"`
+			Customer     string `json:"customer"`
+			Domain       string `json:"domain"`
+			Domainid     string `json:"domainid"`
+			Key          string `json:"key"`
+			Project      string `json:"project"`
+			Projectid    string `json:"projectid"`
+			Resourceid   string `json:"resourceid"`
+			Resourcetype string `json:"resourcetype"`
+			Value        string `json:"value"`
+		} `json:"tags"`
+		Virtualmachinecount int           `json:"virtualmachinecount"`
+		Virtualmachineids   []interface{} `json:"virtualmachineids"`
+	} `json:"securitygroup"`
+	Serviceofferingid   string `json:"serviceofferingid"`
+	Serviceofferingname string `json:"serviceofferingname"`
+	Servicestate        string `json:"servicestate"`
+	State               string `json:"state"`
+	Templatedisplaytext string `json:"templatedisplaytext"`
+	Templateid          string `json:"templateid"`
+	Templatename        string `json:"templatename"`
+	Userid              string `json:"userid"`
+	Username            string `json:"username"`
+	Vgpu                string `json:"vgpu"`
+	Zoneid              string `json:"zoneid"`
+	Zonename            string `json:"zonename"`
+}
+
+type DestroyVirtualMachineParams struct {
+	p map[string]interface{}
+}
+
+func (p *DestroyVirtualMachineParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["expunge"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("expunge", vv)
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *DestroyVirtualMachineParams) SetExpunge(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["expunge"] = v
+	return
+}
+
+func (p *DestroyVirtualMachineParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new DestroyVirtualMachineParams instance,
+// as then you are sure you have configured all required params
+func (s *VirtualMachineService) NewDestroyVirtualMachineParams(id string) *DestroyVirtualMachineParams {
+	p := &DestroyVirtualMachineParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Destroys a virtual machine.
+func (s *VirtualMachineService) DestroyVirtualMachine(p *DestroyVirtualMachineParams) (*DestroyVirtualMachineResponse, error) {
+	resp, err := s.cs.newRequest("destroyVirtualMachine", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DestroyVirtualMachineResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type DestroyVirtualMachineResponse struct {
+	JobID         string `json:"jobid"`
+	Account       string `json:"account"`
+	Affinitygroup []struct {
+		Account           string   `json:"account"`
+		Description       string   `json:"description"`
+		Domain            string   `json:"domain"`
+		Domainid          string   `json:"domainid"`
+		Id                string   `json:"id"`
+		Name              string   `json:"name"`
+		Project           string   `json:"project"`
+		Projectid         string   `json:"projectid"`
+		Type              string   `json:"type"`
+		VirtualmachineIds []string `json:"virtualmachineIds"`
+	} `json:"affinitygroup"`
+	Cpunumber             int               `json:"cpunumber"`
+	Cpuspeed              int               `json:"cpuspeed"`
+	Cpuused               string            `json:"cpuused"`
+	Created               string            `json:"created"`
+	Details               map[string]string `json:"details"`
+	Diskioread            int64             `json:"diskioread"`
+	Diskiowrite           int64             `json:"diskiowrite"`
+	Diskkbsread           int64             `json:"diskkbsread"`
+	Diskkbswrite          int64             `json:"diskkbswrite"`
+	Diskofferingid        string            `json:"diskofferingid"`
+	Diskofferingname      string            `json:"diskofferingname"`
+	Displayname           string            `json:"displayname"`
+	Displayvm             bool              `json:"displayvm"`
+	Domain                string            `json:"domain"`
+	Domainid              string            `json:"domainid"`
+	Forvirtualnetwork     bool              `json:"forvirtualnetwork"`
+	Group                 string            `json:"group"`
+	Groupid               string            `json:"groupid"`
+	Guestosid             string            `json:"guestosid"`
+	Haenable              bool              `json:"haenable"`
+	Hostid                string            `json:"hostid"`
+	Hostname              string            `json:"hostname"`
+	Hypervisor            string            `json:"hypervisor"`
+	Id                    string            `json:"id"`
+	Instancename          string            `json:"instancename"`
+	Isdynamicallyscalable bool              `json:"isdynamicallyscalable"`
+	Isodisplaytext        string            `json:"isodisplaytext"`
+	Isoid                 string            `json:"isoid"`
+	Isoname               string            `json:"isoname"`
+	Keypair               string            `json:"keypair"`
+	Memory                int               `json:"memory"`
+	Memoryintfreekbs      int64             `json:"memoryintfreekbs"`
+	Memorykbs             int64             `json:"memorykbs"`
+	Memorytargetkbs       int64             `json:"memorytargetkbs"`
+	Name                  string            `json:"name"`
+	Networkkbsread        int64             `json:"networkkbsread"`
+	Networkkbswrite       int64             `json:"networkkbswrite"`
+	Nic                   []struct {
+		Broadcasturi         string `json:"broadcasturi"`
+		Deviceid             string `json:"deviceid"`
+		Gateway              string `json:"gateway"`
+		Id                   string `json:"id"`
+		Ip6address           string `json:"ip6address"`
+		Ip6cidr              string `json:"ip6cidr"`
+		Ip6gateway           string `json:"ip6gateway"`
+		Ipaddress            string `json:"ipaddress"`
+		Isdefault            bool   `json:"isdefault"`
+		Isolationuri         string `json:"isolationuri"`
+		Macaddress           string `json:"macaddress"`
+		Netmask              string `json:"netmask"`
+		Networkid            string `json:"networkid"`
+		Networkname          string `json:"networkname"`
+		Nsxlogicalswitch     string `json:"nsxlogicalswitch"`
+		Nsxlogicalswitchport string `json:"nsxlogicalswitchport"`
+		Secondaryip          []struct {
+			Id        string `json:"id"`
+			Ipaddress string `json:"ipaddress"`
+		} `json:"secondaryip"`
+		Traffictype      string `json:"traffictype"`
+		Type             string `json:"type"`
+		Virtualmachineid string `json:"virtualmachineid"`
+	} `json:"nic"`
+	Ostypeid        int64  `json:"ostypeid"`
+	Password        string `json:"password"`
+	Passwordenabled bool   `json:"passwordenabled"`
+	Project         string `json:"project"`
+	Projectid       string `json:"projectid"`
+	Publicip        string `json:"publicip"`
+	Publicipid      string `json:"publicipid"`
+	Rootdeviceid    int64  `json:"rootdeviceid"`
+	Rootdevicetype  string `json:"rootdevicetype"`
+	Securitygroup   []struct {
+		Account     string `json:"account"`
+		Description string `json:"description"`
+		Domain      string `json:"domain"`
+		Domainid    string `json:"domainid"`
+		Egressrule  []struct {
+			Account           string `json:"account"`
+			Cidr              string `json:"cidr"`
+			Endport           int    `json:"endport"`
+			Icmpcode          int    `json:"icmpcode"`
+			Icmptype          int    `json:"icmptype"`
+			Protocol          string `json:"protocol"`
+			Ruleid            string `json:"ruleid"`
+			Securitygroupname string `json:"securitygroupname"`
+			Startport         int    `json:"startport"`
+			Tags              []struct {
+				Account      string `json:"account"`
+				Customer     string `json:"customer"`
+				Domain       string `json:"domain"`
+				Domainid     string `json:"domainid"`
+				Key          string `json:"key"`
+				Project      string `json:"project"`
+				Projectid    string `json:"projectid"`
+				Resourceid   string `json:"resourceid"`
+				Resourcetype string `json:"resourcetype"`
+				Value        string `json:"value"`
+			} `json:"tags"`
+		} `json:"egressrule"`
+		Id          string `json:"id"`
+		Ingressrule []struct {
+			Account           string `json:"account"`
+			Cidr              string `json:"cidr"`
+			Endport           int    `json:"endport"`
+			Icmpcode          int    `json:"icmpcode"`
+			Icmptype          int    `json:"icmptype"`
+			Protocol          string `json:"protocol"`
+			Ruleid            string `json:"ruleid"`
+			Securitygroupname string `json:"securitygroupname"`
+			Startport         int    `json:"startport"`
+			Tags              []struct {
+				Account      string `json:"account"`
+				Customer     string `json:"customer"`
+				Domain       string `json:"domain"`
+				Domainid     string `json:"domainid"`
+				Key          string `json:"key"`
+				Project      string `json:"project"`
+				Projectid    string `json:"projectid"`
+				Resourceid   string `json:"resourceid"`
+				Resourcetype string `json:"resourcetype"`
+				Value        string `json:"value"`
+			} `json:"tags"`
+		} `json:"ingressrule"`
+		Name      string `json:"name"`
+		Project   string `json:"project"`
+		Projectid string `json:"projectid"`
+		Tags      []struct {
+			Account      string `json:"account"`
+			Customer     string `json:"customer"`
+			Domain       string `json:"domain"`
+			Domainid     string `json:"domainid"`
+			Key          string `json:"key"`
+			Project      string `json:"project"`
+			Projectid    string `json:"projectid"`
+			Resourceid   string `json:"resourceid"`
+			Resourcetype string `json:"resourcetype"`
+			Value        string `json:"value"`
+		} `json:"tags"`
+		Virtualmachinecount int           `json:"virtualmachinecount"`
+		Virtualmachineids   []interface{} `json:"virtualmachineids"`
+	} `json:"securitygroup"`
+	Serviceofferingid   string `json:"serviceofferingid"`
+	Serviceofferingname string `json:"serviceofferingname"`
+	Servicestate        string `json:"servicestate"`
+	State               string `json:"state"`
+	Templatedisplaytext string `json:"templatedisplaytext"`
+	Templateid          string `json:"templateid"`
+	Templatename        string `json:"templatename"`
+	Userid              string `json:"userid"`
+	Username            string `json:"username"`
+	Vgpu                string `json:"vgpu"`
+	Zoneid              string `json:"zoneid"`
+	Zonename            string `json:"zonename"`
+}
+
+type ExpungeVirtualMachineParams struct {
+	p map[string]interface{}
+}
+
+func (p *ExpungeVirtualMachineParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *ExpungeVirtualMachineParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new ExpungeVirtualMachineParams instance,
+// as then you are sure you have configured all required params
+func (s *VirtualMachineService) NewExpungeVirtualMachineParams(id string) *ExpungeVirtualMachineParams {
+	p := &ExpungeVirtualMachineParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Expunge a virtual machine. Once expunged, it cannot be recoverd.
+func (s *VirtualMachineService) ExpungeVirtualMachine(p *ExpungeVirtualMachineParams) (*ExpungeVirtualMachineResponse, error) {
+	resp, err := s.cs.newRequest("expungeVirtualMachine", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ExpungeVirtualMachineResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type ExpungeVirtualMachineResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
+
+type GetVMPasswordParams struct {
+	p map[string]interface{}
+}
+
+func (p *GetVMPasswordParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *GetVMPasswordParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new GetVMPasswordParams instance,
+// as then you are sure you have configured all required params
+func (s *VirtualMachineService) NewGetVMPasswordParams(id string) *GetVMPasswordParams {
+	p := &GetVMPasswordParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Returns an encrypted password for the VM
+func (s *VirtualMachineService) GetVMPassword(p *GetVMPasswordParams) (*GetVMPasswordResponse, error) {
+	resp, err := s.cs.newRequest("getVMPassword", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r GetVMPasswordResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type GetVMPasswordResponse struct {
+	Encryptedpassword string `json:"encryptedpassword"`
+}
+
+type ListVirtualMachinesParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListVirtualMachinesParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["affinitygroupid"]; found {
+		u.Set("affinitygroupid", v.(string))
+	}
+	if v, found := p.p["details"]; found {
+		vv := strings.Join(v.([]string), ",")
+		u.Set("details", vv)
+	}
+	if v, found := p.p["displayvm"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("displayvm", vv)
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["forvirtualnetwork"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("forvirtualnetwork", vv)
+	}
+	if v, found := p.p["groupid"]; found {
+		u.Set("groupid", v.(string))
+	}
+	if v, found := p.p["hostid"]; found {
+		u.Set("hostid", v.(string))
+	}
+	if v, found := p.p["hostid"]; found {
+		u.Set("hostid", v.(string))
+	}
+	if v, found := p.p["hypervisor"]; found {
+		u.Set("hypervisor", v.(string))
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["ids"]; found {
+		vv := strings.Join(v.([]string), ",")
+		u.Set("ids", vv)
+	}
+	if v, found := p.p["isoid"]; found {
+		u.Set("isoid", v.(string))
+	}
+	if v, found := p.p["isrecursive"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("isrecursive", vv)
+	}
+	if v, found := p.p["keypair"]; found {
+		u.Set("keypair", v.(string))
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["listall"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("listall", vv)
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["networkid"]; found {
+		u.Set("networkid", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["podid"]; found {
+		u.Set("podid", v.(string))
+	}
+	if v, found := p.p["podid"]; found {
+		u.Set("podid", v.(string))
+	}
+	if v, found := p.p["projectid"]; found {
+		u.Set("projectid", v.(string))
+	}
+	if v, found := p.p["serviceofferingid"]; found {
+		u.Set("serviceofferingid", v.(string))
+	}
+	if v, found := p.p["state"]; found {
+		u.Set("state", v.(string))
+	}
+	if v, found := p.p["storageid"]; found {
+		u.Set("storageid", v.(string))
+	}
+	if v, found := p.p["storageid"]; found {
+		u.Set("storageid", v.(string))
+	}
+	if v, found := p.p["tags"]; found {
+		i := 0
+		for k, vv := range v.(map[string]string) {
+			u.Set(fmt.Sprintf("tags[%d].key", i), k)
+			u.Set(fmt.Sprintf("tags[%d].value", i), vv)
+			i++
+		}
+	}
+	if v, found := p.p["templateid"]; found {
+		u.Set("templateid", v.(string))
+	}
+	if v, found := p.p["userid"]; found {
+		u.Set("userid", v.(string))
+	}
+	if v, found := p.p["vpcid"]; found {
+		u.Set("vpcid", v.(string))
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *ListVirtualMachinesParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *ListVirtualMachinesParams) SetAffinitygroupid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["affinitygroupid"] = v
+	return
+}
+
+func (p *ListVirtualMachinesParams) SetDetails(v []string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["details"] = v
+	return
+}
+
+func (p *ListVirtualMachinesParams) SetDisplayvm(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["displayvm"] = v
+	return
+}
+
+func (p *ListVirtualMachinesParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *ListVirtualMachinesParams) SetForvirtualnetwork(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["forvirtualnetwork"] = v
+	return
+}
+
+func (p *ListVirtualMachinesParams) SetGroupid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["groupid"] = v
+	return
+}
+
+func (p *ListVirtualMachinesParams) SetHostid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["hostid"] = v
+	return
+}
+
+func (p *ListVirtualMachinesParams) SetHypervisor(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["hypervisor"] = v
+	return
+}
+
+func (p *ListVirtualMachinesParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ListVirtualMachinesParams) SetIds(v []string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["ids"] = v
+	return
+}
+
+func (p *ListVirtualMachinesParams) SetIsoid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isoid"] = v
+	return
+}
+
+func (p *ListVirtualMachinesParams) SetIsrecursive(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isrecursive"] = v
+	return
+}
+
+func (p *ListVirtualMachinesParams) SetKeypair(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keypair"] = v
+	return
+}
+
+func (p *ListVirtualMachinesParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListVirtualMachinesParams) SetListall(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["listall"] = v
+	return
+}
+
+func (p *ListVirtualMachinesParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *ListVirtualMachinesParams) SetNetworkid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["networkid"] = v
+	return
+}
+
+func (p *ListVirtualMachinesParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListVirtualMachinesParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListVirtualMachinesParams) SetPodid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["podid"] = v
+	return
+}
+
+func (p *ListVirtualMachinesParams) SetProjectid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectid"] = v
+	return
+}
+
+func (p *ListVirtualMachinesParams) SetServiceofferingid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["serviceofferingid"] = v
+	return
+}
+
+func (p *ListVirtualMachinesParams) SetState(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["state"] = v
+	return
+}
+
+func (p *ListVirtualMachinesParams) SetStorageid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["storageid"] = v
+	return
+}
+
+func (p *ListVirtualMachinesParams) SetTags(v map[string]string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["tags"] = v
+	return
+}
+
+func (p *ListVirtualMachinesParams) SetTemplateid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["templateid"] = v
+	return
+}
+
+func (p *ListVirtualMachinesParams) SetUserid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["userid"] = v
+	return
+}
+
+func (p *ListVirtualMachinesParams) SetVpcid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["vpcid"] = v
+	return
+}
+
+func (p *ListVirtualMachinesParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new ListVirtualMachinesParams instance,
+// as then you are sure you have configured all required params
+func (s *VirtualMachineService) NewListVirtualMachinesParams() *ListVirtualMachinesParams {
+	p := &ListVirtualMachinesParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *VirtualMachineService) GetVirtualMachineID(name string, opts ...OptionFunc) (string, int, error) {
+	p := &ListVirtualMachinesParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["name"] = name
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return "", -1, err
+		}
+	}
+
+	l, err := s.ListVirtualMachines(p)
+	if err != nil {
+		return "", -1, err
+	}
+
+	if l.Count == 0 {
+		return "", l.Count, fmt.Errorf("No match found for %s: %+v", name, l)
+	}
+
+	if l.Count == 1 {
+		return l.VirtualMachines[0].Id, l.Count, nil
+	}
+
+	if l.Count > 1 {
+		for _, v := range l.VirtualMachines {
+			if v.Name == name {
+				return v.Id, l.Count, nil
+			}
+		}
+	}
+	return "", l.Count, fmt.Errorf("Could not find an exact match for %s: %+v", name, l)
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *VirtualMachineService) GetVirtualMachineByName(name string, opts ...OptionFunc) (*VirtualMachine, int, error) {
+	id, count, err := s.GetVirtualMachineID(name, opts...)
+	if err != nil {
+		return nil, count, err
+	}
+
+	r, count, err := s.GetVirtualMachineByID(id, opts...)
+	if err != nil {
+		return nil, count, err
+	}
+	return r, count, nil
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *VirtualMachineService) GetVirtualMachineByID(id string, opts ...OptionFunc) (*VirtualMachine, int, error) {
+	p := &ListVirtualMachinesParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["id"] = id
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return nil, -1, err
+		}
+	}
+
+	l, err := s.ListVirtualMachines(p)
+	if err != nil {
+		if strings.Contains(err.Error(), fmt.Sprintf(
+			"Invalid parameter id value=%s due to incorrect long value format, "+
+				"or entity does not exist", id)) {
+			return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
+		}
+		return nil, -1, err
+	}
+
+	if l.Count == 0 {
+		return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
+	}
+
+	if l.Count == 1 {
+		return l.VirtualMachines[0], l.Count, nil
+	}
+	return nil, l.Count, fmt.Errorf("There is more then one result for VirtualMachine UUID: %s!", id)
+}
+
+// List the virtual machines owned by the account.
+func (s *VirtualMachineService) ListVirtualMachines(p *ListVirtualMachinesParams) (*ListVirtualMachinesResponse, error) {
+	resp, err := s.cs.newRequest("listVirtualMachines", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListVirtualMachinesResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListVirtualMachinesResponse struct {
+	Count           int               `json:"count"`
+	VirtualMachines []*VirtualMachine `json:"virtualmachine"`
+}
+
+type VirtualMachine struct {
+	Account       string `json:"account"`
+	Affinitygroup []struct {
+		Account           string   `json:"account"`
+		Description       string   `json:"description"`
+		Domain            string   `json:"domain"`
+		Domainid          string   `json:"domainid"`
+		Id                string   `json:"id"`
+		Name              string   `json:"name"`
+		Project           string   `json:"project"`
+		Projectid         string   `json:"projectid"`
+		Type              string   `json:"type"`
+		VirtualmachineIds []string `json:"virtualmachineIds"`
+	} `json:"affinitygroup"`
+	Cpunumber             int               `json:"cpunumber"`
+	Cpuspeed              int               `json:"cpuspeed"`
+	Cpuused               string            `json:"cpuused"`
+	Created               string            `json:"created"`
+	Details               map[string]string `json:"details"`
+	Diskioread            int64             `json:"diskioread"`
+	Diskiowrite           int64             `json:"diskiowrite"`
+	Diskkbsread           int64             `json:"diskkbsread"`
+	Diskkbswrite          int64             `json:"diskkbswrite"`
+	Diskofferingid        string            `json:"diskofferingid"`
+	Diskofferingname      string            `json:"diskofferingname"`
+	Displayname           string            `json:"displayname"`
+	Displayvm             bool              `json:"displayvm"`
+	Domain                string            `json:"domain"`
+	Domainid              string            `json:"domainid"`
+	Forvirtualnetwork     bool              `json:"forvirtualnetwork"`
+	Group                 string            `json:"group"`
+	Groupid               string            `json:"groupid"`
+	Guestosid             string            `json:"guestosid"`
+	Haenable              bool              `json:"haenable"`
+	Hostid                string            `json:"hostid"`
+	Hostname              string            `json:"hostname"`
+	Hypervisor            string            `json:"hypervisor"`
+	Id                    string            `json:"id"`
+	Instancename          string            `json:"instancename"`
+	Isdynamicallyscalable bool              `json:"isdynamicallyscalable"`
+	Isodisplaytext        string            `json:"isodisplaytext"`
+	Isoid                 string            `json:"isoid"`
+	Isoname               string            `json:"isoname"`
+	Keypair               string            `json:"keypair"`
+	Memory                int               `json:"memory"`
+	Memoryintfreekbs      int64             `json:"memoryintfreekbs"`
+	Memorykbs             int64             `json:"memorykbs"`
+	Memorytargetkbs       int64             `json:"memorytargetkbs"`
+	Name                  string            `json:"name"`
+	Networkkbsread        int64             `json:"networkkbsread"`
+	Networkkbswrite       int64             `json:"networkkbswrite"`
+	Nic                   []struct {
+		Broadcasturi         string `json:"broadcasturi"`
+		Deviceid             string `json:"deviceid"`
+		Gateway              string `json:"gateway"`
+		Id                   string `json:"id"`
+		Ip6address           string `json:"ip6address"`
+		Ip6cidr              string `json:"ip6cidr"`
+		Ip6gateway           string `json:"ip6gateway"`
+		Ipaddress            string `json:"ipaddress"`
+		Isdefault            bool   `json:"isdefault"`
+		Isolationuri         string `json:"isolationuri"`
+		Macaddress           string `json:"macaddress"`
+		Netmask              string `json:"netmask"`
+		Networkid            string `json:"networkid"`
+		Networkname          string `json:"networkname"`
+		Nsxlogicalswitch     string `json:"nsxlogicalswitch"`
+		Nsxlogicalswitchport string `json:"nsxlogicalswitchport"`
+		Secondaryip          []struct {
+			Id        string `json:"id"`
+			Ipaddress string `json:"ipaddress"`
+		} `json:"secondaryip"`
+		Traffictype      string `json:"traffictype"`
+		Type             string `json:"type"`
+		Virtualmachineid string `json:"virtualmachineid"`
+	} `json:"nic"`
+	Ostypeid        int64  `json:"ostypeid"`
+	Password        string `json:"password"`
+	Passwordenabled bool   `json:"passwordenabled"`
+	Project         string `json:"project"`
+	Projectid       string `json:"projectid"`
+	Publicip        string `json:"publicip"`
+	Publicipid      string `json:"publicipid"`
+	Rootdeviceid    int64  `json:"rootdeviceid"`
+	Rootdevicetype  string `json:"rootdevicetype"`
+	Securitygroup   []struct {
+		Account     string `json:"account"`
+		Description string `json:"description"`
+		Domain      string `json:"domain"`
+		Domainid    string `json:"domainid"`
+		Egressrule  []struct {
+			Account           string `json:"account"`
+			Cidr              string `json:"cidr"`
+			Endport           int    `json:"endport"`
+			Icmpcode          int    `json:"icmpcode"`
+			Icmptype          int    `json:"icmptype"`
+			Protocol          string `json:"protocol"`
+			Ruleid            string `json:"ruleid"`
+			Securitygroupname string `json:"securitygroupname"`
+			Startport         int    `json:"startport"`
+			Tags              []struct {
+				Account      string `json:"account"`
+				Customer     string `json:"customer"`
+				Domain       string `json:"domain"`
+				Domainid     string `json:"domainid"`
+				Key          string `json:"key"`
+				Project      string `json:"project"`
+				Projectid    string `json:"projectid"`
+				Resourceid   string `json:"resourceid"`
+				Resourcetype string `json:"resourcetype"`
+				Value        string `json:"value"`
+			} `json:"tags"`
+		} `json:"egressrule"`
+		Id          string `json:"id"`
+		Ingressrule []struct {
+			Account           string `json:"account"`
+			Cidr              string `json:"cidr"`
+			Endport           int    `json:"endport"`
+			Icmpcode          int    `json:"icmpcode"`
+			Icmptype          int    `json:"icmptype"`
+			Protocol          string `json:"protocol"`
+			Ruleid            string `json:"ruleid"`
+			Securitygroupname string `json:"securitygroupname"`
+			Startport         int    `json:"startport"`
+			Tags              []struct {
+				Account      string `json:"account"`
+				Customer     string `json:"customer"`
+				Domain       string `json:"domain"`
+				Domainid     string `json:"domainid"`
+				Key          string `json:"key"`
+				Project      string `json:"project"`
+				Projectid    string `json:"projectid"`
+				Resourceid   string `json:"resourceid"`
+				Resourcetype string `json:"resourcetype"`
+				Value        string `json:"value"`
+			} `json:"tags"`
+		} `json:"ingressrule"`
+		Name      string `json:"name"`
+		Project   string `json:"project"`
+		Projectid string `json:"projectid"`
+		Tags      []struct {
+			Account      string `json:"account"`
+			Customer     string `json:"customer"`
+			Domain       string `json:"domain"`
+			Domainid     string `json:"domainid"`
+			Key          string `json:"key"`
+			Project      string `json:"project"`
+			Projectid    string `json:"projectid"`
+			Resourceid   string `json:"resourceid"`
+			Resourcetype string `json:"resourcetype"`
+			Value        string `json:"value"`
+		} `json:"tags"`
+		Virtualmachinecount int           `json:"virtualmachinecount"`
+		Virtualmachineids   []interface{} `json:"virtualmachineids"`
+	} `json:"securitygroup"`
+	Serviceofferingid   string `json:"serviceofferingid"`
+	Serviceofferingname string `json:"serviceofferingname"`
+	Servicestate        string `json:"servicestate"`
+	State               string `json:"state"`
+	Templatedisplaytext string `json:"templatedisplaytext"`
+	Templateid          string `json:"templateid"`
+	Templatename        string `json:"templatename"`
+	Userid              string `json:"userid"`
+	Username            string `json:"username"`
+	Vgpu                string `json:"vgpu"`
+	Zoneid              string `json:"zoneid"`
+	Zonename            string `json:"zonename"`
+}
+
+type MigrateVirtualMachineParams struct {
+	p map[string]interface{}
+}
+
+func (p *MigrateVirtualMachineParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["hostid"]; found {
+		u.Set("hostid", v.(string))
+	}
+	if v, found := p.p["storageid"]; found {
+		u.Set("storageid", v.(string))
+	}
+	if v, found := p.p["virtualmachineid"]; found {
+		u.Set("virtualmachineid", v.(string))
+	}
+	return u
+}
+
+func (p *MigrateVirtualMachineParams) SetHostid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["hostid"] = v
+	return
+}
+
+func (p *MigrateVirtualMachineParams) SetStorageid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["storageid"] = v
+	return
+}
+
+func (p *MigrateVirtualMachineParams) SetVirtualmachineid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["virtualmachineid"] = v
+	return
+}
+
+// You should always use this function to get a new MigrateVirtualMachineParams instance,
+// as then you are sure you have configured all required params
+func (s *VirtualMachineService) NewMigrateVirtualMachineParams(virtualmachineid string) *MigrateVirtualMachineParams {
+	p := &MigrateVirtualMachineParams{}
+	p.p = make(map[string]interface{})
+	p.p["virtualmachineid"] = virtualmachineid
+	return p
+}
+
+// Attempts Migration of a VM to a different host or Root volume of the vm to a different storage pool
+func (s *VirtualMachineService) MigrateVirtualMachine(p *MigrateVirtualMachineParams) (*MigrateVirtualMachineResponse, error) {
+	resp, err := s.cs.newRequest("migrateVirtualMachine", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r MigrateVirtualMachineResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type MigrateVirtualMachineResponse struct {
+	JobID         string `json:"jobid"`
+	Account       string `json:"account"`
+	Affinitygroup []struct {
+		Account           string   `json:"account"`
+		Description       string   `json:"description"`
+		Domain            string   `json:"domain"`
+		Domainid          string   `json:"domainid"`
+		Id                string   `json:"id"`
+		Name              string   `json:"name"`
+		Project           string   `json:"project"`
+		Projectid         string   `json:"projectid"`
+		Type              string   `json:"type"`
+		VirtualmachineIds []string `json:"virtualmachineIds"`
+	} `json:"affinitygroup"`
+	Cpunumber             int               `json:"cpunumber"`
+	Cpuspeed              int               `json:"cpuspeed"`
+	Cpuused               string            `json:"cpuused"`
+	Created               string            `json:"created"`
+	Details               map[string]string `json:"details"`
+	Diskioread            int64             `json:"diskioread"`
+	Diskiowrite           int64             `json:"diskiowrite"`
+	Diskkbsread           int64             `json:"diskkbsread"`
+	Diskkbswrite          int64             `json:"diskkbswrite"`
+	Diskofferingid        string            `json:"diskofferingid"`
+	Diskofferingname      string            `json:"diskofferingname"`
+	Displayname           string            `json:"displayname"`
+	Displayvm             bool              `json:"displayvm"`
+	Domain                string            `json:"domain"`
+	Domainid              string            `json:"domainid"`
+	Forvirtualnetwork     bool              `json:"forvirtualnetwork"`
+	Group                 string            `json:"group"`
+	Groupid               string            `json:"groupid"`
+	Guestosid             string            `json:"guestosid"`
+	Haenable              bool              `json:"haenable"`
+	Hostid                string            `json:"hostid"`
+	Hostname              string            `json:"hostname"`
+	Hypervisor            string            `json:"hypervisor"`
+	Id                    string            `json:"id"`
+	Instancename          string            `json:"instancename"`
+	Isdynamicallyscalable bool              `json:"isdynamicallyscalable"`
+	Isodisplaytext        string            `json:"isodisplaytext"`
+	Isoid                 string            `json:"isoid"`
+	Isoname               string            `json:"isoname"`
+	Keypair               string            `json:"keypair"`
+	Memory                int               `json:"memory"`
+	Memoryintfreekbs      int64             `json:"memoryintfreekbs"`
+	Memorykbs             int64             `json:"memorykbs"`
+	Memorytargetkbs       int64             `json:"memorytargetkbs"`
+	Name                  string            `json:"name"`
+	Networkkbsread        int64             `json:"networkkbsread"`
+	Networkkbswrite       int64             `json:"networkkbswrite"`
+	Nic                   []struct {
+		Broadcasturi         string `json:"broadcasturi"`
+		Deviceid             string `json:"deviceid"`
+		Gateway              string `json:"gateway"`
+		Id                   string `json:"id"`
+		Ip6address           string `json:"ip6address"`
+		Ip6cidr              string `json:"ip6cidr"`
+		Ip6gateway           string `json:"ip6gateway"`
+		Ipaddress            string `json:"ipaddress"`
+		Isdefault            bool   `json:"isdefault"`
+		Isolationuri         string `json:"isolationuri"`
+		Macaddress           string `json:"macaddress"`
+		Netmask              string `json:"netmask"`
+		Networkid            string `json:"networkid"`
+		Networkname          string `json:"networkname"`
+		Nsxlogicalswitch     string `json:"nsxlogicalswitch"`
+		Nsxlogicalswitchport string `json:"nsxlogicalswitchport"`
+		Secondaryip          []struct {
+			Id        string `json:"id"`
+			Ipaddress string `json:"ipaddress"`
+		} `json:"secondaryip"`
+		Traffictype      string `json:"traffictype"`
+		Type             string `json:"type"`
+		Virtualmachineid string `json:"virtualmachineid"`
+	} `json:"nic"`
+	Ostypeid        int64  `json:"ostypeid"`
+	Password        string `json:"password"`
+	Passwordenabled bool   `json:"passwordenabled"`
+	Project         string `json:"project"`
+	Projectid       string `json:"projectid"`
+	Publicip        string `json:"publicip"`
+	Publicipid      string `json:"publicipid"`
+	Rootdeviceid    int64  `json:"rootdeviceid"`
+	Rootdevicetype  string `json:"rootdevicetype"`
+	Securitygroup   []struct {
+		Account     string `json:"account"`
+		Description string `json:"description"`
+		Domain      string `json:"domain"`
+		Domainid    string `json:"domainid"`
+		Egressrule  []struct {
+			Account           string `json:"account"`
+			Cidr              string `json:"cidr"`
+			Endport           int    `json:"endport"`
+			Icmpcode          int    `json:"icmpcode"`
+			Icmptype          int    `json:"icmptype"`
+			Protocol          string `json:"protocol"`
+			Ruleid            string `json:"ruleid"`
+			Securitygroupname string `json:"securitygroupname"`
+			Startport         int    `json:"startport"`
+			Tags              []struct {
+				Account      string `json:"account"`
+				Customer     string `json:"customer"`
+				Domain       string `json:"domain"`
+				Domainid     string `json:"domainid"`
+				Key          string `json:"key"`
+				Project      string `json:"project"`
+				Projectid    string `json:"projectid"`
+				Resourceid   string `json:"resourceid"`
+				Resourcetype string `json:"resourcetype"`
+				Value        string `json:"value"`
+			} `json:"tags"`
+		} `json:"egressrule"`
+		Id          string `json:"id"`
+		Ingressrule []struct {
+			Account           string `json:"account"`
+			Cidr              string `json:"cidr"`
+			Endport           int    `json:"endport"`
+			Icmpcode          int    `json:"icmpcode"`
+			Icmptype          int    `json:"icmptype"`
+			Protocol          string `json:"protocol"`
+			Ruleid            string `json:"ruleid"`
+			Securitygroupname string `json:"securitygroupname"`
+			Startport         int    `json:"startport"`
+			Tags              []struct {
+				Account      string `json:"account"`
+				Customer     string `json:"customer"`
+				Domain       string `json:"domain"`
+				Domainid     string `json:"domainid"`
+				Key          string `json:"key"`
+				Project      string `json:"project"`
+				Projectid    string `json:"projectid"`
+				Resourceid   string `json:"resourceid"`
+				Resourcetype string `json:"resourcetype"`
+				Value        string `json:"value"`
+			} `json:"tags"`
+		} `json:"ingressrule"`
+		Name      string `json:"name"`
+		Project   string `json:"project"`
+		Projectid string `json:"projectid"`
+		Tags      []struct {
+			Account      string `json:"account"`
+			Customer     string `json:"customer"`
+			Domain       string `json:"domain"`
+			Domainid     string `json:"domainid"`
+			Key          string `json:"key"`
+			Project      string `json:"project"`
+			Projectid    string `json:"projectid"`
+			Resourceid   string `json:"resourceid"`
+			Resourcetype string `json:"resourcetype"`
+			Value        string `json:"value"`
+		} `json:"tags"`
+		Virtualmachinecount int           `json:"virtualmachinecount"`
+		Virtualmachineids   []interface{} `json:"virtualmachineids"`
+	} `json:"securitygroup"`
+	Serviceofferingid   string `json:"serviceofferingid"`
+	Serviceofferingname string `json:"serviceofferingname"`
+	Servicestate        string `json:"servicestate"`
+	State               string `json:"state"`
+	Templatedisplaytext string `json:"templatedisplaytext"`
+	Templateid          string `json:"templateid"`
+	Templatename        string `json:"templatename"`
+	Userid              string `json:"userid"`
+	Username            string `json:"username"`
+	Vgpu                string `json:"vgpu"`
+	Zoneid              string `json:"zoneid"`
+	Zonename            string `json:"zonename"`
+}
+
+type MigrateVirtualMachineWithVolumeParams struct {
+	p map[string]interface{}
+}
+
+func (p *MigrateVirtualMachineWithVolumeParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["hostid"]; found {
+		u.Set("hostid", v.(string))
+	}
+	if v, found := p.p["migrateto"]; found {
+		i := 0
+		for k, vv := range v.(map[string]string) {
+			u.Set(fmt.Sprintf("migrateto[%d].key", i), k)
+			u.Set(fmt.Sprintf("migrateto[%d].value", i), vv)
+			i++
+		}
+	}
+	if v, found := p.p["virtualmachineid"]; found {
+		u.Set("virtualmachineid", v.(string))
+	}
+	return u
+}
+
+func (p *MigrateVirtualMachineWithVolumeParams) SetHostid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["hostid"] = v
+	return
+}
+
+func (p *MigrateVirtualMachineWithVolumeParams) SetMigrateto(v map[string]string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["migrateto"] = v
+	return
+}
+
+func (p *MigrateVirtualMachineWithVolumeParams) SetVirtualmachineid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["virtualmachineid"] = v
+	return
+}
+
+// You should always use this function to get a new MigrateVirtualMachineWithVolumeParams instance,
+// as then you are sure you have configured all required params
+func (s *VirtualMachineService) NewMigrateVirtualMachineWithVolumeParams(hostid string, virtualmachineid string) *MigrateVirtualMachineWithVolumeParams {
+	p := &MigrateVirtualMachineWithVolumeParams{}
+	p.p = make(map[string]interface{})
+	p.p["hostid"] = hostid
+	p.p["virtualmachineid"] = virtualmachineid
+	return p
+}
+
+// Attempts Migration of a VM with its volumes to a different host
+func (s *VirtualMachineService) MigrateVirtualMachineWithVolume(p *MigrateVirtualMachineWithVolumeParams) (*MigrateVirtualMachineWithVolumeResponse, error) {
+	resp, err := s.cs.newRequest("migrateVirtualMachineWithVolume", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r MigrateVirtualMachineWithVolumeResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type MigrateVirtualMachineWithVolumeResponse struct {
+	JobID         string `json:"jobid"`
+	Account       string `json:"account"`
+	Affinitygroup []struct {
+		Account           string   `json:"account"`
+		Description       string   `json:"description"`
+		Domain            string   `json:"domain"`
+		Domainid          string   `json:"domainid"`
+		Id                string   `json:"id"`
+		Name              string   `json:"name"`
+		Project           string   `json:"project"`
+		Projectid         string   `json:"projectid"`
+		Type              string   `json:"type"`
+		VirtualmachineIds []string `json:"virtualmachineIds"`
+	} `json:"affinitygroup"`
+	Cpunumber             int               `json:"cpunumber"`
+	Cpuspeed              int               `json:"cpuspeed"`
+	Cpuused               string            `json:"cpuused"`
+	Created               string            `json:"created"`
+	Details               map[string]string `json:"details"`
+	Diskioread            int64             `json:"diskioread"`
+	Diskiowrite           int64             `json:"diskiowrite"`
+	Diskkbsread           int64             `json:"diskkbsread"`
+	Diskkbswrite          int64             `json:"diskkbswrite"`
+	Diskofferingid        string            `json:"diskofferingid"`
+	Diskofferingname      string            `json:"diskofferingname"`
+	Displayname           string            `json:"displayname"`
+	Displayvm             bool              `json:"displayvm"`
+	Domain                string            `json:"domain"`
+	Domainid              string            `json:"domainid"`
+	Forvirtualnetwork     bool              `json:"forvirtualnetwork"`
+	Group                 string            `json:"group"`
+	Groupid               string            `json:"groupid"`
+	Guestosid             string            `json:"guestosid"`
+	Haenable              bool              `json:"haenable"`
+	Hostid                string            `json:"hostid"`
+	Hostname              string            `json:"hostname"`
+	Hypervisor            string            `json:"hypervisor"`
+	Id                    string            `json:"id"`
+	Instancename          string            `json:"instancename"`
+	Isdynamicallyscalable bool              `json:"isdynamicallyscalable"`
+	Isodisplaytext        string            `json:"isodisplaytext"`
+	Isoid                 string            `json:"isoid"`
+	Isoname               string            `json:"isoname"`
+	Keypair               string            `json:"keypair"`
+	Memory                int               `json:"memory"`
+	Memoryintfreekbs      int64             `json:"memoryintfreekbs"`
+	Memorykbs             int64             `json:"memorykbs"`
+	Memorytargetkbs       int64             `json:"memorytargetkbs"`
+	Name                  string            `json:"name"`
+	Networkkbsread        int64             `json:"networkkbsread"`
+	Networkkbswrite       int64             `json:"networkkbswrite"`
+	Nic                   []struct {
+		Broadcasturi         string `json:"broadcasturi"`
+		Deviceid             string `json:"deviceid"`
+		Gateway              string `json:"gateway"`
+		Id                   string `json:"id"`
+		Ip6address           string `json:"ip6address"`
+		Ip6cidr              string `json:"ip6cidr"`
+		Ip6gateway           string `json:"ip6gateway"`
+		Ipaddress            string `json:"ipaddress"`
+		Isdefault            bool   `json:"isdefault"`
+		Isolationuri         string `json:"isolationuri"`
+		Macaddress           string `json:"macaddress"`
+		Netmask              string `json:"netmask"`
+		Networkid            string `json:"networkid"`
+		Networkname          string `json:"networkname"`
+		Nsxlogicalswitch     string `json:"nsxlogicalswitch"`
+		Nsxlogicalswitchport string `json:"nsxlogicalswitchport"`
+		Secondaryip          []struct {
+			Id        string `json:"id"`
+			Ipaddress string `json:"ipaddress"`
+		} `json:"secondaryip"`
+		Traffictype      string `json:"traffictype"`
+		Type             string `json:"type"`
+		Virtualmachineid string `json:"virtualmachineid"`
+	} `json:"nic"`
+	Ostypeid        int64  `json:"ostypeid"`
+	Password        string `json:"password"`
+	Passwordenabled bool   `json:"passwordenabled"`
+	Project         string `json:"project"`
+	Projectid       string `json:"projectid"`
+	Publicip        string `json:"publicip"`
+	Publicipid      string `json:"publicipid"`
+	Rootdeviceid    int64  `json:"rootdeviceid"`
+	Rootdevicetype  string `json:"rootdevicetype"`
+	Securitygroup   []struct {
+		Account     string `json:"account"`
+		Description string `json:"description"`
+		Domain      string `json:"domain"`
+		Domainid    string `json:"domainid"`
+		Egressrule  []struct {
+			Account           string `json:"account"`
+			Cidr              string `json:"cidr"`
+			Endport           int    `json:"endport"`
+			Icmpcode          int    `json:"icmpcode"`
+			Icmptype          int    `json:"icmptype"`
+			Protocol          string `json:"protocol"`
+			Ruleid            string `json:"ruleid"`
+			Securitygroupname string `json:"securitygroupname"`
+			Startport         int    `json:"startport"`
+			Tags              []struct {
+				Account      string `json:"account"`
+				Customer     string `json:"customer"`
+				Domain       string `json:"domain"`
+				Domainid     string `json:"domainid"`
+				Key          string `json:"key"`
+				Project      string `json:"project"`
+				Projectid    string `json:"projectid"`
+				Resourceid   string `json:"resourceid"`
+				Resourcetype string `json:"resourcetype"`
+				Value        string `json:"value"`
+			} `json:"tags"`
+		} `json:"egressrule"`
+		Id          string `json:"id"`
+		Ingressrule []struct {
+			Account           string `json:"account"`
+			Cidr              string `json:"cidr"`
+			Endport           int    `json:"endport"`
+			Icmpcode          int    `json:"icmpcode"`
+			Icmptype          int    `json:"icmptype"`
+			Protocol          string `json:"protocol"`
+			Ruleid            string `json:"ruleid"`
+			Securitygroupname string `json:"securitygroupname"`
+			Startport         int    `json:"startport"`
+			Tags              []struct {
+				Account      string `json:"account"`
+				Customer     string `json:"customer"`
+				Domain       string `json:"domain"`
+				Domainid     string `json:"domainid"`
+				Key          string `json:"key"`
+				Project      string `json:"project"`
+				Projectid    string `json:"projectid"`
+				Resourceid   string `json:"resourceid"`
+				Resourcetype string `json:"resourcetype"`
+				Value        string `json:"value"`
+			} `json:"tags"`
+		} `json:"ingressrule"`
+		Name      string `json:"name"`
+		Project   string `json:"project"`
+		Projectid string `json:"projectid"`
+		Tags      []struct {
+			Account      string `json:"account"`
+			Customer     string `json:"customer"`
+			Domain       string `json:"domain"`
+			Domainid     string `json:"domainid"`
+			Key          string `json:"key"`
+			Project      string `json:"project"`
+			Projectid    string `json:"projectid"`
+			Resourceid   string `json:"resourceid"`
+			Resourcetype string `json:"resourcetype"`
+			Value        string `json:"value"`
+		} `json:"tags"`
+		Virtualmachinecount int           `json:"virtualmachinecount"`
+		Virtualmachineids   []interface{} `json:"virtualmachineids"`
+	} `json:"securitygroup"`
+	Serviceofferingid   string `json:"serviceofferingid"`
+	Serviceofferingname string `json:"serviceofferingname"`
+	Servicestate        string `json:"servicestate"`
+	State               string `json:"state"`
+	Templatedisplaytext string `json:"templatedisplaytext"`
+	Templateid          string `json:"templateid"`
+	Templatename        string `json:"templatename"`
+	Userid              string `json:"userid"`
+	Username            string `json:"username"`
+	Vgpu                string `json:"vgpu"`
+	Zoneid              string `json:"zoneid"`
+	Zonename            string `json:"zonename"`
+}
+
+type RebootVirtualMachineParams struct {
+	p map[string]interface{}
+}
+
+func (p *RebootVirtualMachineParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *RebootVirtualMachineParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new RebootVirtualMachineParams instance,
+// as then you are sure you have configured all required params
+func (s *VirtualMachineService) NewRebootVirtualMachineParams(id string) *RebootVirtualMachineParams {
+	p := &RebootVirtualMachineParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Reboots a virtual machine.
+func (s *VirtualMachineService) RebootVirtualMachine(p *RebootVirtualMachineParams) (*RebootVirtualMachineResponse, error) {
+	resp, err := s.cs.newRequest("rebootVirtualMachine", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r RebootVirtualMachineResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type RebootVirtualMachineResponse struct {
+	JobID         string `json:"jobid"`
+	Account       string `json:"account"`
+	Affinitygroup []struct {
+		Account           string   `json:"account"`
+		Description       string   `json:"description"`
+		Domain            string   `json:"domain"`
+		Domainid          string   `json:"domainid"`
+		Id                string   `json:"id"`
+		Name              string   `json:"name"`
+		Project           string   `json:"project"`
+		Projectid         string   `json:"projectid"`
+		Type              string   `json:"type"`
+		VirtualmachineIds []string `json:"virtualmachineIds"`
+	} `json:"affinitygroup"`
+	Cpunumber             int               `json:"cpunumber"`
+	Cpuspeed              int               `json:"cpuspeed"`
+	Cpuused               string            `json:"cpuused"`
+	Created               string            `json:"created"`
+	Details               map[string]string `json:"details"`
+	Diskioread            int64             `json:"diskioread"`
+	Diskiowrite           int64             `json:"diskiowrite"`
+	Diskkbsread           int64             `json:"diskkbsread"`
+	Diskkbswrite          int64             `json:"diskkbswrite"`
+	Diskofferingid        string            `json:"diskofferingid"`
+	Diskofferingname      string            `json:"diskofferingname"`
+	Displayname           string            `json:"displayname"`
+	Displayvm             bool              `json:"displayvm"`
+	Domain                string            `json:"domain"`
+	Domainid              string            `json:"domainid"`
+	Forvirtualnetwork     bool              `json:"forvirtualnetwork"`
+	Group                 string            `json:"group"`
+	Groupid               string            `json:"groupid"`
+	Guestosid             string            `json:"guestosid"`
+	Haenable              bool              `json:"haenable"`
+	Hostid                string            `json:"hostid"`
+	Hostname              string            `json:"hostname"`
+	Hypervisor            string            `json:"hypervisor"`
+	Id                    string            `json:"id"`
+	Instancename          string            `json:"instancename"`
+	Isdynamicallyscalable bool              `json:"isdynamicallyscalable"`
+	Isodisplaytext        string            `json:"isodisplaytext"`
+	Isoid                 string            `json:"isoid"`
+	Isoname               string            `json:"isoname"`
+	Keypair               string            `json:"keypair"`
+	Memory                int               `json:"memory"`
+	Memoryintfreekbs      int64             `json:"memoryintfreekbs"`
+	Memorykbs             int64             `json:"memorykbs"`
+	Memorytargetkbs       int64             `json:"memorytargetkbs"`
+	Name                  string            `json:"name"`
+	Networkkbsread        int64             `json:"networkkbsread"`
+	Networkkbswrite       int64             `json:"networkkbswrite"`
+	Nic                   []struct {
+		Broadcasturi         string `json:"broadcasturi"`
+		Deviceid             string `json:"deviceid"`
+		Gateway              string `json:"gateway"`
+		Id                   string `json:"id"`
+		Ip6address           string `json:"ip6address"`
+		Ip6cidr              string `json:"ip6cidr"`
+		Ip6gateway           string `json:"ip6gateway"`
+		Ipaddress            string `json:"ipaddress"`
+		Isdefault            bool   `json:"isdefault"`
+		Isolationuri         string `json:"isolationuri"`
+		Macaddress           string `json:"macaddress"`
+		Netmask              string `json:"netmask"`
+		Networkid            string `json:"networkid"`
+		Networkname          string `json:"networkname"`
+		Nsxlogicalswitch     string `json:"nsxlogicalswitch"`
+		Nsxlogicalswitchport string `json:"nsxlogicalswitchport"`
+		Secondaryip          []struct {
+			Id        string `json:"id"`
+			Ipaddress string `json:"ipaddress"`
+		} `json:"secondaryip"`
+		Traffictype      string `json:"traffictype"`
+		Type             string `json:"type"`
+		Virtualmachineid string `json:"virtualmachineid"`
+	} `json:"nic"`
+	Ostypeid        int64  `json:"ostypeid"`
+	Password        string `json:"password"`
+	Passwordenabled bool   `json:"passwordenabled"`
+	Project         string `json:"project"`
+	Projectid       string `json:"projectid"`
+	Publicip        string `json:"publicip"`
+	Publicipid      string `json:"publicipid"`
+	Rootdeviceid    int64  `json:"rootdeviceid"`
+	Rootdevicetype  string `json:"rootdevicetype"`
+	Securitygroup   []struct {
+		Account     string `json:"account"`
+		Description string `json:"description"`
+		Domain      string `json:"domain"`
+		Domainid    string `json:"domainid"`
+		Egressrule  []struct {
+			Account           string `json:"account"`
+			Cidr              string `json:"cidr"`
+			Endport           int    `json:"endport"`
+			Icmpcode          int    `json:"icmpcode"`
+			Icmptype          int    `json:"icmptype"`
+			Protocol          string `json:"protocol"`
+			Ruleid            string `json:"ruleid"`
+			Securitygroupname string `json:"securitygroupname"`
+			Startport         int    `json:"startport"`
+			Tags              []struct {
+				Account      string `json:"account"`
+				Customer     string `json:"customer"`
+				Domain       string `json:"domain"`
+				Domainid     string `json:"domainid"`
+				Key          string `json:"key"`
+				Project      string `json:"project"`
+				Projectid    string `json:"projectid"`
+				Resourceid   string `json:"resourceid"`
+				Resourcetype string `json:"resourcetype"`
+				Value        string `json:"value"`
+			} `json:"tags"`
+		} `json:"egressrule"`
+		Id          string `json:"id"`
+		Ingressrule []struct {
+			Account           string `json:"account"`
+			Cidr              string `json:"cidr"`
+			Endport           int    `json:"endport"`
+			Icmpcode          int    `json:"icmpcode"`
+			Icmptype          int    `json:"icmptype"`
+			Protocol          string `json:"protocol"`
+			Ruleid            string `json:"ruleid"`
+			Securitygroupname string `json:"securitygroupname"`
+			Startport         int    `json:"startport"`
+			Tags              []struct {
+				Account      string `json:"account"`
+				Customer     string `json:"customer"`
+				Domain       string `json:"domain"`
+				Domainid     string `json:"domainid"`
+				Key          string `json:"key"`
+				Project      string `json:"project"`
+				Projectid    string `json:"projectid"`
+				Resourceid   string `json:"resourceid"`
+				Resourcetype string `json:"resourcetype"`
+				Value        string `json:"value"`
+			} `json:"tags"`
+		} `json:"ingressrule"`
+		Name      string `json:"name"`
+		Project   string `json:"project"`
+		Projectid string `json:"projectid"`
+		Tags      []struct {
+			Account      string `json:"account"`
+			Customer     string `json:"customer"`
+			Domain       string `json:"domain"`
+			Domainid     string `json:"domainid"`
+			Key          string `json:"key"`
+			Project      string `json:"project"`
+			Projectid    string `json:"projectid"`
+			Resourceid   string `json:"resourceid"`
+			Resourcetype string `json:"resourcetype"`
+			Value        string `json:"value"`
+		} `json:"tags"`
+		Virtualmachinecount int           `json:"virtualmachinecount"`
+		Virtualmachineids   []interface{} `json:"virtualmachineids"`
+	} `json:"securitygroup"`
+	Serviceofferingid   string `json:"serviceofferingid"`
+	Serviceofferingname string `json:"serviceofferingname"`
+	Servicestate        string `json:"servicestate"`
+	State               string `json:"state"`
+	Templatedisplaytext string `json:"templatedisplaytext"`
+	Templateid          string `json:"templateid"`
+	Templatename        string `json:"templatename"`
+	Userid              string `json:"userid"`
+	Username            string `json:"username"`
+	Vgpu                string `json:"vgpu"`
+	Zoneid              string `json:"zoneid"`
+	Zonename            string `json:"zonename"`
+}
+
+type RecoverVirtualMachineParams struct {
+	p map[string]interface{}
+}
+
+func (p *RecoverVirtualMachineParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *RecoverVirtualMachineParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new RecoverVirtualMachineParams instance,
+// as then you are sure you have configured all required params
+func (s *VirtualMachineService) NewRecoverVirtualMachineParams(id string) *RecoverVirtualMachineParams {
+	p := &RecoverVirtualMachineParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Recovers a virtual machine.
+func (s *VirtualMachineService) RecoverVirtualMachine(p *RecoverVirtualMachineParams) (*RecoverVirtualMachineResponse, error) {
+	resp, err := s.cs.newRequest("recoverVirtualMachine", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r RecoverVirtualMachineResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type RecoverVirtualMachineResponse struct {
+	Account       string `json:"account"`
+	Affinitygroup []struct {
+		Account           string   `json:"account"`
+		Description       string   `json:"description"`
+		Domain            string   `json:"domain"`
+		Domainid          string   `json:"domainid"`
+		Id                string   `json:"id"`
+		Name              string   `json:"name"`
+		Project           string   `json:"project"`
+		Projectid         string   `json:"projectid"`
+		Type              string   `json:"type"`
+		VirtualmachineIds []string `json:"virtualmachineIds"`
+	} `json:"affinitygroup"`
+	Cpunumber             int               `json:"cpunumber"`
+	Cpuspeed              int               `json:"cpuspeed"`
+	Cpuused               string            `json:"cpuused"`
+	Created               string            `json:"created"`
+	Details               map[string]string `json:"details"`
+	Diskioread            int64             `json:"diskioread"`
+	Diskiowrite           int64             `json:"diskiowrite"`
+	Diskkbsread           int64             `json:"diskkbsread"`
+	Diskkbswrite          int64             `json:"diskkbswrite"`
+	Diskofferingid        string            `json:"diskofferingid"`
+	Diskofferingname      string            `json:"diskofferingname"`
+	Displayname           string            `json:"displayname"`
+	Displayvm             bool              `json:"displayvm"`
+	Domain                string            `json:"domain"`
+	Domainid              string            `json:"domainid"`
+	Forvirtualnetwork     bool              `json:"forvirtualnetwork"`
+	Group                 string            `json:"group"`
+	Groupid               string            `json:"groupid"`
+	Guestosid             string            `json:"guestosid"`
+	Haenable              bool              `json:"haenable"`
+	Hostid                string            `json:"hostid"`
+	Hostname              string            `json:"hostname"`
+	Hypervisor            string            `json:"hypervisor"`
+	Id                    string            `json:"id"`
+	Instancename          string            `json:"instancename"`
+	Isdynamicallyscalable bool              `json:"isdynamicallyscalable"`
+	Isodisplaytext        string            `json:"isodisplaytext"`
+	Isoid                 string            `json:"isoid"`
+	Isoname               string            `json:"isoname"`
+	Keypair               string            `json:"keypair"`
+	Memory                int               `json:"memory"`
+	Memoryintfreekbs      int64             `json:"memoryintfreekbs"`
+	Memorykbs             int64             `json:"memorykbs"`
+	Memorytargetkbs       int64             `json:"memorytargetkbs"`
+	Name                  string            `json:"name"`
+	Networkkbsread        int64             `json:"networkkbsread"`
+	Networkkbswrite       int64             `json:"networkkbswrite"`
+	Nic                   []struct {
+		Broadcasturi         string `json:"broadcasturi"`
+		Deviceid             string `json:"deviceid"`
+		Gateway              string `json:"gateway"`
+		Id                   string `json:"id"`
+		Ip6address           string `json:"ip6address"`
+		Ip6cidr              string `json:"ip6cidr"`
+		Ip6gateway           string `json:"ip6gateway"`
+		Ipaddress            string `json:"ipaddress"`
+		Isdefault            bool   `json:"isdefault"`
+		Isolationuri         string `json:"isolationuri"`
+		Macaddress           string `json:"macaddress"`
+		Netmask              string `json:"netmask"`
+		Networkid            string `json:"networkid"`
+		Networkname          string `json:"networkname"`
+		Nsxlogicalswitch     string `json:"nsxlogicalswitch"`
+		Nsxlogicalswitchport string `json:"nsxlogicalswitchport"`
+		Secondaryip          []struct {
+			Id        string `json:"id"`
+			Ipaddress string `json:"ipaddress"`
+		} `json:"secondaryip"`
+		Traffictype      string `json:"traffictype"`
+		Type             string `json:"type"`
+		Virtualmachineid string `json:"virtualmachineid"`
+	} `json:"nic"`
+	Ostypeid        int64  `json:"ostypeid"`
+	Password        string `json:"password"`
+	Passwordenabled bool   `json:"passwordenabled"`
+	Project         string `json:"project"`
+	Projectid       string `json:"projectid"`
+	Publicip        string `json:"publicip"`
+	Publicipid      string `json:"publicipid"`
+	Rootdeviceid    int64  `json:"rootdeviceid"`
+	Rootdevicetype  string `json:"rootdevicetype"`
+	Securitygroup   []struct {
+		Account     string `json:"account"`
+		Description string `json:"description"`
+		Domain      string `json:"domain"`
+		Domainid    string `json:"domainid"`
+		Egressrule  []struct {
+			Account           string `json:"account"`
+			Cidr              string `json:"cidr"`
+			Endport           int    `json:"endport"`
+			Icmpcode          int    `json:"icmpcode"`
+			Icmptype          int    `json:"icmptype"`
+			Protocol          string `json:"protocol"`
+			Ruleid            string `json:"ruleid"`
+			Securitygroupname string `json:"securitygroupname"`
+			Startport         int    `json:"startport"`
+			Tags              []struct {
+				Account      string `json:"account"`
+				Customer     string `json:"customer"`
+				Domain       string `json:"domain"`
+				Domainid     string `json:"domainid"`
+				Key          string `json:"key"`
+				Project      string `json:"project"`
+				Projectid    string `json:"projectid"`
+				Resourceid   string `json:"resourceid"`
+				Resourcetype string `json:"resourcetype"`
+				Value        string `json:"value"`
+			} `json:"tags"`
+		} `json:"egressrule"`
+		Id          string `json:"id"`
+		Ingressrule []struct {
+			Account           string `json:"account"`
+			Cidr              string `json:"cidr"`
+			Endport           int    `json:"endport"`
+			Icmpcode          int    `json:"icmpcode"`
+			Icmptype          int    `json:"icmptype"`
+			Protocol          string `json:"protocol"`
+			Ruleid            string `json:"ruleid"`
+			Securitygroupname string `json:"securitygroupname"`
+			Startport         int    `json:"startport"`
+			Tags              []struct {
+				Account      string `json:"account"`
+				Customer     string `json:"customer"`
+				Domain       string `json:"domain"`
+				Domainid     string `json:"domainid"`
+				Key          string `json:"key"`
+				Project      string `json:"project"`
+				Projectid    string `json:"projectid"`
+				Resourceid   string `json:"resourceid"`
+				Resourcetype string `json:"resourcetype"`
+				Value        string `json:"value"`
+			} `json:"tags"`
+		} `json:"ingressrule"`
+		Name      string `json:"name"`
+		Project   string `json:"project"`
+		Projectid string `json:"projectid"`
+		Tags      []struct {
+			Account      string `json:"account"`
+			Customer     string `json:"customer"`
+			Domain       string `json:"domain"`
+			Domainid     string `json:"domainid"`
+			Key          string `json:"key"`
+			Project      string `json:"project"`
+			Projectid    string `json:"projectid"`
+			Resourceid   string `json:"resourceid"`
+			Resourcetype string `json:"resourcetype"`
+			Value        string `json:"value"`
+		} `json:"tags"`
+		Virtualmachinecount int           `json:"virtualmachinecount"`
+		Virtualmachineids   []interface{} `json:"virtualmachineids"`
+	} `json:"securitygroup"`
+	Serviceofferingid   string `json:"serviceofferingid"`
+	Serviceofferingname string `json:"serviceofferingname"`
+	Servicestate        string `json:"servicestate"`
+	State               string `json:"state"`
+	Templatedisplaytext string `json:"templatedisplaytext"`
+	Templateid          string `json:"templateid"`
+	Templatename        string `json:"templatename"`
+	Userid              string `json:"userid"`
+	Username            string `json:"username"`
+	Vgpu                string `json:"vgpu"`
+	Zoneid              string `json:"zoneid"`
+	Zonename            string `json:"zonename"`
+}
+
+type RemoveNicFromVirtualMachineParams struct {
+	p map[string]interface{}
+}
+
+func (p *RemoveNicFromVirtualMachineParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["nicid"]; found {
+		u.Set("nicid", v.(string))
+	}
+	if v, found := p.p["virtualmachineid"]; found {
+		u.Set("virtualmachineid", v.(string))
+	}
+	return u
+}
+
+func (p *RemoveNicFromVirtualMachineParams) SetNicid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["nicid"] = v
+	return
+}
+
+func (p *RemoveNicFromVirtualMachineParams) SetVirtualmachineid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["virtualmachineid"] = v
+	return
+}
+
+// You should always use this function to get a new RemoveNicFromVirtualMachineParams instance,
+// as then you are sure you have configured all required params
+func (s *VirtualMachineService) NewRemoveNicFromVirtualMachineParams(nicid string, virtualmachineid string) *RemoveNicFromVirtualMachineParams {
+	p := &RemoveNicFromVirtualMachineParams{}
+	p.p = make(map[string]interface{})
+	p.p["nicid"] = nicid
+	p.p["virtualmachineid"] = virtualmachineid
+	return p
+}
+
+// Removes VM from specified network by deleting a NIC
+func (s *VirtualMachineService) RemoveNicFromVirtualMachine(p *RemoveNicFromVirtualMachineParams) (*RemoveNicFromVirtualMachineResponse, error) {
+	resp, err := s.cs.newRequest("removeNicFromVirtualMachine", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r RemoveNicFromVirtualMachineResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type RemoveNicFromVirtualMachineResponse struct {
+	JobID         string `json:"jobid"`
+	Account       string `json:"account"`
+	Affinitygroup []struct {
+		Account           string   `json:"account"`
+		Description       string   `json:"description"`
+		Domain            string   `json:"domain"`
+		Domainid          string   `json:"domainid"`
+		Id                string   `json:"id"`
+		Name              string   `json:"name"`
+		Project           string   `json:"project"`
+		Projectid         string   `json:"projectid"`
+		Type              string   `json:"type"`
+		VirtualmachineIds []string `json:"virtualmachineIds"`
+	} `json:"affinitygroup"`
+	Cpunumber             int               `json:"cpunumber"`
+	Cpuspeed              int               `json:"cpuspeed"`
+	Cpuused               string            `json:"cpuused"`
+	Created               string            `json:"created"`
+	Details               map[string]string `json:"details"`
+	Diskioread            int64             `json:"diskioread"`
+	Diskiowrite           int64             `json:"diskiowrite"`
+	Diskkbsread           int64             `json:"diskkbsread"`
+	Diskkbswrite          int64             `json:"diskkbswrite"`
+	Diskofferingid        string            `json:"diskofferingid"`
+	Diskofferingname      string            `json:"diskofferingname"`
+	Displayname           string            `json:"displayname"`
+	Displayvm             bool              `json:"displayvm"`
+	Domain                string            `json:"domain"`
+	Domainid              string            `json:"domainid"`
+	Forvirtualnetwork     bool              `json:"forvirtualnetwork"`
+	Group                 string            `json:"group"`
+	Groupid               string            `json:"groupid"`
+	Guestosid             string            `json:"guestosid"`
+	Haenable              bool              `json:"haenable"`
+	Hostid                string            `json:"hostid"`
+	Hostname              string            `json:"hostname"`
+	Hypervisor            string            `json:"hypervisor"`
+	Id                    string            `json:"id"`
+	Instancename          string            `json:"instancename"`
+	Isdynamicallyscalable bool              `json:"isdynamicallyscalable"`
+	Isodisplaytext        string            `json:"isodisplaytext"`
+	Isoid                 string            `json:"isoid"`
+	Isoname               string            `json:"isoname"`
+	Keypair               string            `json:"keypair"`
+	Memory                int               `json:"memory"`
+	Memoryintfreekbs      int64             `json:"memoryintfreekbs"`
+	Memorykbs             int64             `json:"memorykbs"`
+	Memorytargetkbs       int64             `json:"memorytargetkbs"`
+	Name                  string            `json:"name"`
+	Networkkbsread        int64             `json:"networkkbsread"`
+	Networkkbswrite       int64             `json:"networkkbswrite"`
+	Nic                   []struct {
+		Broadcasturi         string `json:"broadcasturi"`
+		Deviceid             string `json:"deviceid"`
+		Gateway              string `json:"gateway"`
+		Id                   string `json:"id"`
+		Ip6address           string `json:"ip6address"`
+		Ip6cidr              string `json:"ip6cidr"`
+		Ip6gateway           string `json:"ip6gateway"`
+		Ipaddress            string `json:"ipaddress"`
+		Isdefault            bool   `json:"isdefault"`
+		Isolationuri         string `json:"isolationuri"`
+		Macaddress           string `json:"macaddress"`
+		Netmask              string `json:"netmask"`
+		Networkid            string `json:"networkid"`
+		Networkname          string `json:"networkname"`
+		Nsxlogicalswitch     string `json:"nsxlogicalswitch"`
+		Nsxlogicalswitchport string `json:"nsxlogicalswitchport"`
+		Secondaryip          []struct {
+			Id        string `json:"id"`
+			Ipaddress string `json:"ipaddress"`
+		} `json:"secondaryip"`
+		Traffictype      string `json:"traffictype"`
+		Type             string `json:"type"`
+		Virtualmachineid string `json:"virtualmachineid"`
+	} `json:"nic"`
+	Ostypeid        int64  `json:"ostypeid"`
+	Password        string `json:"password"`
+	Passwordenabled bool   `json:"passwordenabled"`
+	Project         string `json:"project"`
+	Projectid       string `json:"projectid"`
+	Publicip        string `json:"publicip"`
+	Publicipid      string `json:"publicipid"`
+	Rootdeviceid    int64  `json:"rootdeviceid"`
+	Rootdevicetype  string `json:"rootdevicetype"`
+	Securitygroup   []struct {
+		Account     string `json:"account"`
+		Description string `json:"description"`
+		Domain      string `json:"domain"`
+		Domainid    string `json:"domainid"`
+		Egressrule  []struct {
+			Account           string `json:"account"`
+			Cidr              string `json:"cidr"`
+			Endport           int    `json:"endport"`
+			Icmpcode          int    `json:"icmpcode"`
+			Icmptype          int    `json:"icmptype"`
+			Protocol          string `json:"protocol"`
+			Ruleid            string `json:"ruleid"`
+			Securitygroupname string `json:"securitygroupname"`
+			Startport         int    `json:"startport"`
+			Tags              []struct {
+				Account      string `json:"account"`
+				Customer     string `json:"customer"`
+				Domain       string `json:"domain"`
+				Domainid     string `json:"domainid"`
+				Key          string `json:"key"`
+				Project      string `json:"project"`
+				Projectid    string `json:"projectid"`
+				Resourceid   string `json:"resourceid"`
+				Resourcetype string `json:"resourcetype"`
+				Value        string `json:"value"`
+			} `json:"tags"`
+		} `json:"egressrule"`
+		Id          string `json:"id"`
+		Ingressrule []struct {
+			Account           string `json:"account"`
+			Cidr              string `json:"cidr"`
+			Endport           int    `json:"endport"`
+			Icmpcode          int    `json:"icmpcode"`
+			Icmptype          int    `json:"icmptype"`
+			Protocol          string `json:"protocol"`
+			Ruleid            string `json:"ruleid"`
+			Securitygroupname string `json:"securitygroupname"`
+			Startport         int    `json:"startport"`
+			Tags              []struct {
+				Account      string `json:"account"`
+				Customer     string `json:"customer"`
+				Domain       string `json:"domain"`
+				Domainid     string `json:"domainid"`
+				Key          string `json:"key"`
+				Project      string `json:"project"`
+				Projectid    string `json:"projectid"`
+				Resourceid   string `json:"resourceid"`
+				Resourcetype string `json:"resourcetype"`
+				Value        string `json:"value"`
+			} `json:"tags"`
+		} `json:"ingressrule"`
+		Name      string `json:"name"`
+		Project   string `json:"project"`
+		Projectid string `json:"projectid"`
+		Tags      []struct {
+			Account      string `json:"account"`
+			Customer     string `json:"customer"`
+			Domain       string `json:"domain"`
+			Domainid     string `json:"domainid"`
+			Key          string `json:"key"`
+			Project      string `json:"project"`
+			Projectid    string `json:"projectid"`
+			Resourceid   string `json:"resourceid"`
+			Resourcetype string `json:"resourcetype"`
+			Value        string `json:"value"`
+		} `json:"tags"`
+		Virtualmachinecount int           `json:"virtualmachinecount"`
+		Virtualmachineids   []interface{} `json:"virtualmachineids"`
+	} `json:"securitygroup"`
+	Serviceofferingid   string `json:"serviceofferingid"`
+	Serviceofferingname string `json:"serviceofferingname"`
+	Servicestate        string `json:"servicestate"`
+	State               string `json:"state"`
+	Templatedisplaytext string `json:"templatedisplaytext"`
+	Templateid          string `json:"templateid"`
+	Templatename        string `json:"templatename"`
+	Userid              string `json:"userid"`
+	Username            string `json:"username"`
+	Vgpu                string `json:"vgpu"`
+	Zoneid              string `json:"zoneid"`
+	Zonename            string `json:"zonename"`
+}
+
+type ResetPasswordForVirtualMachineParams struct {
+	p map[string]interface{}
+}
+
+func (p *ResetPasswordForVirtualMachineParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *ResetPasswordForVirtualMachineParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new ResetPasswordForVirtualMachineParams instance,
+// as then you are sure you have configured all required params
+func (s *VirtualMachineService) NewResetPasswordForVirtualMachineParams(id string) *ResetPasswordForVirtualMachineParams {
+	p := &ResetPasswordForVirtualMachineParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Resets the password for virtual machine. The virtual machine must be in a "Stopped" state and the template must already support this feature for this command to take effect. [async]
+func (s *VirtualMachineService) ResetPasswordForVirtualMachine(p *ResetPasswordForVirtualMachineParams) (*ResetPasswordForVirtualMachineResponse, error) {
+	resp, err := s.cs.newRequest("resetPasswordForVirtualMachine", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ResetPasswordForVirtualMachineResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type ResetPasswordForVirtualMachineResponse struct {
+	JobID         string `json:"jobid"`
+	Account       string `json:"account"`
+	Affinitygroup []struct {
+		Account           string   `json:"account"`
+		Description       string   `json:"description"`
+		Domain            string   `json:"domain"`
+		Domainid          string   `json:"domainid"`
+		Id                string   `json:"id"`
+		Name              string   `json:"name"`
+		Project           string   `json:"project"`
+		Projectid         string   `json:"projectid"`
+		Type              string   `json:"type"`
+		VirtualmachineIds []string `json:"virtualmachineIds"`
+	} `json:"affinitygroup"`
+	Cpunumber             int               `json:"cpunumber"`
+	Cpuspeed              int               `json:"cpuspeed"`
+	Cpuused               string            `json:"cpuused"`
+	Created               string            `json:"created"`
+	Details               map[string]string `json:"details"`
+	Diskioread            int64             `json:"diskioread"`
+	Diskiowrite           int64             `json:"diskiowrite"`
+	Diskkbsread           int64             `json:"diskkbsread"`
+	Diskkbswrite          int64             `json:"diskkbswrite"`
+	Diskofferingid        string            `json:"diskofferingid"`
+	Diskofferingname      string            `json:"diskofferingname"`
+	Displayname           string            `json:"displayname"`
+	Displayvm             bool              `json:"displayvm"`
+	Domain                string            `json:"domain"`
+	Domainid              string            `json:"domainid"`
+	Forvirtualnetwork     bool              `json:"forvirtualnetwork"`
+	Group                 string            `json:"group"`
+	Groupid               string            `json:"groupid"`
+	Guestosid             string            `json:"guestosid"`
+	Haenable              bool              `json:"haenable"`
+	Hostid                string            `json:"hostid"`
+	Hostname              string            `json:"hostname"`
+	Hypervisor            string            `json:"hypervisor"`
+	Id                    string            `json:"id"`
+	Instancename          string            `json:"instancename"`
+	Isdynamicallyscalable bool              `json:"isdynamicallyscalable"`
+	Isodisplaytext        string            `json:"isodisplaytext"`
+	Isoid                 string            `json:"isoid"`
+	Isoname               string            `json:"isoname"`
+	Keypair               string            `json:"keypair"`
+	Memory                int               `json:"memory"`
+	Memoryintfreekbs      int64             `json:"memoryintfreekbs"`
+	Memorykbs             int64             `json:"memorykbs"`
+	Memorytargetkbs       int64             `json:"memorytargetkbs"`
+	Name                  string            `json:"name"`
+	Networkkbsread        int64             `json:"networkkbsread"`
+	Networkkbswrite       int64             `json:"networkkbswrite"`
+	Nic                   []struct {
+		Broadcasturi         string `json:"broadcasturi"`
+		Deviceid             string `json:"deviceid"`
+		Gateway              string `json:"gateway"`
+		Id                   string `json:"id"`
+		Ip6address           string `json:"ip6address"`
+		Ip6cidr              string `json:"ip6cidr"`
+		Ip6gateway           string `json:"ip6gateway"`
+		Ipaddress            string `json:"ipaddress"`
+		Isdefault            bool   `json:"isdefault"`
+		Isolationuri         string `json:"isolationuri"`
+		Macaddress           string `json:"macaddress"`
+		Netmask              string `json:"netmask"`
+		Networkid            string `json:"networkid"`
+		Networkname          string `json:"networkname"`
+		Nsxlogicalswitch     string `json:"nsxlogicalswitch"`
+		Nsxlogicalswitchport string `json:"nsxlogicalswitchport"`
+		Secondaryip          []struct {
+			Id        string `json:"id"`
+			Ipaddress string `json:"ipaddress"`
+		} `json:"secondaryip"`
+		Traffictype      string `json:"traffictype"`
+		Type             string `json:"type"`
+		Virtualmachineid string `json:"virtualmachineid"`
+	} `json:"nic"`
+	Ostypeid        int64  `json:"ostypeid"`
+	Password        string `json:"password"`
+	Passwordenabled bool   `json:"passwordenabled"`
+	Project         string `json:"project"`
+	Projectid       string `json:"projectid"`
+	Publicip        string `json:"publicip"`
+	Publicipid      string `json:"publicipid"`
+	Rootdeviceid    int64  `json:"rootdeviceid"`
+	Rootdevicetype  string `json:"rootdevicetype"`
+	Securitygroup   []struct {
+		Account     string `json:"account"`
+		Description string `json:"description"`
+		Domain      string `json:"domain"`
+		Domainid    string `json:"domainid"`
+		Egressrule  []struct {
+			Account           string `json:"account"`
+			Cidr              string `json:"cidr"`
+			Endport           int    `json:"endport"`
+			Icmpcode          int    `json:"icmpcode"`
+			Icmptype          int    `json:"icmptype"`
+			Protocol          string `json:"protocol"`
+			Ruleid            string `json:"ruleid"`
+			Securitygroupname string `json:"securitygroupname"`
+			Startport         int    `json:"startport"`
+			Tags              []struct {
+				Account      string `json:"account"`
+				Customer     string `json:"customer"`
+				Domain       string `json:"domain"`
+				Domainid     string `json:"domainid"`
+				Key          string `json:"key"`
+				Project      string `json:"project"`
+				Projectid    string `json:"projectid"`
+				Resourceid   string `json:"resourceid"`
+				Resourcetype string `json:"resourcetype"`
+				Value        string `json:"value"`
+			} `json:"tags"`
+		} `json:"egressrule"`
+		Id          string `json:"id"`
+		Ingressrule []struct {
+			Account           string `json:"account"`
+			Cidr              string `json:"cidr"`
+			Endport           int    `json:"endport"`
+			Icmpcode          int    `json:"icmpcode"`
+			Icmptype          int    `json:"icmptype"`
+			Protocol          string `json:"protocol"`
+			Ruleid            string `json:"ruleid"`
+			Securitygroupname string `json:"securitygroupname"`
+			Startport         int    `json:"startport"`
+			Tags              []struct {
+				Account      string `json:"account"`
+				Customer     string `json:"customer"`
+				Domain       string `json:"domain"`
+				Domainid     string `json:"domainid"`
+				Key          string `json:"key"`
+				Project      string `json:"project"`
+				Projectid    string `json:"projectid"`
+				Resourceid   string `json:"resourceid"`
+				Resourcetype string `json:"resourcetype"`
+				Value        string `json:"value"`
+			} `json:"tags"`
+		} `json:"ingressrule"`
+		Name      string `json:"name"`
+		Project   string `json:"project"`
+		Projectid string `json:"projectid"`
+		Tags      []struct {
+			Account      string `json:"account"`
+			Customer     string `json:"customer"`
+			Domain       string `json:"domain"`
+			Domainid     string `json:"domainid"`
+			Key          string `json:"key"`
+			Project      string `json:"project"`
+			Projectid    string `json:"projectid"`
+			Resourceid   string `json:"resourceid"`
+			Resourcetype string `json:"resourcetype"`
+			Value        string `json:"value"`
+		} `json:"tags"`
+		Virtualmachinecount int           `json:"virtualmachinecount"`
+		Virtualmachineids   []interface{} `json:"virtualmachineids"`
+	} `json:"securitygroup"`
+	Serviceofferingid   string `json:"serviceofferingid"`
+	Serviceofferingname string `json:"serviceofferingname"`
+	Servicestate        string `json:"servicestate"`
+	State               string `json:"state"`
+	Templatedisplaytext string `json:"templatedisplaytext"`
+	Templateid          string `json:"templateid"`
+	Templatename        string `json:"templatename"`
+	Userid              string `json:"userid"`
+	Username            string `json:"username"`
+	Vgpu                string `json:"vgpu"`
+	Zoneid              string `json:"zoneid"`
+	Zonename            string `json:"zonename"`
+}
+
+type RestoreVirtualMachineParams struct {
+	p map[string]interface{}
+}
+
+func (p *RestoreVirtualMachineParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["templateid"]; found {
+		u.Set("templateid", v.(string))
+	}
+	if v, found := p.p["virtualmachineid"]; found {
+		u.Set("virtualmachineid", v.(string))
+	}
+	return u
+}
+
+func (p *RestoreVirtualMachineParams) SetTemplateid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["templateid"] = v
+	return
+}
+
+func (p *RestoreVirtualMachineParams) SetVirtualmachineid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["virtualmachineid"] = v
+	return
+}
+
+// You should always use this function to get a new RestoreVirtualMachineParams instance,
+// as then you are sure you have configured all required params
+func (s *VirtualMachineService) NewRestoreVirtualMachineParams(virtualmachineid string) *RestoreVirtualMachineParams {
+	p := &RestoreVirtualMachineParams{}
+	p.p = make(map[string]interface{})
+	p.p["virtualmachineid"] = virtualmachineid
+	return p
+}
+
+// Restore a VM to original template/ISO or new template/ISO
+func (s *VirtualMachineService) RestoreVirtualMachine(p *RestoreVirtualMachineParams) (*RestoreVirtualMachineResponse, error) {
+	resp, err := s.cs.newRequest("restoreVirtualMachine", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r RestoreVirtualMachineResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type RestoreVirtualMachineResponse struct {
+	JobID         string `json:"jobid"`
+	Account       string `json:"account"`
+	Affinitygroup []struct {
+		Account           string   `json:"account"`
+		Description       string   `json:"description"`
+		Domain            string   `json:"domain"`
+		Domainid          string   `json:"domainid"`
+		Id                string   `json:"id"`
+		Name              string   `json:"name"`
+		Project           string   `json:"project"`
+		Projectid         string   `json:"projectid"`
+		Type              string   `json:"type"`
+		VirtualmachineIds []string `json:"virtualmachineIds"`
+	} `json:"affinitygroup"`
+	Cpunumber             int               `json:"cpunumber"`
+	Cpuspeed              int               `json:"cpuspeed"`
+	Cpuused               string            `json:"cpuused"`
+	Created               string            `json:"created"`
+	Details               map[string]string `json:"details"`
+	Diskioread            int64             `json:"diskioread"`
+	Diskiowrite           int64             `json:"diskiowrite"`
+	Diskkbsread           int64             `json:"diskkbsread"`
+	Diskkbswrite          int64             `json:"diskkbswrite"`
+	Diskofferingid        string            `json:"diskofferingid"`
+	Diskofferingname      string            `json:"diskofferingname"`
+	Displayname           string            `json:"displayname"`
+	Displayvm             bool              `json:"displayvm"`
+	Domain                string            `json:"domain"`
+	Domainid              string            `json:"domainid"`
+	Forvirtualnetwork     bool              `json:"forvirtualnetwork"`
+	Group                 string            `json:"group"`
+	Groupid               string            `json:"groupid"`
+	Guestosid             string            `json:"guestosid"`
+	Haenable              bool              `json:"haenable"`
+	Hostid                string            `json:"hostid"`
+	Hostname              string            `json:"hostname"`
+	Hypervisor            string            `json:"hypervisor"`
+	Id                    string            `json:"id"`
+	Instancename          string            `json:"instancename"`
+	Isdynamicallyscalable bool              `json:"isdynamicallyscalable"`
+	Isodisplaytext        string            `json:"isodisplaytext"`
+	Isoid                 string            `json:"isoid"`
+	Isoname               string            `json:"isoname"`
+	Keypair               string            `json:"keypair"`
+	Memory                int               `json:"memory"`
+	Memoryintfreekbs      int64             `json:"memoryintfreekbs"`
+	Memorykbs             int64             `json:"memorykbs"`
+	Memorytargetkbs       int64             `json:"memorytargetkbs"`
+	Name                  string            `json:"name"`
+	Networkkbsread        int64             `json:"networkkbsread"`
+	Networkkbswrite       int64             `json:"networkkbswrite"`
+	Nic                   []struct {
+		Broadcasturi         string `json:"broadcasturi"`
+		Deviceid             string `json:"deviceid"`
+		Gateway              string `json:"gateway"`
+		Id                   string `json:"id"`
+		Ip6address           string `json:"ip6address"`
+		Ip6cidr              string `json:"ip6cidr"`
+		Ip6gateway           string `json:"ip6gateway"`
+		Ipaddress            string `json:"ipaddress"`
+		Isdefault            bool   `json:"isdefault"`
+		Isolationuri         string `json:"isolationuri"`
+		Macaddress           string `json:"macaddress"`
+		Netmask              string `json:"netmask"`
+		Networkid            string `json:"networkid"`
+		Networkname          string `json:"networkname"`
+		Nsxlogicalswitch     string `json:"nsxlogicalswitch"`
+		Nsxlogicalswitchport string `json:"nsxlogicalswitchport"`
+		Secondaryip          []struct {
+			Id        string `json:"id"`
+			Ipaddress string `json:"ipaddress"`
+		} `json:"secondaryip"`
+		Traffictype      string `json:"traffictype"`
+		Type             string `json:"type"`
+		Virtualmachineid string `json:"virtualmachineid"`
+	} `json:"nic"`
+	Ostypeid        int64  `json:"ostypeid"`
+	Password        string `json:"password"`
+	Passwordenabled bool   `json:"passwordenabled"`
+	Project         string `json:"project"`
+	Projectid       string `json:"projectid"`
+	Publicip        string `json:"publicip"`
+	Publicipid      string `json:"publicipid"`
+	Rootdeviceid    int64  `json:"rootdeviceid"`
+	Rootdevicetype  string `json:"rootdevicetype"`
+	Securitygroup   []struct {
+		Account     string `json:"account"`
+		Description string `json:"description"`
+		Domain      string `json:"domain"`
+		Domainid    string `json:"domainid"`
+		Egressrule  []struct {
+			Account           string `json:"account"`
+			Cidr              string `json:"cidr"`
+			Endport           int    `json:"endport"`
+			Icmpcode          int    `json:"icmpcode"`
+			Icmptype          int    `json:"icmptype"`
+			Protocol          string `json:"protocol"`
+			Ruleid            string `json:"ruleid"`
+			Securitygroupname string `json:"securitygroupname"`
+			Startport         int    `json:"startport"`
+			Tags              []struct {
+				Account      string `json:"account"`
+				Customer     string `json:"customer"`
+				Domain       string `json:"domain"`
+				Domainid     string `json:"domainid"`
+				Key          string `json:"key"`
+				Project      string `json:"project"`
+				Projectid    string `json:"projectid"`
+				Resourceid   string `json:"resourceid"`
+				Resourcetype string `json:"resourcetype"`
+				Value        string `json:"value"`
+			} `json:"tags"`
+		} `json:"egressrule"`
+		Id          string `json:"id"`
+		Ingressrule []struct {
+			Account           string `json:"account"`
+			Cidr              string `json:"cidr"`
+			Endport           int    `json:"endport"`
+			Icmpcode          int    `json:"icmpcode"`
+			Icmptype          int    `json:"icmptype"`
+			Protocol          string `json:"protocol"`
+			Ruleid            string `json:"ruleid"`
+			Securitygroupname string `json:"securitygroupname"`
+			Startport         int    `json:"startport"`
+			Tags              []struct {
+				Account      string `json:"account"`
+				Customer     string `json:"customer"`
+				Domain       string `json:"domain"`
+				Domainid     string `json:"domainid"`
+				Key          string `json:"key"`
+				Project      string `json:"project"`
+				Projectid    string `json:"projectid"`
+				Resourceid   string `json:"resourceid"`
+				Resourcetype string `json:"resourcetype"`
+				Value        string `json:"value"`
+			} `json:"tags"`
+		} `json:"ingressrule"`
+		Name      string `json:"name"`
+		Project   string `json:"project"`
+		Projectid string `json:"projectid"`
+		Tags      []struct {
+			Account      string `json:"account"`
+			Customer     string `json:"customer"`
+			Domain       string `json:"domain"`
+			Domainid     string `json:"domainid"`
+			Key          string `json:"key"`
+			Project      string `json:"project"`
+			Projectid    string `json:"projectid"`
+			Resourceid   string `json:"resourceid"`
+			Resourcetype string `json:"resourcetype"`
+			Value        string `json:"value"`
+		} `json:"tags"`
+		Virtualmachinecount int           `json:"virtualmachinecount"`
+		Virtualmachineids   []interface{} `json:"virtualmachineids"`
+	} `json:"securitygroup"`
+	Serviceofferingid   string `json:"serviceofferingid"`
+	Serviceofferingname string `json:"serviceofferingname"`
+	Servicestate        string `json:"servicestate"`
+	State               string `json:"state"`
+	Templatedisplaytext string `json:"templatedisplaytext"`
+	Templateid          string `json:"templateid"`
+	Templatename        string `json:"templatename"`
+	Userid              string `json:"userid"`
+	Username            string `json:"username"`
+	Vgpu                string `json:"vgpu"`
+	Zoneid              string `json:"zoneid"`
+	Zonename            string `json:"zonename"`
+}
+
+type ScaleVirtualMachineParams struct {
+	p map[string]interface{}
+}
+
+func (p *ScaleVirtualMachineParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["details"]; found {
+		i := 0
+		for k, vv := range v.(map[string]string) {
+			u.Set(fmt.Sprintf("details[%d].%s", i, k), vv)
+			i++
+		}
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["serviceofferingid"]; found {
+		u.Set("serviceofferingid", v.(string))
+	}
+	return u
+}
+
+func (p *ScaleVirtualMachineParams) SetDetails(v map[string]string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["details"] = v
+	return
+}
+
+func (p *ScaleVirtualMachineParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ScaleVirtualMachineParams) SetServiceofferingid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["serviceofferingid"] = v
+	return
+}
+
+// You should always use this function to get a new ScaleVirtualMachineParams instance,
+// as then you are sure you have configured all required params
+func (s *VirtualMachineService) NewScaleVirtualMachineParams(id string, serviceofferingid string) *ScaleVirtualMachineParams {
+	p := &ScaleVirtualMachineParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	p.p["serviceofferingid"] = serviceofferingid
+	return p
+}
+
+// Scales the virtual machine to a new service offering.
+func (s *VirtualMachineService) ScaleVirtualMachine(p *ScaleVirtualMachineParams) (*ScaleVirtualMachineResponse, error) {
+	resp, err := s.cs.newRequest("scaleVirtualMachine", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ScaleVirtualMachineResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type ScaleVirtualMachineResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
+
+type StartVirtualMachineParams struct {
+	p map[string]interface{}
+}
+
+func (p *StartVirtualMachineParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["deploymentplanner"]; found {
+		u.Set("deploymentplanner", v.(string))
+	}
+	if v, found := p.p["hostid"]; found {
+		u.Set("hostid", v.(string))
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *StartVirtualMachineParams) SetDeploymentplanner(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["deploymentplanner"] = v
+	return
+}
+
+func (p *StartVirtualMachineParams) SetHostid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["hostid"] = v
+	return
+}
+
+func (p *StartVirtualMachineParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new StartVirtualMachineParams instance,
+// as then you are sure you have configured all required params
+func (s *VirtualMachineService) NewStartVirtualMachineParams(id string) *StartVirtualMachineParams {
+	p := &StartVirtualMachineParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Starts a virtual machine.
+func (s *VirtualMachineService) StartVirtualMachine(p *StartVirtualMachineParams) (*StartVirtualMachineResponse, error) {
+	resp, err := s.cs.newRequest("startVirtualMachine", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r StartVirtualMachineResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type StartVirtualMachineResponse struct {
+	JobID         string `json:"jobid"`
+	Account       string `json:"account"`
+	Affinitygroup []struct {
+		Account           string   `json:"account"`
+		Description       string   `json:"description"`
+		Domain            string   `json:"domain"`
+		Domainid          string   `json:"domainid"`
+		Id                string   `json:"id"`
+		Name              string   `json:"name"`
+		Project           string   `json:"project"`
+		Projectid         string   `json:"projectid"`
+		Type              string   `json:"type"`
+		VirtualmachineIds []string `json:"virtualmachineIds"`
+	} `json:"affinitygroup"`
+	Cpunumber             int               `json:"cpunumber"`
+	Cpuspeed              int               `json:"cpuspeed"`
+	Cpuused               string            `json:"cpuused"`
+	Created               string            `json:"created"`
+	Details               map[string]string `json:"details"`
+	Diskioread            int64             `json:"diskioread"`
+	Diskiowrite           int64             `json:"diskiowrite"`
+	Diskkbsread           int64             `json:"diskkbsread"`
+	Diskkbswrite          int64             `json:"diskkbswrite"`
+	Diskofferingid        string            `json:"diskofferingid"`
+	Diskofferingname      string            `json:"diskofferingname"`
+	Displayname           string            `json:"displayname"`
+	Displayvm             bool              `json:"displayvm"`
+	Domain                string            `json:"domain"`
+	Domainid              string            `json:"domainid"`
+	Forvirtualnetwork     bool              `json:"forvirtualnetwork"`
+	Group                 string            `json:"group"`
+	Groupid               string            `json:"groupid"`
+	Guestosid             string            `json:"guestosid"`
+	Haenable              bool              `json:"haenable"`
+	Hostid                string            `json:"hostid"`
+	Hostname              string            `json:"hostname"`
+	Hypervisor            string            `json:"hypervisor"`
+	Id                    string            `json:"id"`
+	Instancename          string            `json:"instancename"`
+	Isdynamicallyscalable bool              `json:"isdynamicallyscalable"`
+	Isodisplaytext        string            `json:"isodisplaytext"`
+	Isoid                 string            `json:"isoid"`
+	Isoname               string            `json:"isoname"`
+	Keypair               string            `json:"keypair"`
+	Memory                int               `json:"memory"`
+	Memoryintfreekbs      int64             `json:"memoryintfreekbs"`
+	Memorykbs             int64             `json:"memorykbs"`
+	Memorytargetkbs       int64             `json:"memorytargetkbs"`
+	Name                  string            `json:"name"`
+	Networkkbsread        int64             `json:"networkkbsread"`
+	Networkkbswrite       int64             `json:"networkkbswrite"`
+	Nic                   []struct {
+		Broadcasturi         string `json:"broadcasturi"`
+		Deviceid             string `json:"deviceid"`
+		Gateway              string `json:"gateway"`
+		Id                   string `json:"id"`
+		Ip6address           string `json:"ip6address"`
+		Ip6cidr              string `json:"ip6cidr"`
+		Ip6gateway           string `json:"ip6gateway"`
+		Ipaddress            string `json:"ipaddress"`
+		Isdefault            bool   `json:"isdefault"`
+		Isolationuri         string `json:"isolationuri"`
+		Macaddress           string `json:"macaddress"`
+		Netmask              string `json:"netmask"`
+		Networkid            string `json:"networkid"`
+		Networkname          string `json:"networkname"`
+		Nsxlogicalswitch     string `json:"nsxlogicalswitch"`
+		Nsxlogicalswitchport string `json:"nsxlogicalswitchport"`
+		Secondaryip          []struct {
+			Id        string `json:"id"`
+			Ipaddress string `json:"ipaddress"`
+		} `json:"secondaryip"`
+		Traffictype      string `json:"traffictype"`
+		Type             string `json:"type"`
+		Virtualmachineid string `json:"virtualmachineid"`
+	} `json:"nic"`
+	Ostypeid        int64  `json:"ostypeid"`
+	Password        string `json:"password"`
+	Passwordenabled bool   `json:"passwordenabled"`
+	Project         string `json:"project"`
+	Projectid       string `json:"projectid"`
+	Publicip        string `json:"publicip"`
+	Publicipid      string `json:"publicipid"`
+	Rootdeviceid    int64  `json:"rootdeviceid"`
+	Rootdevicetype  string `json:"rootdevicetype"`
+	Securitygroup   []struct {
+		Account     string `json:"account"`
+		Description string `json:"description"`
+		Domain      string `json:"domain"`
+		Domainid    string `json:"domainid"`
+		Egressrule  []struct {
+			Account           string `json:"account"`
+			Cidr              string `json:"cidr"`
+			Endport           int    `json:"endport"`
+			Icmpcode          int    `json:"icmpcode"`
+			Icmptype          int    `json:"icmptype"`
+			Protocol          string `json:"protocol"`
+			Ruleid            string `json:"ruleid"`
+			Securitygroupname string `json:"securitygroupname"`
+			Startport         int    `json:"startport"`
+			Tags              []struct {
+				Account      string `json:"account"`
+				Customer     string `json:"customer"`
+				Domain       string `json:"domain"`
+				Domainid     string `json:"domainid"`
+				Key          string `json:"key"`
+				Project      string `json:"project"`
+				Projectid    string `json:"projectid"`
+				Resourceid   string `json:"resourceid"`
+				Resourcetype string `json:"resourcetype"`
+				Value        string `json:"value"`
+			} `json:"tags"`
+		} `json:"egressrule"`
+		Id          string `json:"id"`
+		Ingressrule []struct {
+			Account           string `json:"account"`
+			Cidr              string `json:"cidr"`
+			Endport           int    `json:"endport"`
+			Icmpcode          int    `json:"icmpcode"`
+			Icmptype          int    `json:"icmptype"`
+			Protocol          string `json:"protocol"`
+			Ruleid            string `json:"ruleid"`
+			Securitygroupname string `json:"securitygroupname"`
+			Startport         int    `json:"startport"`
+			Tags              []struct {
+				Account      string `json:"account"`
+				Customer     string `json:"customer"`
+				Domain       string `json:"domain"`
+				Domainid     string `json:"domainid"`
+				Key          string `json:"key"`
+				Project      string `json:"project"`
+				Projectid    string `json:"projectid"`
+				Resourceid   string `json:"resourceid"`
+				Resourcetype string `json:"resourcetype"`
+				Value        string `json:"value"`
+			} `json:"tags"`
+		} `json:"ingressrule"`
+		Name      string `json:"name"`
+		Project   string `json:"project"`
+		Projectid string `json:"projectid"`
+		Tags      []struct {
+			Account      string `json:"account"`
+			Customer     string `json:"customer"`
+			Domain       string `json:"domain"`
+			Domainid     string `json:"domainid"`
+			Key          string `json:"key"`
+			Project      string `json:"project"`
+			Projectid    string `json:"projectid"`
+			Resourceid   string `json:"resourceid"`
+			Resourcetype string `json:"resourcetype"`
+			Value        string `json:"value"`
+		} `json:"tags"`
+		Virtualmachinecount int           `json:"virtualmachinecount"`
+		Virtualmachineids   []interface{} `json:"virtualmachineids"`
+	} `json:"securitygroup"`
+	Serviceofferingid   string `json:"serviceofferingid"`
+	Serviceofferingname string `json:"serviceofferingname"`
+	Servicestate        string `json:"servicestate"`
+	State               string `json:"state"`
+	Templatedisplaytext string `json:"templatedisplaytext"`
+	Templateid          string `json:"templateid"`
+	Templatename        string `json:"templatename"`
+	Userid              string `json:"userid"`
+	Username            string `json:"username"`
+	Vgpu                string `json:"vgpu"`
+	Zoneid              string `json:"zoneid"`
+	Zonename            string `json:"zonename"`
+}
+
+type StopVirtualMachineParams struct {
+	p map[string]interface{}
+}
+
+func (p *StopVirtualMachineParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["forced"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("forced", vv)
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *StopVirtualMachineParams) SetForced(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["forced"] = v
+	return
+}
+
+func (p *StopVirtualMachineParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new StopVirtualMachineParams instance,
+// as then you are sure you have configured all required params
+func (s *VirtualMachineService) NewStopVirtualMachineParams(id string) *StopVirtualMachineParams {
+	p := &StopVirtualMachineParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Stops a virtual machine.
+func (s *VirtualMachineService) StopVirtualMachine(p *StopVirtualMachineParams) (*StopVirtualMachineResponse, error) {
+	resp, err := s.cs.newRequest("stopVirtualMachine", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r StopVirtualMachineResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type StopVirtualMachineResponse struct {
+	JobID         string `json:"jobid"`
+	Account       string `json:"account"`
+	Affinitygroup []struct {
+		Account           string   `json:"account"`
+		Description       string   `json:"description"`
+		Domain            string   `json:"domain"`
+		Domainid          string   `json:"domainid"`
+		Id                string   `json:"id"`
+		Name              string   `json:"name"`
+		Project           string   `json:"project"`
+		Projectid         string   `json:"projectid"`
+		Type              string   `json:"type"`
+		VirtualmachineIds []string `json:"virtualmachineIds"`
+	} `json:"affinitygroup"`
+	Cpunumber             int               `json:"cpunumber"`
+	Cpuspeed              int               `json:"cpuspeed"`
+	Cpuused               string            `json:"cpuused"`
+	Created               string            `json:"created"`
+	Details               map[string]string `json:"details"`
+	Diskioread            int64             `json:"diskioread"`
+	Diskiowrite           int64             `json:"diskiowrite"`
+	Diskkbsread           int64             `json:"diskkbsread"`
+	Diskkbswrite          int64             `json:"diskkbswrite"`
+	Diskofferingid        string            `json:"diskofferingid"`
+	Diskofferingname      string            `json:"diskofferingname"`
+	Displayname           string            `json:"displayname"`
+	Displayvm             bool              `json:"displayvm"`
+	Domain                string            `json:"domain"`
+	Domainid              string            `json:"domainid"`
+	Forvirtualnetwork     bool              `json:"forvirtualnetwork"`
+	Group                 string            `json:"group"`
+	Groupid               string            `json:"groupid"`
+	Guestosid             string            `json:"guestosid"`
+	Haenable              bool              `json:"haenable"`
+	Hostid                string            `json:"hostid"`
+	Hostname              string            `json:"hostname"`
+	Hypervisor            string            `json:"hypervisor"`
+	Id                    string            `json:"id"`
+	Instancename          string            `json:"instancename"`
+	Isdynamicallyscalable bool              `json:"isdynamicallyscalable"`
+	Isodisplaytext        string            `json:"isodisplaytext"`
+	Isoid                 string            `json:"isoid"`
+	Isoname               string            `json:"isoname"`
+	Keypair               string            `json:"keypair"`
+	Memory                int               `json:"memory"`
+	Memoryintfreekbs      int64             `json:"memoryintfreekbs"`
+	Memorykbs             int64             `json:"memorykbs"`
+	Memorytargetkbs       int64             `json:"memorytargetkbs"`
+	Name                  string            `json:"name"`
+	Networkkbsread        int64             `json:"networkkbsread"`
+	Networkkbswrite       int64             `json:"networkkbswrite"`
+	Nic                   []struct {
+		Broadcasturi         string `json:"broadcasturi"`
+		Deviceid             string `json:"deviceid"`
+		Gateway              string `json:"gateway"`
+		Id                   string `json:"id"`
+		Ip6address           string `json:"ip6address"`
+		Ip6cidr              string `json:"ip6cidr"`
+		Ip6gateway           string `json:"ip6gateway"`
+		Ipaddress            string `json:"ipaddress"`
+		Isdefault            bool   `json:"isdefault"`
+		Isolationuri         string `json:"isolationuri"`
+		Macaddress           string `json:"macaddress"`
+		Netmask              string `json:"netmask"`
+		Networkid            string `json:"networkid"`
+		Networkname          string `json:"networkname"`
+		Nsxlogicalswitch     string `json:"nsxlogicalswitch"`
+		Nsxlogicalswitchport string `json:"nsxlogicalswitchport"`
+		Secondaryip          []struct {
+			Id        string `json:"id"`
+			Ipaddress string `json:"ipaddress"`
+		} `json:"secondaryip"`
+		Traffictype      string `json:"traffictype"`
+		Type             string `json:"type"`
+		Virtualmachineid string `json:"virtualmachineid"`
+	} `json:"nic"`
+	Ostypeid        int64  `json:"ostypeid"`
+	Password        string `json:"password"`
+	Passwordenabled bool   `json:"passwordenabled"`
+	Project         string `json:"project"`
+	Projectid       string `json:"projectid"`
+	Publicip        string `json:"publicip"`
+	Publicipid      string `json:"publicipid"`
+	Rootdeviceid    int64  `json:"rootdeviceid"`
+	Rootdevicetype  string `json:"rootdevicetype"`
+	Securitygroup   []struct {
+		Account     string `json:"account"`
+		Description string `json:"description"`
+		Domain      string `json:"domain"`
+		Domainid    string `json:"domainid"`
+		Egressrule  []struct {
+			Account           string `json:"account"`
+			Cidr              string `json:"cidr"`
+			Endport           int    `json:"endport"`
+			Icmpcode          int    `json:"icmpcode"`
+			Icmptype          int    `json:"icmptype"`
+			Protocol          string `json:"protocol"`
+			Ruleid            string `json:"ruleid"`
+			Securitygroupname string `json:"securitygroupname"`
+			Startport         int    `json:"startport"`
+			Tags              []struct {
+				Account      string `json:"account"`
+				Customer     string `json:"customer"`
+				Domain       string `json:"domain"`
+				Domainid     string `json:"domainid"`
+				Key          string `json:"key"`
+				Project      string `json:"project"`
+				Projectid    string `json:"projectid"`
+				Resourceid   string `json:"resourceid"`
+				Resourcetype string `json:"resourcetype"`
+				Value        string `json:"value"`
+			} `json:"tags"`
+		} `json:"egressrule"`
+		Id          string `json:"id"`
+		Ingressrule []struct {
+			Account           string `json:"account"`
+			Cidr              string `json:"cidr"`
+			Endport           int    `json:"endport"`
+			Icmpcode          int    `json:"icmpcode"`
+			Icmptype          int    `json:"icmptype"`
+			Protocol          string `json:"protocol"`
+			Ruleid            string `json:"ruleid"`
+			Securitygroupname string `json:"securitygroupname"`
+			Startport         int    `json:"startport"`
+			Tags              []struct {
+				Account      string `json:"account"`
+				Customer     string `json:"customer"`
+				Domain       string `json:"domain"`
+				Domainid     string `json:"domainid"`
+				Key          string `json:"key"`
+				Project      string `json:"project"`
+				Projectid    string `json:"projectid"`
+				Resourceid   string `json:"resourceid"`
+				Resourcetype string `json:"resourcetype"`
+				Value        string `json:"value"`
+			} `json:"tags"`
+		} `json:"ingressrule"`
+		Name      string `json:"name"`
+		Project   string `json:"project"`
+		Projectid string `json:"projectid"`
+		Tags      []struct {
+			Account      string `json:"account"`
+			Customer     string `json:"customer"`
+			Domain       string `json:"domain"`
+			Domainid     string `json:"domainid"`
+			Key          string `json:"key"`
+			Project      string `json:"project"`
+			Projectid    string `json:"projectid"`
+			Resourceid   string `json:"resourceid"`
+			Resourcetype string `json:"resourcetype"`
+			Value        string `json:"value"`
+		} `json:"tags"`
+		Virtualmachinecount int           `json:"virtualmachinecount"`
+		Virtualmachineids   []interface{} `json:"virtualmachineids"`
+	} `json:"securitygroup"`
+	Serviceofferingid   string `json:"serviceofferingid"`
+	Serviceofferingname string `json:"serviceofferingname"`
+	Servicestate        string `json:"servicestate"`
+	State               string `json:"state"`
+	Templatedisplaytext string `json:"templatedisplaytext"`
+	Templateid          string `json:"templateid"`
+	Templatename        string `json:"templatename"`
+	Userid              string `json:"userid"`
+	Username            string `json:"username"`
+	Vgpu                string `json:"vgpu"`
+	Zoneid              string `json:"zoneid"`
+	Zonename            string `json:"zonename"`
+}
+
+type UpdateDefaultNicForVirtualMachineParams struct {
+	p map[string]interface{}
+}
+
+func (p *UpdateDefaultNicForVirtualMachineParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["nicid"]; found {
+		u.Set("nicid", v.(string))
+	}
+	if v, found := p.p["virtualmachineid"]; found {
+		u.Set("virtualmachineid", v.(string))
+	}
+	return u
+}
+
+func (p *UpdateDefaultNicForVirtualMachineParams) SetNicid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["nicid"] = v
+	return
+}
+
+func (p *UpdateDefaultNicForVirtualMachineParams) SetVirtualmachineid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["virtualmachineid"] = v
+	return
+}
+
+// You should always use this function to get a new UpdateDefaultNicForVirtualMachineParams instance,
+// as then you are sure you have configured all required params
+func (s *VirtualMachineService) NewUpdateDefaultNicForVirtualMachineParams(nicid string, virtualmachineid string) *UpdateDefaultNicForVirtualMachineParams {
+	p := &UpdateDefaultNicForVirtualMachineParams{}
+	p.p = make(map[string]interface{})
+	p.p["nicid"] = nicid
+	p.p["virtualmachineid"] = virtualmachineid
+	return p
+}
+
+// Changes the default NIC on a VM
+func (s *VirtualMachineService) UpdateDefaultNicForVirtualMachine(p *UpdateDefaultNicForVirtualMachineParams) (*UpdateDefaultNicForVirtualMachineResponse, error) {
+	resp, err := s.cs.newRequest("updateDefaultNicForVirtualMachine", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r UpdateDefaultNicForVirtualMachineResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type UpdateDefaultNicForVirtualMachineResponse struct {
+	JobID         string `json:"jobid"`
+	Account       string `json:"account"`
+	Affinitygroup []struct {
+		Account           string   `json:"account"`
+		Description       string   `json:"description"`
+		Domain            string   `json:"domain"`
+		Domainid          string   `json:"domainid"`
+		Id                string   `json:"id"`
+		Name              string   `json:"name"`
+		Project           string   `json:"project"`
+		Projectid         string   `json:"projectid"`
+		Type              string   `json:"type"`
+		VirtualmachineIds []string `json:"virtualmachineIds"`
+	} `json:"affinitygroup"`
+	Cpunumber             int               `json:"cpunumber"`
+	Cpuspeed              int               `json:"cpuspeed"`
+	Cpuused               string            `json:"cpuused"`
+	Created               string            `json:"created"`
+	Details               map[string]string `json:"details"`
+	Diskioread            int64             `json:"diskioread"`
+	Diskiowrite           int64             `json:"diskiowrite"`
+	Diskkbsread           int64             `json:"diskkbsread"`
+	Diskkbswrite          int64             `json:"diskkbswrite"`
+	Diskofferingid        string            `json:"diskofferingid"`
+	Diskofferingname      string            `json:"diskofferingname"`
+	Displayname           string            `json:"displayname"`
+	Displayvm             bool              `json:"displayvm"`
+	Domain                string            `json:"domain"`
+	Domainid              string            `json:"domainid"`
+	Forvirtualnetwork     bool              `json:"forvirtualnetwork"`
+	Group                 string            `json:"group"`
+	Groupid               string            `json:"groupid"`
+	Guestosid             string            `json:"guestosid"`
+	Haenable              bool              `json:"haenable"`
+	Hostid                string            `json:"hostid"`
+	Hostname              string            `json:"hostname"`
+	Hypervisor            string            `json:"hypervisor"`
+	Id                    string            `json:"id"`
+	Instancename          string            `json:"instancename"`
+	Isdynamicallyscalable bool              `json:"isdynamicallyscalable"`
+	Isodisplaytext        string            `json:"isodisplaytext"`
+	Isoid                 string            `json:"isoid"`
+	Isoname               string            `json:"isoname"`
+	Keypair               string            `json:"keypair"`
+	Memory                int               `json:"memory"`
+	Memoryintfreekbs      int64             `json:"memoryintfreekbs"`
+	Memorykbs             int64             `json:"memorykbs"`
+	Memorytargetkbs       int64             `json:"memorytargetkbs"`
+	Name                  string            `json:"name"`
+	Networkkbsread        int64             `json:"networkkbsread"`
+	Networkkbswrite       int64             `json:"networkkbswrite"`
+	Nic                   []struct {
+		Broadcasturi         string `json:"broadcasturi"`
+		Deviceid             string `json:"deviceid"`
+		Gateway              string `json:"gateway"`
+		Id                   string `json:"id"`
+		Ip6address           string `json:"ip6address"`
+		Ip6cidr              string `json:"ip6cidr"`
+		Ip6gateway           string `json:"ip6gateway"`
+		Ipaddress            string `json:"ipaddress"`
+		Isdefault            bool   `json:"isdefault"`
+		Isolationuri         string `json:"isolationuri"`
+		Macaddress           string `json:"macaddress"`
+		Netmask              string `json:"netmask"`
+		Networkid            string `json:"networkid"`
+		Networkname          string `json:"networkname"`
+		Nsxlogicalswitch     string `json:"nsxlogicalswitch"`
+		Nsxlogicalswitchport string `json:"nsxlogicalswitchport"`
+		Secondaryip          []struct {
+			Id        string `json:"id"`
+			Ipaddress string `json:"ipaddress"`
+		} `json:"secondaryip"`
+		Traffictype      string `json:"traffictype"`
+		Type             string `json:"type"`
+		Virtualmachineid string `json:"virtualmachineid"`
+	} `json:"nic"`
+	Ostypeid        int64  `json:"ostypeid"`
+	Password        string `json:"password"`
+	Passwordenabled bool   `json:"passwordenabled"`
+	Project         string `json:"project"`
+	Projectid       string `json:"projectid"`
+	Publicip        string `json:"publicip"`
+	Publicipid      string `json:"publicipid"`
+	Rootdeviceid    int64  `json:"rootdeviceid"`
+	Rootdevicetype  string `json:"rootdevicetype"`
+	Securitygroup   []struct {
+		Account     string `json:"account"`
+		Description string `json:"description"`
+		Domain      string `json:"domain"`
+		Domainid    string `json:"domainid"`
+		Egressrule  []struct {
+			Account           string `json:"account"`
+			Cidr              string `json:"cidr"`
+			Endport           int    `json:"endport"`
+			Icmpcode          int    `json:"icmpcode"`
+			Icmptype          int    `json:"icmptype"`
+			Protocol          string `json:"protocol"`
+			Ruleid            string `json:"ruleid"`
+			Securitygroupname string `json:"securitygroupname"`
+			Startport         int    `json:"startport"`
+			Tags              []struct {
+				Account      string `json:"account"`
+				Customer     string `json:"customer"`
+				Domain       string `json:"domain"`
+				Domainid     string `json:"domainid"`
+				Key          string `json:"key"`
+				Project      string `json:"project"`
+				Projectid    string `json:"projectid"`
+				Resourceid   string `json:"resourceid"`
+				Resourcetype string `json:"resourcetype"`
+				Value        string `json:"value"`
+			} `json:"tags"`
+		} `json:"egressrule"`
+		Id          string `json:"id"`
+		Ingressrule []struct {
+			Account           string `json:"account"`
+			Cidr              string `json:"cidr"`
+			Endport           int    `json:"endport"`
+			Icmpcode          int    `json:"icmpcode"`
+			Icmptype          int    `json:"icmptype"`
+			Protocol          string `json:"protocol"`
+			Ruleid            string `json:"ruleid"`
+			Securitygroupname string `json:"securitygroupname"`
+			Startport         int    `json:"startport"`
+			Tags              []struct {
+				Account      string `json:"account"`
+				Customer     string `json:"customer"`
+				Domain       string `json:"domain"`
+				Domainid     string `json:"domainid"`
+				Key          string `json:"key"`
+				Project      string `json:"project"`
+				Projectid    string `json:"projectid"`
+				Resourceid   string `json:"resourceid"`
+				Resourcetype string `json:"resourcetype"`
+				Value        string `json:"value"`
+			} `json:"tags"`
+		} `json:"ingressrule"`
+		Name      string `json:"name"`
+		Project   string `json:"project"`
+		Projectid string `json:"projectid"`
+		Tags      []struct {
+			Account      string `json:"account"`
+			Customer     string `json:"customer"`
+			Domain       string `json:"domain"`
+			Domainid     string `json:"domainid"`
+			Key          string `json:"key"`
+			Project      string `json:"project"`
+			Projectid    string `json:"projectid"`
+			Resourceid   string `json:"resourceid"`
+			Resourcetype string `json:"resourcetype"`
+			Value        string `json:"value"`
+		} `json:"tags"`
+		Virtualmachinecount int           `json:"virtualmachinecount"`
+		Virtualmachineids   []interface{} `json:"virtualmachineids"`
+	} `json:"securitygroup"`
+	Serviceofferingid   string `json:"serviceofferingid"`
+	Serviceofferingname string `json:"serviceofferingname"`
+	Servicestate        string `json:"servicestate"`
+	State               string `json:"state"`
+	Templatedisplaytext string `json:"templatedisplaytext"`
+	Templateid          string `json:"templateid"`
+	Templatename        string `json:"templatename"`
+	Userid              string `json:"userid"`
+	Username            string `json:"username"`
+	Vgpu                string `json:"vgpu"`
+	Zoneid              string `json:"zoneid"`
+	Zonename            string `json:"zonename"`
+}
+
+type UpdateVirtualMachineParams struct {
+	p map[string]interface{}
+}
+
+func (p *UpdateVirtualMachineParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["customid"]; found {
+		u.Set("customid", v.(string))
+	}
+	if v, found := p.p["details"]; found {
+		i := 0
+		for k, vv := range v.(map[string]string) {
+			u.Set(fmt.Sprintf("details[%d].%s", i, k), vv)
+			i++
+		}
+	}
+	if v, found := p.p["displayname"]; found {
+		u.Set("displayname", v.(string))
+	}
+	if v, found := p.p["displayvm"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("displayvm", vv)
+	}
+	if v, found := p.p["group"]; found {
+		u.Set("group", v.(string))
+	}
+	if v, found := p.p["haenable"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("haenable", vv)
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["instancename"]; found {
+		u.Set("instancename", v.(string))
+	}
+	if v, found := p.p["isdynamicallyscalable"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("isdynamicallyscalable", vv)
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["ostypeid"]; found {
+		u.Set("ostypeid", v.(string))
+	}
+	if v, found := p.p["securitygroupids"]; found {
+		vv := strings.Join(v.([]string), ",")
+		u.Set("securitygroupids", vv)
+	}
+	if v, found := p.p["securitygroupnames"]; found {
+		vv := strings.Join(v.([]string), ",")
+		u.Set("securitygroupnames", vv)
+	}
+	if v, found := p.p["userdata"]; found {
+		u.Set("userdata", v.(string))
+	}
+	return u
+}
+
+func (p *UpdateVirtualMachineParams) SetCustomid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["customid"] = v
+	return
+}
+
+func (p *UpdateVirtualMachineParams) SetDetails(v map[string]string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["details"] = v
+	return
+}
+
+func (p *UpdateVirtualMachineParams) SetDisplayname(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["displayname"] = v
+	return
+}
+
+func (p *UpdateVirtualMachineParams) SetDisplayvm(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["displayvm"] = v
+	return
+}
+
+func (p *UpdateVirtualMachineParams) SetGroup(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["group"] = v
+	return
+}
+
+func (p *UpdateVirtualMachineParams) SetHaenable(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["haenable"] = v
+	return
+}
+
+func (p *UpdateVirtualMachineParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *UpdateVirtualMachineParams) SetInstancename(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["instancename"] = v
+	return
+}
+
+func (p *UpdateVirtualMachineParams) SetIsdynamicallyscalable(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isdynamicallyscalable"] = v
+	return
+}
+
+func (p *UpdateVirtualMachineParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *UpdateVirtualMachineParams) SetOstypeid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["ostypeid"] = v
+	return
+}
+
+func (p *UpdateVirtualMachineParams) SetSecuritygroupids(v []string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["securitygroupids"] = v
+	return
+}
+
+func (p *UpdateVirtualMachineParams) SetSecuritygroupnames(v []string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["securitygroupnames"] = v
+	return
+}
+
+func (p *UpdateVirtualMachineParams) SetUserdata(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["userdata"] = v
+	return
+}
+
+// You should always use this function to get a new UpdateVirtualMachineParams instance,
+// as then you are sure you have configured all required params
+func (s *VirtualMachineService) NewUpdateVirtualMachineParams(id string) *UpdateVirtualMachineParams {
+	p := &UpdateVirtualMachineParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Updates properties of a virtual machine. The VM has to be stopped and restarted for the new properties to take effect. UpdateVirtualMachine does not first check whether the VM is stopped. Therefore, stop the VM manually before issuing this call.
+func (s *VirtualMachineService) UpdateVirtualMachine(p *UpdateVirtualMachineParams) (*UpdateVirtualMachineResponse, error) {
+	resp, err := s.cs.newRequest("updateVirtualMachine", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r UpdateVirtualMachineResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type UpdateVirtualMachineResponse struct {
+	Account       string `json:"account"`
+	Affinitygroup []struct {
+		Account           string   `json:"account"`
+		Description       string   `json:"description"`
+		Domain            string   `json:"domain"`
+		Domainid          string   `json:"domainid"`
+		Id                string   `json:"id"`
+		Name              string   `json:"name"`
+		Project           string   `json:"project"`
+		Projectid         string   `json:"projectid"`
+		Type              string   `json:"type"`
+		VirtualmachineIds []string `json:"virtualmachineIds"`
+	} `json:"affinitygroup"`
+	Cpunumber             int               `json:"cpunumber"`
+	Cpuspeed              int               `json:"cpuspeed"`
+	Cpuused               string            `json:"cpuused"`
+	Created               string            `json:"created"`
+	Details               map[string]string `json:"details"`
+	Diskioread            int64             `json:"diskioread"`
+	Diskiowrite           int64             `json:"diskiowrite"`
+	Diskkbsread           int64             `json:"diskkbsread"`
+	Diskkbswrite          int64             `json:"diskkbswrite"`
+	Diskofferingid        string            `json:"diskofferingid"`
+	Diskofferingname      string            `json:"diskofferingname"`
+	Displayname           string            `json:"displayname"`
+	Displayvm             bool              `json:"displayvm"`
+	Domain                string            `json:"domain"`
+	Domainid              string            `json:"domainid"`
+	Forvirtualnetwork     bool              `json:"forvirtualnetwork"`
+	Group                 string            `json:"group"`
+	Groupid               string            `json:"groupid"`
+	Guestosid             string            `json:"guestosid"`
+	Haenable              bool              `json:"haenable"`
+	Hostid                string            `json:"hostid"`
+	Hostname              string            `json:"hostname"`
+	Hypervisor            string            `json:"hypervisor"`
+	Id                    string            `json:"id"`
+	Instancename          string            `json:"instancename"`
+	Isdynamicallyscalable bool              `json:"isdynamicallyscalable"`
+	Isodisplaytext        string            `json:"isodisplaytext"`
+	Isoid                 string            `json:"isoid"`
+	Isoname               string            `json:"isoname"`
+	Keypair               string            `json:"keypair"`
+	Memory                int               `json:"memory"`
+	Memoryintfreekbs      int64             `json:"memoryintfreekbs"`
+	Memorykbs             int64             `json:"memorykbs"`
+	Memorytargetkbs       int64             `json:"memorytargetkbs"`
+	Name                  string            `json:"name"`
+	Networkkbsread        int64             `json:"networkkbsread"`
+	Networkkbswrite       int64             `json:"networkkbswrite"`
+	Nic                   []struct {
+		Broadcasturi         string `json:"broadcasturi"`
+		Deviceid             string `json:"deviceid"`
+		Gateway              string `json:"gateway"`
+		Id                   string `json:"id"`
+		Ip6address           string `json:"ip6address"`
+		Ip6cidr              string `json:"ip6cidr"`
+		Ip6gateway           string `json:"ip6gateway"`
+		Ipaddress            string `json:"ipaddress"`
+		Isdefault            bool   `json:"isdefault"`
+		Isolationuri         string `json:"isolationuri"`
+		Macaddress           string `json:"macaddress"`
+		Netmask              string `json:"netmask"`
+		Networkid            string `json:"networkid"`
+		Networkname          string `json:"networkname"`
+		Nsxlogicalswitch     string `json:"nsxlogicalswitch"`
+		Nsxlogicalswitchport string `json:"nsxlogicalswitchport"`
+		Secondaryip          []struct {
+			Id        string `json:"id"`
+			Ipaddress string `json:"ipaddress"`
+		} `json:"secondaryip"`
+		Traffictype      string `json:"traffictype"`
+		Type             string `json:"type"`
+		Virtualmachineid string `json:"virtualmachineid"`
+	} `json:"nic"`
+	Ostypeid        int64  `json:"ostypeid"`
+	Password        string `json:"password"`
+	Passwordenabled bool   `json:"passwordenabled"`
+	Project         string `json:"project"`
+	Projectid       string `json:"projectid"`
+	Publicip        string `json:"publicip"`
+	Publicipid      string `json:"publicipid"`
+	Rootdeviceid    int64  `json:"rootdeviceid"`
+	Rootdevicetype  string `json:"rootdevicetype"`
+	Securitygroup   []struct {
+		Account     string `json:"account"`
+		Description string `json:"description"`
+		Domain      string `json:"domain"`
+		Domainid    string `json:"domainid"`
+		Egressrule  []struct {
+			Account           string `json:"account"`
+			Cidr              string `json:"cidr"`
+			Endport           int    `json:"endport"`
+			Icmpcode          int    `json:"icmpcode"`
+			Icmptype          int    `json:"icmptype"`
+			Protocol          string `json:"protocol"`
+			Ruleid            string `json:"ruleid"`
+			Securitygroupname string `json:"securitygroupname"`
+			Startport         int    `json:"startport"`
+			Tags              []struct {
+				Account      string `json:"account"`
+				Customer     string `json:"customer"`
+				Domain       string `json:"domain"`
+				Domainid     string `json:"domainid"`
+				Key          string `json:"key"`
+				Project      string `json:"project"`
+				Projectid    string `json:"projectid"`
+				Resourceid   string `json:"resourceid"`
+				Resourcetype string `json:"resourcetype"`
+				Value        string `json:"value"`
+			} `json:"tags"`
+		} `json:"egressrule"`
+		Id          string `json:"id"`
+		Ingressrule []struct {
+			Account           string `json:"account"`
+			Cidr              string `json:"cidr"`
+			Endport           int    `json:"endport"`
+			Icmpcode          int    `json:"icmpcode"`
+			Icmptype          int    `json:"icmptype"`
+			Protocol          string `json:"protocol"`
+			Ruleid            string `json:"ruleid"`
+			Securitygroupname string `json:"securitygroupname"`
+			Startport         int    `json:"startport"`
+			Tags              []struct {
+				Account      string `json:"account"`
+				Customer     string `json:"customer"`
+				Domain       string `json:"domain"`
+				Domainid     string `json:"domainid"`
+				Key          string `json:"key"`
+				Project      string `json:"project"`
+				Projectid    string `json:"projectid"`
+				Resourceid   string `json:"resourceid"`
+				Resourcetype string `json:"resourcetype"`
+				Value        string `json:"value"`
+			} `json:"tags"`
+		} `json:"ingressrule"`
+		Name      string `json:"name"`
+		Project   string `json:"project"`
+		Projectid string `json:"projectid"`
+		Tags      []struct {
+			Account      string `json:"account"`
+			Customer     string `json:"customer"`
+			Domain       string `json:"domain"`
+			Domainid     string `json:"domainid"`
+			Key          string `json:"key"`
+			Project      string `json:"project"`
+			Projectid    string `json:"projectid"`
+			Resourceid   string `json:"resourceid"`
+			Resourcetype string `json:"resourcetype"`
+			Value        string `json:"value"`
+		} `json:"tags"`
+		Virtualmachinecount int           `json:"virtualmachinecount"`
+		Virtualmachineids   []interface{} `json:"virtualmachineids"`
+	} `json:"securitygroup"`
+	Serviceofferingid   string `json:"serviceofferingid"`
+	Serviceofferingname string `json:"serviceofferingname"`
+	Servicestate        string `json:"servicestate"`
+	State               string `json:"state"`
+	Templatedisplaytext string `json:"templatedisplaytext"`
+	Templateid          string `json:"templateid"`
+	Templatename        string `json:"templatename"`
+	Userid              string `json:"userid"`
+	Username            string `json:"username"`
+	Vgpu                string `json:"vgpu"`
+	Zoneid              string `json:"zoneid"`
+	Zonename            string `json:"zonename"`
+}
diff --git a/vendor/github.com/xanzy/go-cloudstack/cloudstack/VolumeService.go b/vendor/github.com/xanzy/go-cloudstack/cloudstack/VolumeService.go
new file mode 100644
index 0000000..ab96f16
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/cloudstack/VolumeService.go
@@ -0,0 +1,2244 @@
+//
+// Copyright 2018, Sander van Harmelen
+//
+// Licensed 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 cloudstack
+
+import (
+	"encoding/json"
+	"fmt"
+	"net/url"
+	"strconv"
+	"strings"
+)
+
+type AttachVolumeParams struct {
+	p map[string]interface{}
+}
+
+func (p *AttachVolumeParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["deviceid"]; found {
+		vv := strconv.FormatInt(v.(int64), 10)
+		u.Set("deviceid", vv)
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["virtualmachineid"]; found {
+		u.Set("virtualmachineid", v.(string))
+	}
+	return u
+}
+
+func (p *AttachVolumeParams) SetDeviceid(v int64) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["deviceid"] = v
+	return
+}
+
+func (p *AttachVolumeParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *AttachVolumeParams) SetVirtualmachineid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["virtualmachineid"] = v
+	return
+}
+
+// You should always use this function to get a new AttachVolumeParams instance,
+// as then you are sure you have configured all required params
+func (s *VolumeService) NewAttachVolumeParams(id string, virtualmachineid string) *AttachVolumeParams {
+	p := &AttachVolumeParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	p.p["virtualmachineid"] = virtualmachineid
+	return p
+}
+
+// Attaches a disk volume to a virtual machine.
+func (s *VolumeService) AttachVolume(p *AttachVolumeParams) (*AttachVolumeResponse, error) {
+	resp, err := s.cs.newRequest("attachVolume", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r AttachVolumeResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type AttachVolumeResponse struct {
+	JobID                      string `json:"jobid"`
+	Account                    string `json:"account"`
+	Attached                   string `json:"attached"`
+	Chaininfo                  string `json:"chaininfo"`
+	Created                    string `json:"created"`
+	Destroyed                  bool   `json:"destroyed"`
+	Deviceid                   int64  `json:"deviceid"`
+	DiskBytesReadRate          int64  `json:"diskBytesReadRate"`
+	DiskBytesWriteRate         int64  `json:"diskBytesWriteRate"`
+	DiskIopsReadRate           int64  `json:"diskIopsReadRate"`
+	DiskIopsWriteRate          int64  `json:"diskIopsWriteRate"`
+	Diskofferingdisplaytext    string `json:"diskofferingdisplaytext"`
+	Diskofferingid             string `json:"diskofferingid"`
+	Diskofferingname           string `json:"diskofferingname"`
+	Displayvolume              bool   `json:"displayvolume"`
+	Domain                     string `json:"domain"`
+	Domainid                   string `json:"domainid"`
+	Hypervisor                 string `json:"hypervisor"`
+	Id                         string `json:"id"`
+	Isextractable              bool   `json:"isextractable"`
+	Isodisplaytext             string `json:"isodisplaytext"`
+	Isoid                      string `json:"isoid"`
+	Isoname                    string `json:"isoname"`
+	Maxiops                    int64  `json:"maxiops"`
+	Miniops                    int64  `json:"miniops"`
+	Name                       string `json:"name"`
+	Path                       string `json:"path"`
+	Project                    string `json:"project"`
+	Projectid                  string `json:"projectid"`
+	Provisioningtype           string `json:"provisioningtype"`
+	Quiescevm                  bool   `json:"quiescevm"`
+	Serviceofferingdisplaytext string `json:"serviceofferingdisplaytext"`
+	Serviceofferingid          string `json:"serviceofferingid"`
+	Serviceofferingname        string `json:"serviceofferingname"`
+	Size                       int64  `json:"size"`
+	Snapshotid                 string `json:"snapshotid"`
+	State                      string `json:"state"`
+	Status                     string `json:"status"`
+	Storage                    string `json:"storage"`
+	Storageid                  string `json:"storageid"`
+	Storagetype                string `json:"storagetype"`
+	Templatedisplaytext        string `json:"templatedisplaytext"`
+	Templateid                 string `json:"templateid"`
+	Templatename               string `json:"templatename"`
+	Type                       string `json:"type"`
+	Virtualmachineid           string `json:"virtualmachineid"`
+	Vmdisplayname              string `json:"vmdisplayname"`
+	Vmname                     string `json:"vmname"`
+	Vmstate                    string `json:"vmstate"`
+	Zoneid                     string `json:"zoneid"`
+	Zonename                   string `json:"zonename"`
+}
+
+type CreateVolumeParams struct {
+	p map[string]interface{}
+}
+
+func (p *CreateVolumeParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["customid"]; found {
+		u.Set("customid", v.(string))
+	}
+	if v, found := p.p["diskofferingid"]; found {
+		u.Set("diskofferingid", v.(string))
+	}
+	if v, found := p.p["displayvolume"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("displayvolume", vv)
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["maxiops"]; found {
+		vv := strconv.FormatInt(v.(int64), 10)
+		u.Set("maxiops", vv)
+	}
+	if v, found := p.p["miniops"]; found {
+		vv := strconv.FormatInt(v.(int64), 10)
+		u.Set("miniops", vv)
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["projectid"]; found {
+		u.Set("projectid", v.(string))
+	}
+	if v, found := p.p["size"]; found {
+		vv := strconv.FormatInt(v.(int64), 10)
+		u.Set("size", vv)
+	}
+	if v, found := p.p["snapshotid"]; found {
+		u.Set("snapshotid", v.(string))
+	}
+	if v, found := p.p["virtualmachineid"]; found {
+		u.Set("virtualmachineid", v.(string))
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *CreateVolumeParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *CreateVolumeParams) SetCustomid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["customid"] = v
+	return
+}
+
+func (p *CreateVolumeParams) SetDiskofferingid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["diskofferingid"] = v
+	return
+}
+
+func (p *CreateVolumeParams) SetDisplayvolume(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["displayvolume"] = v
+	return
+}
+
+func (p *CreateVolumeParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *CreateVolumeParams) SetMaxiops(v int64) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["maxiops"] = v
+	return
+}
+
+func (p *CreateVolumeParams) SetMiniops(v int64) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["miniops"] = v
+	return
+}
+
+func (p *CreateVolumeParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *CreateVolumeParams) SetProjectid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectid"] = v
+	return
+}
+
+func (p *CreateVolumeParams) SetSize(v int64) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["size"] = v
+	return
+}
+
+func (p *CreateVolumeParams) SetSnapshotid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["snapshotid"] = v
+	return
+}
+
+func (p *CreateVolumeParams) SetVirtualmachineid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["virtualmachineid"] = v
+	return
+}
+
+func (p *CreateVolumeParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new CreateVolumeParams instance,
+// as then you are sure you have configured all required params
+func (s *VolumeService) NewCreateVolumeParams() *CreateVolumeParams {
+	p := &CreateVolumeParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// Creates a disk volume from a disk offering. This disk volume must still be attached to a virtual machine to make use of it.
+func (s *VolumeService) CreateVolume(p *CreateVolumeParams) (*CreateVolumeResponse, error) {
+	resp, err := s.cs.newRequest("createVolume", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r CreateVolumeResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type CreateVolumeResponse struct {
+	JobID                      string `json:"jobid"`
+	Account                    string `json:"account"`
+	Attached                   string `json:"attached"`
+	Chaininfo                  string `json:"chaininfo"`
+	Created                    string `json:"created"`
+	Destroyed                  bool   `json:"destroyed"`
+	Deviceid                   int64  `json:"deviceid"`
+	DiskBytesReadRate          int64  `json:"diskBytesReadRate"`
+	DiskBytesWriteRate         int64  `json:"diskBytesWriteRate"`
+	DiskIopsReadRate           int64  `json:"diskIopsReadRate"`
+	DiskIopsWriteRate          int64  `json:"diskIopsWriteRate"`
+	Diskofferingdisplaytext    string `json:"diskofferingdisplaytext"`
+	Diskofferingid             string `json:"diskofferingid"`
+	Diskofferingname           string `json:"diskofferingname"`
+	Displayvolume              bool   `json:"displayvolume"`
+	Domain                     string `json:"domain"`
+	Domainid                   string `json:"domainid"`
+	Hypervisor                 string `json:"hypervisor"`
+	Id                         string `json:"id"`
+	Isextractable              bool   `json:"isextractable"`
+	Isodisplaytext             string `json:"isodisplaytext"`
+	Isoid                      string `json:"isoid"`
+	Isoname                    string `json:"isoname"`
+	Maxiops                    int64  `json:"maxiops"`
+	Miniops                    int64  `json:"miniops"`
+	Name                       string `json:"name"`
+	Path                       string `json:"path"`
+	Project                    string `json:"project"`
+	Projectid                  string `json:"projectid"`
+	Provisioningtype           string `json:"provisioningtype"`
+	Quiescevm                  bool   `json:"quiescevm"`
+	Serviceofferingdisplaytext string `json:"serviceofferingdisplaytext"`
+	Serviceofferingid          string `json:"serviceofferingid"`
+	Serviceofferingname        string `json:"serviceofferingname"`
+	Size                       int64  `json:"size"`
+	Snapshotid                 string `json:"snapshotid"`
+	State                      string `json:"state"`
+	Status                     string `json:"status"`
+	Storage                    string `json:"storage"`
+	Storageid                  string `json:"storageid"`
+	Storagetype                string `json:"storagetype"`
+	Templatedisplaytext        string `json:"templatedisplaytext"`
+	Templateid                 string `json:"templateid"`
+	Templatename               string `json:"templatename"`
+	Type                       string `json:"type"`
+	Virtualmachineid           string `json:"virtualmachineid"`
+	Vmdisplayname              string `json:"vmdisplayname"`
+	Vmname                     string `json:"vmname"`
+	Vmstate                    string `json:"vmstate"`
+	Zoneid                     string `json:"zoneid"`
+	Zonename                   string `json:"zonename"`
+}
+
+type DeleteVolumeParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeleteVolumeParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *DeleteVolumeParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new DeleteVolumeParams instance,
+// as then you are sure you have configured all required params
+func (s *VolumeService) NewDeleteVolumeParams(id string) *DeleteVolumeParams {
+	p := &DeleteVolumeParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Deletes a detached disk volume.
+func (s *VolumeService) DeleteVolume(p *DeleteVolumeParams) (*DeleteVolumeResponse, error) {
+	resp, err := s.cs.newRequest("deleteVolume", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeleteVolumeResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type DeleteVolumeResponse struct {
+	Displaytext string `json:"displaytext"`
+	Success     string `json:"success"`
+}
+
+type DetachVolumeParams struct {
+	p map[string]interface{}
+}
+
+func (p *DetachVolumeParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["deviceid"]; found {
+		vv := strconv.FormatInt(v.(int64), 10)
+		u.Set("deviceid", vv)
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["virtualmachineid"]; found {
+		u.Set("virtualmachineid", v.(string))
+	}
+	return u
+}
+
+func (p *DetachVolumeParams) SetDeviceid(v int64) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["deviceid"] = v
+	return
+}
+
+func (p *DetachVolumeParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *DetachVolumeParams) SetVirtualmachineid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["virtualmachineid"] = v
+	return
+}
+
+// You should always use this function to get a new DetachVolumeParams instance,
+// as then you are sure you have configured all required params
+func (s *VolumeService) NewDetachVolumeParams() *DetachVolumeParams {
+	p := &DetachVolumeParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// Detaches a disk volume from a virtual machine.
+func (s *VolumeService) DetachVolume(p *DetachVolumeParams) (*DetachVolumeResponse, error) {
+	resp, err := s.cs.newRequest("detachVolume", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DetachVolumeResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type DetachVolumeResponse struct {
+	JobID                      string `json:"jobid"`
+	Account                    string `json:"account"`
+	Attached                   string `json:"attached"`
+	Chaininfo                  string `json:"chaininfo"`
+	Created                    string `json:"created"`
+	Destroyed                  bool   `json:"destroyed"`
+	Deviceid                   int64  `json:"deviceid"`
+	DiskBytesReadRate          int64  `json:"diskBytesReadRate"`
+	DiskBytesWriteRate         int64  `json:"diskBytesWriteRate"`
+	DiskIopsReadRate           int64  `json:"diskIopsReadRate"`
+	DiskIopsWriteRate          int64  `json:"diskIopsWriteRate"`
+	Diskofferingdisplaytext    string `json:"diskofferingdisplaytext"`
+	Diskofferingid             string `json:"diskofferingid"`
+	Diskofferingname           string `json:"diskofferingname"`
+	Displayvolume              bool   `json:"displayvolume"`
+	Domain                     string `json:"domain"`
+	Domainid                   string `json:"domainid"`
+	Hypervisor                 string `json:"hypervisor"`
+	Id                         string `json:"id"`
+	Isextractable              bool   `json:"isextractable"`
+	Isodisplaytext             string `json:"isodisplaytext"`
+	Isoid                      string `json:"isoid"`
+	Isoname                    string `json:"isoname"`
+	Maxiops                    int64  `json:"maxiops"`
+	Miniops                    int64  `json:"miniops"`
+	Name                       string `json:"name"`
+	Path                       string `json:"path"`
+	Project                    string `json:"project"`
+	Projectid                  string `json:"projectid"`
+	Provisioningtype           string `json:"provisioningtype"`
+	Quiescevm                  bool   `json:"quiescevm"`
+	Serviceofferingdisplaytext string `json:"serviceofferingdisplaytext"`
+	Serviceofferingid          string `json:"serviceofferingid"`
+	Serviceofferingname        string `json:"serviceofferingname"`
+	Size                       int64  `json:"size"`
+	Snapshotid                 string `json:"snapshotid"`
+	State                      string `json:"state"`
+	Status                     string `json:"status"`
+	Storage                    string `json:"storage"`
+	Storageid                  string `json:"storageid"`
+	Storagetype                string `json:"storagetype"`
+	Templatedisplaytext        string `json:"templatedisplaytext"`
+	Templateid                 string `json:"templateid"`
+	Templatename               string `json:"templatename"`
+	Type                       string `json:"type"`
+	Virtualmachineid           string `json:"virtualmachineid"`
+	Vmdisplayname              string `json:"vmdisplayname"`
+	Vmname                     string `json:"vmname"`
+	Vmstate                    string `json:"vmstate"`
+	Zoneid                     string `json:"zoneid"`
+	Zonename                   string `json:"zonename"`
+}
+
+type ExtractVolumeParams struct {
+	p map[string]interface{}
+}
+
+func (p *ExtractVolumeParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["mode"]; found {
+		u.Set("mode", v.(string))
+	}
+	if v, found := p.p["url"]; found {
+		u.Set("url", v.(string))
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *ExtractVolumeParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ExtractVolumeParams) SetMode(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["mode"] = v
+	return
+}
+
+func (p *ExtractVolumeParams) SetUrl(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["url"] = v
+	return
+}
+
+func (p *ExtractVolumeParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new ExtractVolumeParams instance,
+// as then you are sure you have configured all required params
+func (s *VolumeService) NewExtractVolumeParams(id string, mode string, zoneid string) *ExtractVolumeParams {
+	p := &ExtractVolumeParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	p.p["mode"] = mode
+	p.p["zoneid"] = zoneid
+	return p
+}
+
+// Extracts volume
+func (s *VolumeService) ExtractVolume(p *ExtractVolumeParams) (*ExtractVolumeResponse, error) {
+	resp, err := s.cs.newRequest("extractVolume", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ExtractVolumeResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type ExtractVolumeResponse struct {
+	JobID            string `json:"jobid"`
+	Accountid        string `json:"accountid"`
+	Created          string `json:"created"`
+	ExtractId        string `json:"extractId"`
+	ExtractMode      string `json:"extractMode"`
+	Id               string `json:"id"`
+	Name             string `json:"name"`
+	Resultstring     string `json:"resultstring"`
+	State            string `json:"state"`
+	Status           string `json:"status"`
+	Storagetype      string `json:"storagetype"`
+	Uploadpercentage int    `json:"uploadpercentage"`
+	Url              string `json:"url"`
+	Zoneid           string `json:"zoneid"`
+	Zonename         string `json:"zonename"`
+}
+
+type GetPathForVolumeParams struct {
+	p map[string]interface{}
+}
+
+func (p *GetPathForVolumeParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["volumeid"]; found {
+		u.Set("volumeid", v.(string))
+	}
+	return u
+}
+
+func (p *GetPathForVolumeParams) SetVolumeid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["volumeid"] = v
+	return
+}
+
+// You should always use this function to get a new GetPathForVolumeParams instance,
+// as then you are sure you have configured all required params
+func (s *VolumeService) NewGetPathForVolumeParams(volumeid string) *GetPathForVolumeParams {
+	p := &GetPathForVolumeParams{}
+	p.p = make(map[string]interface{})
+	p.p["volumeid"] = volumeid
+	return p
+}
+
+// Get the path associated with the provided volume UUID
+func (s *VolumeService) GetPathForVolume(p *GetPathForVolumeParams) (*GetPathForVolumeResponse, error) {
+	resp, err := s.cs.newRequest("getPathForVolume", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r GetPathForVolumeResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type GetPathForVolumeResponse struct {
+	Path string `json:"path"`
+}
+
+type GetSolidFireVolumeAccessGroupIdParams struct {
+	p map[string]interface{}
+}
+
+func (p *GetSolidFireVolumeAccessGroupIdParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["clusterid"]; found {
+		u.Set("clusterid", v.(string))
+	}
+	if v, found := p.p["storageid"]; found {
+		u.Set("storageid", v.(string))
+	}
+	return u
+}
+
+func (p *GetSolidFireVolumeAccessGroupIdParams) SetClusterid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["clusterid"] = v
+	return
+}
+
+func (p *GetSolidFireVolumeAccessGroupIdParams) SetStorageid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["storageid"] = v
+	return
+}
+
+// You should always use this function to get a new GetSolidFireVolumeAccessGroupIdParams instance,
+// as then you are sure you have configured all required params
+func (s *VolumeService) NewGetSolidFireVolumeAccessGroupIdParams(clusterid string, storageid string) *GetSolidFireVolumeAccessGroupIdParams {
+	p := &GetSolidFireVolumeAccessGroupIdParams{}
+	p.p = make(map[string]interface{})
+	p.p["clusterid"] = clusterid
+	p.p["storageid"] = storageid
+	return p
+}
+
+// Get the SF Volume Access Group ID
+func (s *VolumeService) GetSolidFireVolumeAccessGroupId(p *GetSolidFireVolumeAccessGroupIdParams) (*GetSolidFireVolumeAccessGroupIdResponse, error) {
+	resp, err := s.cs.newRequest("getSolidFireVolumeAccessGroupId", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r GetSolidFireVolumeAccessGroupIdResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type GetSolidFireVolumeAccessGroupIdResponse struct {
+	SolidFireVolumeAccessGroupId int64 `json:"solidFireVolumeAccessGroupId"`
+}
+
+type GetSolidFireVolumeSizeParams struct {
+	p map[string]interface{}
+}
+
+func (p *GetSolidFireVolumeSizeParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["volumeid"]; found {
+		u.Set("volumeid", v.(string))
+	}
+	return u
+}
+
+func (p *GetSolidFireVolumeSizeParams) SetVolumeid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["volumeid"] = v
+	return
+}
+
+// You should always use this function to get a new GetSolidFireVolumeSizeParams instance,
+// as then you are sure you have configured all required params
+func (s *VolumeService) NewGetSolidFireVolumeSizeParams(volumeid string) *GetSolidFireVolumeSizeParams {
+	p := &GetSolidFireVolumeSizeParams{}
+	p.p = make(map[string]interface{})
+	p.p["volumeid"] = volumeid
+	return p
+}
+
+// Get the SF volume size including Hypervisor Snapshot Reserve
+func (s *VolumeService) GetSolidFireVolumeSize(p *GetSolidFireVolumeSizeParams) (*GetSolidFireVolumeSizeResponse, error) {
+	resp, err := s.cs.newRequest("getSolidFireVolumeSize", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r GetSolidFireVolumeSizeResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type GetSolidFireVolumeSizeResponse struct {
+	SolidFireVolumeSize int64 `json:"solidFireVolumeSize"`
+}
+
+type GetUploadParamsForVolumeParams struct {
+	p map[string]interface{}
+}
+
+func (p *GetUploadParamsForVolumeParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["checksum"]; found {
+		u.Set("checksum", v.(string))
+	}
+	if v, found := p.p["diskofferingid"]; found {
+		u.Set("diskofferingid", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["format"]; found {
+		u.Set("format", v.(string))
+	}
+	if v, found := p.p["imagestoreuuid"]; found {
+		u.Set("imagestoreuuid", v.(string))
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["projectid"]; found {
+		u.Set("projectid", v.(string))
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *GetUploadParamsForVolumeParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *GetUploadParamsForVolumeParams) SetChecksum(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["checksum"] = v
+	return
+}
+
+func (p *GetUploadParamsForVolumeParams) SetDiskofferingid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["diskofferingid"] = v
+	return
+}
+
+func (p *GetUploadParamsForVolumeParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *GetUploadParamsForVolumeParams) SetFormat(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["format"] = v
+	return
+}
+
+func (p *GetUploadParamsForVolumeParams) SetImagestoreuuid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["imagestoreuuid"] = v
+	return
+}
+
+func (p *GetUploadParamsForVolumeParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *GetUploadParamsForVolumeParams) SetProjectid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectid"] = v
+	return
+}
+
+func (p *GetUploadParamsForVolumeParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new GetUploadParamsForVolumeParams instance,
+// as then you are sure you have configured all required params
+func (s *VolumeService) NewGetUploadParamsForVolumeParams(format string, name string, zoneid string) *GetUploadParamsForVolumeParams {
+	p := &GetUploadParamsForVolumeParams{}
+	p.p = make(map[string]interface{})
+	p.p["format"] = format
+	p.p["name"] = name
+	p.p["zoneid"] = zoneid
+	return p
+}
+
+// Upload a data disk to the cloudstack cloud.
+func (s *VolumeService) GetUploadParamsForVolume(p *GetUploadParamsForVolumeParams) (*GetUploadParamsForVolumeResponse, error) {
+	resp, err := s.cs.newRequest("getUploadParamsForVolume", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r GetUploadParamsForVolumeResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type GetUploadParamsForVolumeResponse struct {
+	Expires   string `json:"expires"`
+	Id        string `json:"id"`
+	Metadata  string `json:"metadata"`
+	PostURL   string `json:"postURL"`
+	Signature string `json:"signature"`
+}
+
+type GetVolumeiScsiNameParams struct {
+	p map[string]interface{}
+}
+
+func (p *GetVolumeiScsiNameParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["volumeid"]; found {
+		u.Set("volumeid", v.(string))
+	}
+	return u
+}
+
+func (p *GetVolumeiScsiNameParams) SetVolumeid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["volumeid"] = v
+	return
+}
+
+// You should always use this function to get a new GetVolumeiScsiNameParams instance,
+// as then you are sure you have configured all required params
+func (s *VolumeService) NewGetVolumeiScsiNameParams(volumeid string) *GetVolumeiScsiNameParams {
+	p := &GetVolumeiScsiNameParams{}
+	p.p = make(map[string]interface{})
+	p.p["volumeid"] = volumeid
+	return p
+}
+
+// Get Volume's iSCSI Name
+func (s *VolumeService) GetVolumeiScsiName(p *GetVolumeiScsiNameParams) (*GetVolumeiScsiNameResponse, error) {
+	resp, err := s.cs.newRequest("getVolumeiScsiName", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r GetVolumeiScsiNameResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type GetVolumeiScsiNameResponse struct {
+	VolumeiScsiName string `json:"volumeiScsiName"`
+}
+
+type ListVolumesParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListVolumesParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["diskofferingid"]; found {
+		u.Set("diskofferingid", v.(string))
+	}
+	if v, found := p.p["displayvolume"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("displayvolume", vv)
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["hostid"]; found {
+		u.Set("hostid", v.(string))
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["ids"]; found {
+		vv := strings.Join(v.([]string), ",")
+		u.Set("ids", vv)
+	}
+	if v, found := p.p["isrecursive"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("isrecursive", vv)
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["listall"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("listall", vv)
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["podid"]; found {
+		u.Set("podid", v.(string))
+	}
+	if v, found := p.p["projectid"]; found {
+		u.Set("projectid", v.(string))
+	}
+	if v, found := p.p["storageid"]; found {
+		u.Set("storageid", v.(string))
+	}
+	if v, found := p.p["tags"]; found {
+		i := 0
+		for k, vv := range v.(map[string]string) {
+			u.Set(fmt.Sprintf("tags[%d].key", i), k)
+			u.Set(fmt.Sprintf("tags[%d].value", i), vv)
+			i++
+		}
+	}
+	if v, found := p.p["type"]; found {
+		u.Set("type", v.(string))
+	}
+	if v, found := p.p["virtualmachineid"]; found {
+		u.Set("virtualmachineid", v.(string))
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *ListVolumesParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *ListVolumesParams) SetDiskofferingid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["diskofferingid"] = v
+	return
+}
+
+func (p *ListVolumesParams) SetDisplayvolume(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["displayvolume"] = v
+	return
+}
+
+func (p *ListVolumesParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *ListVolumesParams) SetHostid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["hostid"] = v
+	return
+}
+
+func (p *ListVolumesParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ListVolumesParams) SetIds(v []string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["ids"] = v
+	return
+}
+
+func (p *ListVolumesParams) SetIsrecursive(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["isrecursive"] = v
+	return
+}
+
+func (p *ListVolumesParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListVolumesParams) SetListall(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["listall"] = v
+	return
+}
+
+func (p *ListVolumesParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *ListVolumesParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListVolumesParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListVolumesParams) SetPodid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["podid"] = v
+	return
+}
+
+func (p *ListVolumesParams) SetProjectid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectid"] = v
+	return
+}
+
+func (p *ListVolumesParams) SetStorageid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["storageid"] = v
+	return
+}
+
+func (p *ListVolumesParams) SetTags(v map[string]string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["tags"] = v
+	return
+}
+
+func (p *ListVolumesParams) SetType(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["type"] = v
+	return
+}
+
+func (p *ListVolumesParams) SetVirtualmachineid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["virtualmachineid"] = v
+	return
+}
+
+func (p *ListVolumesParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new ListVolumesParams instance,
+// as then you are sure you have configured all required params
+func (s *VolumeService) NewListVolumesParams() *ListVolumesParams {
+	p := &ListVolumesParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *VolumeService) GetVolumeID(name string, opts ...OptionFunc) (string, int, error) {
+	p := &ListVolumesParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["name"] = name
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return "", -1, err
+		}
+	}
+
+	l, err := s.ListVolumes(p)
+	if err != nil {
+		return "", -1, err
+	}
+
+	if l.Count == 0 {
+		return "", l.Count, fmt.Errorf("No match found for %s: %+v", name, l)
+	}
+
+	if l.Count == 1 {
+		return l.Volumes[0].Id, l.Count, nil
+	}
+
+	if l.Count > 1 {
+		for _, v := range l.Volumes {
+			if v.Name == name {
+				return v.Id, l.Count, nil
+			}
+		}
+	}
+	return "", l.Count, fmt.Errorf("Could not find an exact match for %s: %+v", name, l)
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *VolumeService) GetVolumeByName(name string, opts ...OptionFunc) (*Volume, int, error) {
+	id, count, err := s.GetVolumeID(name, opts...)
+	if err != nil {
+		return nil, count, err
+	}
+
+	r, count, err := s.GetVolumeByID(id, opts...)
+	if err != nil {
+		return nil, count, err
+	}
+	return r, count, nil
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *VolumeService) GetVolumeByID(id string, opts ...OptionFunc) (*Volume, int, error) {
+	p := &ListVolumesParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["id"] = id
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return nil, -1, err
+		}
+	}
+
+	l, err := s.ListVolumes(p)
+	if err != nil {
+		if strings.Contains(err.Error(), fmt.Sprintf(
+			"Invalid parameter id value=%s due to incorrect long value format, "+
+				"or entity does not exist", id)) {
+			return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
+		}
+		return nil, -1, err
+	}
+
+	if l.Count == 0 {
+		return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
+	}
+
+	if l.Count == 1 {
+		return l.Volumes[0], l.Count, nil
+	}
+	return nil, l.Count, fmt.Errorf("There is more then one result for Volume UUID: %s!", id)
+}
+
+// Lists all volumes.
+func (s *VolumeService) ListVolumes(p *ListVolumesParams) (*ListVolumesResponse, error) {
+	resp, err := s.cs.newRequest("listVolumes", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListVolumesResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListVolumesResponse struct {
+	Count   int       `json:"count"`
+	Volumes []*Volume `json:"volume"`
+}
+
+type Volume struct {
+	Account                    string `json:"account"`
+	Attached                   string `json:"attached"`
+	Chaininfo                  string `json:"chaininfo"`
+	Created                    string `json:"created"`
+	Destroyed                  bool   `json:"destroyed"`
+	Deviceid                   int64  `json:"deviceid"`
+	DiskBytesReadRate          int64  `json:"diskBytesReadRate"`
+	DiskBytesWriteRate         int64  `json:"diskBytesWriteRate"`
+	DiskIopsReadRate           int64  `json:"diskIopsReadRate"`
+	DiskIopsWriteRate          int64  `json:"diskIopsWriteRate"`
+	Diskofferingdisplaytext    string `json:"diskofferingdisplaytext"`
+	Diskofferingid             string `json:"diskofferingid"`
+	Diskofferingname           string `json:"diskofferingname"`
+	Displayvolume              bool   `json:"displayvolume"`
+	Domain                     string `json:"domain"`
+	Domainid                   string `json:"domainid"`
+	Hypervisor                 string `json:"hypervisor"`
+	Id                         string `json:"id"`
+	Isextractable              bool   `json:"isextractable"`
+	Isodisplaytext             string `json:"isodisplaytext"`
+	Isoid                      string `json:"isoid"`
+	Isoname                    string `json:"isoname"`
+	Maxiops                    int64  `json:"maxiops"`
+	Miniops                    int64  `json:"miniops"`
+	Name                       string `json:"name"`
+	Path                       string `json:"path"`
+	Project                    string `json:"project"`
+	Projectid                  string `json:"projectid"`
+	Provisioningtype           string `json:"provisioningtype"`
+	Quiescevm                  bool   `json:"quiescevm"`
+	Serviceofferingdisplaytext string `json:"serviceofferingdisplaytext"`
+	Serviceofferingid          string `json:"serviceofferingid"`
+	Serviceofferingname        string `json:"serviceofferingname"`
+	Size                       int64  `json:"size"`
+	Snapshotid                 string `json:"snapshotid"`
+	State                      string `json:"state"`
+	Status                     string `json:"status"`
+	Storage                    string `json:"storage"`
+	Storageid                  string `json:"storageid"`
+	Storagetype                string `json:"storagetype"`
+	Templatedisplaytext        string `json:"templatedisplaytext"`
+	Templateid                 string `json:"templateid"`
+	Templatename               string `json:"templatename"`
+	Type                       string `json:"type"`
+	Virtualmachineid           string `json:"virtualmachineid"`
+	Vmdisplayname              string `json:"vmdisplayname"`
+	Vmname                     string `json:"vmname"`
+	Vmstate                    string `json:"vmstate"`
+	Zoneid                     string `json:"zoneid"`
+	Zonename                   string `json:"zonename"`
+}
+
+type MigrateVolumeParams struct {
+	p map[string]interface{}
+}
+
+func (p *MigrateVolumeParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["livemigrate"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("livemigrate", vv)
+	}
+	if v, found := p.p["storageid"]; found {
+		u.Set("storageid", v.(string))
+	}
+	if v, found := p.p["volumeid"]; found {
+		u.Set("volumeid", v.(string))
+	}
+	return u
+}
+
+func (p *MigrateVolumeParams) SetLivemigrate(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["livemigrate"] = v
+	return
+}
+
+func (p *MigrateVolumeParams) SetStorageid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["storageid"] = v
+	return
+}
+
+func (p *MigrateVolumeParams) SetVolumeid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["volumeid"] = v
+	return
+}
+
+// You should always use this function to get a new MigrateVolumeParams instance,
+// as then you are sure you have configured all required params
+func (s *VolumeService) NewMigrateVolumeParams(storageid string, volumeid string) *MigrateVolumeParams {
+	p := &MigrateVolumeParams{}
+	p.p = make(map[string]interface{})
+	p.p["storageid"] = storageid
+	p.p["volumeid"] = volumeid
+	return p
+}
+
+// Migrate volume
+func (s *VolumeService) MigrateVolume(p *MigrateVolumeParams) (*MigrateVolumeResponse, error) {
+	resp, err := s.cs.newRequest("migrateVolume", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r MigrateVolumeResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type MigrateVolumeResponse struct {
+	JobID                      string `json:"jobid"`
+	Account                    string `json:"account"`
+	Attached                   string `json:"attached"`
+	Chaininfo                  string `json:"chaininfo"`
+	Created                    string `json:"created"`
+	Destroyed                  bool   `json:"destroyed"`
+	Deviceid                   int64  `json:"deviceid"`
+	DiskBytesReadRate          int64  `json:"diskBytesReadRate"`
+	DiskBytesWriteRate         int64  `json:"diskBytesWriteRate"`
+	DiskIopsReadRate           int64  `json:"diskIopsReadRate"`
+	DiskIopsWriteRate          int64  `json:"diskIopsWriteRate"`
+	Diskofferingdisplaytext    string `json:"diskofferingdisplaytext"`
+	Diskofferingid             string `json:"diskofferingid"`
+	Diskofferingname           string `json:"diskofferingname"`
+	Displayvolume              bool   `json:"displayvolume"`
+	Domain                     string `json:"domain"`
+	Domainid                   string `json:"domainid"`
+	Hypervisor                 string `json:"hypervisor"`
+	Id                         string `json:"id"`
+	Isextractable              bool   `json:"isextractable"`
+	Isodisplaytext             string `json:"isodisplaytext"`
+	Isoid                      string `json:"isoid"`
+	Isoname                    string `json:"isoname"`
+	Maxiops                    int64  `json:"maxiops"`
+	Miniops                    int64  `json:"miniops"`
+	Name                       string `json:"name"`
+	Path                       string `json:"path"`
+	Project                    string `json:"project"`
+	Projectid                  string `json:"projectid"`
+	Provisioningtype           string `json:"provisioningtype"`
+	Quiescevm                  bool   `json:"quiescevm"`
+	Serviceofferingdisplaytext string `json:"serviceofferingdisplaytext"`
+	Serviceofferingid          string `json:"serviceofferingid"`
+	Serviceofferingname        string `json:"serviceofferingname"`
+	Size                       int64  `json:"size"`
+	Snapshotid                 string `json:"snapshotid"`
+	State                      string `json:"state"`
+	Status                     string `json:"status"`
+	Storage                    string `json:"storage"`
+	Storageid                  string `json:"storageid"`
+	Storagetype                string `json:"storagetype"`
+	Templatedisplaytext        string `json:"templatedisplaytext"`
+	Templateid                 string `json:"templateid"`
+	Templatename               string `json:"templatename"`
+	Type                       string `json:"type"`
+	Virtualmachineid           string `json:"virtualmachineid"`
+	Vmdisplayname              string `json:"vmdisplayname"`
+	Vmname                     string `json:"vmname"`
+	Vmstate                    string `json:"vmstate"`
+	Zoneid                     string `json:"zoneid"`
+	Zonename                   string `json:"zonename"`
+}
+
+type ResizeVolumeParams struct {
+	p map[string]interface{}
+}
+
+func (p *ResizeVolumeParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["diskofferingid"]; found {
+		u.Set("diskofferingid", v.(string))
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["maxiops"]; found {
+		vv := strconv.FormatInt(v.(int64), 10)
+		u.Set("maxiops", vv)
+	}
+	if v, found := p.p["miniops"]; found {
+		vv := strconv.FormatInt(v.(int64), 10)
+		u.Set("miniops", vv)
+	}
+	if v, found := p.p["shrinkok"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("shrinkok", vv)
+	}
+	if v, found := p.p["size"]; found {
+		vv := strconv.FormatInt(v.(int64), 10)
+		u.Set("size", vv)
+	}
+	return u
+}
+
+func (p *ResizeVolumeParams) SetDiskofferingid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["diskofferingid"] = v
+	return
+}
+
+func (p *ResizeVolumeParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ResizeVolumeParams) SetMaxiops(v int64) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["maxiops"] = v
+	return
+}
+
+func (p *ResizeVolumeParams) SetMiniops(v int64) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["miniops"] = v
+	return
+}
+
+func (p *ResizeVolumeParams) SetShrinkok(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["shrinkok"] = v
+	return
+}
+
+func (p *ResizeVolumeParams) SetSize(v int64) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["size"] = v
+	return
+}
+
+// You should always use this function to get a new ResizeVolumeParams instance,
+// as then you are sure you have configured all required params
+func (s *VolumeService) NewResizeVolumeParams(id string) *ResizeVolumeParams {
+	p := &ResizeVolumeParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Resizes a volume
+func (s *VolumeService) ResizeVolume(p *ResizeVolumeParams) (*ResizeVolumeResponse, error) {
+	resp, err := s.cs.newRequest("resizeVolume", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ResizeVolumeResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type ResizeVolumeResponse struct {
+	JobID                      string `json:"jobid"`
+	Account                    string `json:"account"`
+	Attached                   string `json:"attached"`
+	Chaininfo                  string `json:"chaininfo"`
+	Created                    string `json:"created"`
+	Destroyed                  bool   `json:"destroyed"`
+	Deviceid                   int64  `json:"deviceid"`
+	DiskBytesReadRate          int64  `json:"diskBytesReadRate"`
+	DiskBytesWriteRate         int64  `json:"diskBytesWriteRate"`
+	DiskIopsReadRate           int64  `json:"diskIopsReadRate"`
+	DiskIopsWriteRate          int64  `json:"diskIopsWriteRate"`
+	Diskofferingdisplaytext    string `json:"diskofferingdisplaytext"`
+	Diskofferingid             string `json:"diskofferingid"`
+	Diskofferingname           string `json:"diskofferingname"`
+	Displayvolume              bool   `json:"displayvolume"`
+	Domain                     string `json:"domain"`
+	Domainid                   string `json:"domainid"`
+	Hypervisor                 string `json:"hypervisor"`
+	Id                         string `json:"id"`
+	Isextractable              bool   `json:"isextractable"`
+	Isodisplaytext             string `json:"isodisplaytext"`
+	Isoid                      string `json:"isoid"`
+	Isoname                    string `json:"isoname"`
+	Maxiops                    int64  `json:"maxiops"`
+	Miniops                    int64  `json:"miniops"`
+	Name                       string `json:"name"`
+	Path                       string `json:"path"`
+	Project                    string `json:"project"`
+	Projectid                  string `json:"projectid"`
+	Provisioningtype           string `json:"provisioningtype"`
+	Quiescevm                  bool   `json:"quiescevm"`
+	Serviceofferingdisplaytext string `json:"serviceofferingdisplaytext"`
+	Serviceofferingid          string `json:"serviceofferingid"`
+	Serviceofferingname        string `json:"serviceofferingname"`
+	Size                       int64  `json:"size"`
+	Snapshotid                 string `json:"snapshotid"`
+	State                      string `json:"state"`
+	Status                     string `json:"status"`
+	Storage                    string `json:"storage"`
+	Storageid                  string `json:"storageid"`
+	Storagetype                string `json:"storagetype"`
+	Templatedisplaytext        string `json:"templatedisplaytext"`
+	Templateid                 string `json:"templateid"`
+	Templatename               string `json:"templatename"`
+	Type                       string `json:"type"`
+	Virtualmachineid           string `json:"virtualmachineid"`
+	Vmdisplayname              string `json:"vmdisplayname"`
+	Vmname                     string `json:"vmname"`
+	Vmstate                    string `json:"vmstate"`
+	Zoneid                     string `json:"zoneid"`
+	Zonename                   string `json:"zonename"`
+}
+
+type UpdateVolumeParams struct {
+	p map[string]interface{}
+}
+
+func (p *UpdateVolumeParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["chaininfo"]; found {
+		u.Set("chaininfo", v.(string))
+	}
+	if v, found := p.p["customid"]; found {
+		u.Set("customid", v.(string))
+	}
+	if v, found := p.p["displayvolume"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("displayvolume", vv)
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["path"]; found {
+		u.Set("path", v.(string))
+	}
+	if v, found := p.p["state"]; found {
+		u.Set("state", v.(string))
+	}
+	if v, found := p.p["storageid"]; found {
+		u.Set("storageid", v.(string))
+	}
+	return u
+}
+
+func (p *UpdateVolumeParams) SetChaininfo(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["chaininfo"] = v
+	return
+}
+
+func (p *UpdateVolumeParams) SetCustomid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["customid"] = v
+	return
+}
+
+func (p *UpdateVolumeParams) SetDisplayvolume(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["displayvolume"] = v
+	return
+}
+
+func (p *UpdateVolumeParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *UpdateVolumeParams) SetPath(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["path"] = v
+	return
+}
+
+func (p *UpdateVolumeParams) SetState(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["state"] = v
+	return
+}
+
+func (p *UpdateVolumeParams) SetStorageid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["storageid"] = v
+	return
+}
+
+// You should always use this function to get a new UpdateVolumeParams instance,
+// as then you are sure you have configured all required params
+func (s *VolumeService) NewUpdateVolumeParams() *UpdateVolumeParams {
+	p := &UpdateVolumeParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// Updates the volume.
+func (s *VolumeService) UpdateVolume(p *UpdateVolumeParams) (*UpdateVolumeResponse, error) {
+	resp, err := s.cs.newRequest("updateVolume", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r UpdateVolumeResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type UpdateVolumeResponse struct {
+	JobID                      string `json:"jobid"`
+	Account                    string `json:"account"`
+	Attached                   string `json:"attached"`
+	Chaininfo                  string `json:"chaininfo"`
+	Created                    string `json:"created"`
+	Destroyed                  bool   `json:"destroyed"`
+	Deviceid                   int64  `json:"deviceid"`
+	DiskBytesReadRate          int64  `json:"diskBytesReadRate"`
+	DiskBytesWriteRate         int64  `json:"diskBytesWriteRate"`
+	DiskIopsReadRate           int64  `json:"diskIopsReadRate"`
+	DiskIopsWriteRate          int64  `json:"diskIopsWriteRate"`
+	Diskofferingdisplaytext    string `json:"diskofferingdisplaytext"`
+	Diskofferingid             string `json:"diskofferingid"`
+	Diskofferingname           string `json:"diskofferingname"`
+	Displayvolume              bool   `json:"displayvolume"`
+	Domain                     string `json:"domain"`
+	Domainid                   string `json:"domainid"`
+	Hypervisor                 string `json:"hypervisor"`
+	Id                         string `json:"id"`
+	Isextractable              bool   `json:"isextractable"`
+	Isodisplaytext             string `json:"isodisplaytext"`
+	Isoid                      string `json:"isoid"`
+	Isoname                    string `json:"isoname"`
+	Maxiops                    int64  `json:"maxiops"`
+	Miniops                    int64  `json:"miniops"`
+	Name                       string `json:"name"`
+	Path                       string `json:"path"`
+	Project                    string `json:"project"`
+	Projectid                  string `json:"projectid"`
+	Provisioningtype           string `json:"provisioningtype"`
+	Quiescevm                  bool   `json:"quiescevm"`
+	Serviceofferingdisplaytext string `json:"serviceofferingdisplaytext"`
+	Serviceofferingid          string `json:"serviceofferingid"`
+	Serviceofferingname        string `json:"serviceofferingname"`
+	Size                       int64  `json:"size"`
+	Snapshotid                 string `json:"snapshotid"`
+	State                      string `json:"state"`
+	Status                     string `json:"status"`
+	Storage                    string `json:"storage"`
+	Storageid                  string `json:"storageid"`
+	Storagetype                string `json:"storagetype"`
+	Templatedisplaytext        string `json:"templatedisplaytext"`
+	Templateid                 string `json:"templateid"`
+	Templatename               string `json:"templatename"`
+	Type                       string `json:"type"`
+	Virtualmachineid           string `json:"virtualmachineid"`
+	Vmdisplayname              string `json:"vmdisplayname"`
+	Vmname                     string `json:"vmname"`
+	Vmstate                    string `json:"vmstate"`
+	Zoneid                     string `json:"zoneid"`
+	Zonename                   string `json:"zonename"`
+}
+
+type UploadVolumeParams struct {
+	p map[string]interface{}
+}
+
+func (p *UploadVolumeParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["checksum"]; found {
+		u.Set("checksum", v.(string))
+	}
+	if v, found := p.p["diskofferingid"]; found {
+		u.Set("diskofferingid", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["format"]; found {
+		u.Set("format", v.(string))
+	}
+	if v, found := p.p["imagestoreuuid"]; found {
+		u.Set("imagestoreuuid", v.(string))
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["projectid"]; found {
+		u.Set("projectid", v.(string))
+	}
+	if v, found := p.p["url"]; found {
+		u.Set("url", v.(string))
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *UploadVolumeParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *UploadVolumeParams) SetChecksum(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["checksum"] = v
+	return
+}
+
+func (p *UploadVolumeParams) SetDiskofferingid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["diskofferingid"] = v
+	return
+}
+
+func (p *UploadVolumeParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *UploadVolumeParams) SetFormat(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["format"] = v
+	return
+}
+
+func (p *UploadVolumeParams) SetImagestoreuuid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["imagestoreuuid"] = v
+	return
+}
+
+func (p *UploadVolumeParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *UploadVolumeParams) SetProjectid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["projectid"] = v
+	return
+}
+
+func (p *UploadVolumeParams) SetUrl(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["url"] = v
+	return
+}
+
+func (p *UploadVolumeParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new UploadVolumeParams instance,
+// as then you are sure you have configured all required params
+func (s *VolumeService) NewUploadVolumeParams(format string, name string, url string, zoneid string) *UploadVolumeParams {
+	p := &UploadVolumeParams{}
+	p.p = make(map[string]interface{})
+	p.p["format"] = format
+	p.p["name"] = name
+	p.p["url"] = url
+	p.p["zoneid"] = zoneid
+	return p
+}
+
+// Uploads a data disk.
+func (s *VolumeService) UploadVolume(p *UploadVolumeParams) (*UploadVolumeResponse, error) {
+	resp, err := s.cs.newRequest("uploadVolume", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r UploadVolumeResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type UploadVolumeResponse struct {
+	JobID                      string `json:"jobid"`
+	Account                    string `json:"account"`
+	Attached                   string `json:"attached"`
+	Chaininfo                  string `json:"chaininfo"`
+	Created                    string `json:"created"`
+	Destroyed                  bool   `json:"destroyed"`
+	Deviceid                   int64  `json:"deviceid"`
+	DiskBytesReadRate          int64  `json:"diskBytesReadRate"`
+	DiskBytesWriteRate         int64  `json:"diskBytesWriteRate"`
+	DiskIopsReadRate           int64  `json:"diskIopsReadRate"`
+	DiskIopsWriteRate          int64  `json:"diskIopsWriteRate"`
+	Diskofferingdisplaytext    string `json:"diskofferingdisplaytext"`
+	Diskofferingid             string `json:"diskofferingid"`
+	Diskofferingname           string `json:"diskofferingname"`
+	Displayvolume              bool   `json:"displayvolume"`
+	Domain                     string `json:"domain"`
+	Domainid                   string `json:"domainid"`
+	Hypervisor                 string `json:"hypervisor"`
+	Id                         string `json:"id"`
+	Isextractable              bool   `json:"isextractable"`
+	Isodisplaytext             string `json:"isodisplaytext"`
+	Isoid                      string `json:"isoid"`
+	Isoname                    string `json:"isoname"`
+	Maxiops                    int64  `json:"maxiops"`
+	Miniops                    int64  `json:"miniops"`
+	Name                       string `json:"name"`
+	Path                       string `json:"path"`
+	Project                    string `json:"project"`
+	Projectid                  string `json:"projectid"`
+	Provisioningtype           string `json:"provisioningtype"`
+	Quiescevm                  bool   `json:"quiescevm"`
+	Serviceofferingdisplaytext string `json:"serviceofferingdisplaytext"`
+	Serviceofferingid          string `json:"serviceofferingid"`
+	Serviceofferingname        string `json:"serviceofferingname"`
+	Size                       int64  `json:"size"`
+	Snapshotid                 string `json:"snapshotid"`
+	State                      string `json:"state"`
+	Status                     string `json:"status"`
+	Storage                    string `json:"storage"`
+	Storageid                  string `json:"storageid"`
+	Storagetype                string `json:"storagetype"`
+	Templatedisplaytext        string `json:"templatedisplaytext"`
+	Templateid                 string `json:"templateid"`
+	Templatename               string `json:"templatename"`
+	Type                       string `json:"type"`
+	Virtualmachineid           string `json:"virtualmachineid"`
+	Vmdisplayname              string `json:"vmdisplayname"`
+	Vmname                     string `json:"vmname"`
+	Vmstate                    string `json:"vmstate"`
+	Zoneid                     string `json:"zoneid"`
+	Zonename                   string `json:"zonename"`
+}
diff --git a/vendor/github.com/xanzy/go-cloudstack/cloudstack/ZoneService.go b/vendor/github.com/xanzy/go-cloudstack/cloudstack/ZoneService.go
new file mode 100644
index 0000000..2f62008
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/cloudstack/ZoneService.go
@@ -0,0 +1,1620 @@
+//
+// Copyright 2018, Sander van Harmelen
+//
+// Licensed 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 cloudstack
+
+import (
+	"encoding/json"
+	"fmt"
+	"net/url"
+	"strconv"
+	"strings"
+)
+
+type AddVmwareDcParams struct {
+	p map[string]interface{}
+}
+
+func (p *AddVmwareDcParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["password"]; found {
+		u.Set("password", v.(string))
+	}
+	if v, found := p.p["username"]; found {
+		u.Set("username", v.(string))
+	}
+	if v, found := p.p["vcenter"]; found {
+		u.Set("vcenter", v.(string))
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *AddVmwareDcParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *AddVmwareDcParams) SetPassword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["password"] = v
+	return
+}
+
+func (p *AddVmwareDcParams) SetUsername(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["username"] = v
+	return
+}
+
+func (p *AddVmwareDcParams) SetVcenter(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["vcenter"] = v
+	return
+}
+
+func (p *AddVmwareDcParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new AddVmwareDcParams instance,
+// as then you are sure you have configured all required params
+func (s *ZoneService) NewAddVmwareDcParams(name string, vcenter string, zoneid string) *AddVmwareDcParams {
+	p := &AddVmwareDcParams{}
+	p.p = make(map[string]interface{})
+	p.p["name"] = name
+	p.p["vcenter"] = vcenter
+	p.p["zoneid"] = zoneid
+	return p
+}
+
+// Adds a VMware datacenter to specified zone
+func (s *ZoneService) AddVmwareDc(p *AddVmwareDcParams) (*AddVmwareDcResponse, error) {
+	resp, err := s.cs.newRequest("addVmwareDc", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r AddVmwareDcResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type AddVmwareDcResponse struct {
+	Id      string `json:"id"`
+	Name    string `json:"name"`
+	Vcenter string `json:"vcenter"`
+	Zoneid  int64  `json:"zoneid"`
+}
+
+type CreateZoneParams struct {
+	p map[string]interface{}
+}
+
+func (p *CreateZoneParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["allocationstate"]; found {
+		u.Set("allocationstate", v.(string))
+	}
+	if v, found := p.p["dns1"]; found {
+		u.Set("dns1", v.(string))
+	}
+	if v, found := p.p["dns2"]; found {
+		u.Set("dns2", v.(string))
+	}
+	if v, found := p.p["domain"]; found {
+		u.Set("domain", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["guestcidraddress"]; found {
+		u.Set("guestcidraddress", v.(string))
+	}
+	if v, found := p.p["internaldns1"]; found {
+		u.Set("internaldns1", v.(string))
+	}
+	if v, found := p.p["internaldns2"]; found {
+		u.Set("internaldns2", v.(string))
+	}
+	if v, found := p.p["ip6dns1"]; found {
+		u.Set("ip6dns1", v.(string))
+	}
+	if v, found := p.p["ip6dns2"]; found {
+		u.Set("ip6dns2", v.(string))
+	}
+	if v, found := p.p["localstorageenabled"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("localstorageenabled", vv)
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["networktype"]; found {
+		u.Set("networktype", v.(string))
+	}
+	if v, found := p.p["securitygroupenabled"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("securitygroupenabled", vv)
+	}
+	return u
+}
+
+func (p *CreateZoneParams) SetAllocationstate(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["allocationstate"] = v
+	return
+}
+
+func (p *CreateZoneParams) SetDns1(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["dns1"] = v
+	return
+}
+
+func (p *CreateZoneParams) SetDns2(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["dns2"] = v
+	return
+}
+
+func (p *CreateZoneParams) SetDomain(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domain"] = v
+	return
+}
+
+func (p *CreateZoneParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *CreateZoneParams) SetGuestcidraddress(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["guestcidraddress"] = v
+	return
+}
+
+func (p *CreateZoneParams) SetInternaldns1(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["internaldns1"] = v
+	return
+}
+
+func (p *CreateZoneParams) SetInternaldns2(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["internaldns2"] = v
+	return
+}
+
+func (p *CreateZoneParams) SetIp6dns1(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["ip6dns1"] = v
+	return
+}
+
+func (p *CreateZoneParams) SetIp6dns2(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["ip6dns2"] = v
+	return
+}
+
+func (p *CreateZoneParams) SetLocalstorageenabled(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["localstorageenabled"] = v
+	return
+}
+
+func (p *CreateZoneParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *CreateZoneParams) SetNetworktype(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["networktype"] = v
+	return
+}
+
+func (p *CreateZoneParams) SetSecuritygroupenabled(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["securitygroupenabled"] = v
+	return
+}
+
+// You should always use this function to get a new CreateZoneParams instance,
+// as then you are sure you have configured all required params
+func (s *ZoneService) NewCreateZoneParams(dns1 string, internaldns1 string, name string, networktype string) *CreateZoneParams {
+	p := &CreateZoneParams{}
+	p.p = make(map[string]interface{})
+	p.p["dns1"] = dns1
+	p.p["internaldns1"] = internaldns1
+	p.p["name"] = name
+	p.p["networktype"] = networktype
+	return p
+}
+
+// Creates a Zone.
+func (s *ZoneService) CreateZone(p *CreateZoneParams) (*CreateZoneResponse, error) {
+	resp, err := s.cs.newRequest("createZone", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r CreateZoneResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type CreateZoneResponse struct {
+	Allocationstate string `json:"allocationstate"`
+	Capacity        []struct {
+		Capacitytotal int64  `json:"capacitytotal"`
+		Capacityused  int64  `json:"capacityused"`
+		Clusterid     string `json:"clusterid"`
+		Clustername   string `json:"clustername"`
+		Percentused   string `json:"percentused"`
+		Podid         string `json:"podid"`
+		Podname       string `json:"podname"`
+		Type          int    `json:"type"`
+		Zoneid        string `json:"zoneid"`
+		Zonename      string `json:"zonename"`
+	} `json:"capacity"`
+	Description           string            `json:"description"`
+	Dhcpprovider          string            `json:"dhcpprovider"`
+	Displaytext           string            `json:"displaytext"`
+	Dns1                  string            `json:"dns1"`
+	Dns2                  string            `json:"dns2"`
+	Domain                string            `json:"domain"`
+	Domainid              string            `json:"domainid"`
+	Domainname            string            `json:"domainname"`
+	Guestcidraddress      string            `json:"guestcidraddress"`
+	Id                    string            `json:"id"`
+	Internaldns1          string            `json:"internaldns1"`
+	Internaldns2          string            `json:"internaldns2"`
+	Ip6dns1               string            `json:"ip6dns1"`
+	Ip6dns2               string            `json:"ip6dns2"`
+	Localstorageenabled   bool              `json:"localstorageenabled"`
+	Name                  string            `json:"name"`
+	Networktype           string            `json:"networktype"`
+	Resourcedetails       map[string]string `json:"resourcedetails"`
+	Securitygroupsenabled bool              `json:"securitygroupsenabled"`
+	Tags                  []struct {
+		Account      string `json:"account"`
+		Customer     string `json:"customer"`
+		Domain       string `json:"domain"`
+		Domainid     string `json:"domainid"`
+		Key          string `json:"key"`
+		Project      string `json:"project"`
+		Projectid    string `json:"projectid"`
+		Resourceid   string `json:"resourceid"`
+		Resourcetype string `json:"resourcetype"`
+		Value        string `json:"value"`
+	} `json:"tags"`
+	Zonetoken string `json:"zonetoken"`
+}
+
+type DedicateZoneParams struct {
+	p map[string]interface{}
+}
+
+func (p *DedicateZoneParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *DedicateZoneParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *DedicateZoneParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *DedicateZoneParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new DedicateZoneParams instance,
+// as then you are sure you have configured all required params
+func (s *ZoneService) NewDedicateZoneParams(domainid string, zoneid string) *DedicateZoneParams {
+	p := &DedicateZoneParams{}
+	p.p = make(map[string]interface{})
+	p.p["domainid"] = domainid
+	p.p["zoneid"] = zoneid
+	return p
+}
+
+// Dedicates a zones.
+func (s *ZoneService) DedicateZone(p *DedicateZoneParams) (*DedicateZoneResponse, error) {
+	resp, err := s.cs.newRequest("dedicateZone", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DedicateZoneResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type DedicateZoneResponse struct {
+	JobID           string `json:"jobid"`
+	Accountid       string `json:"accountid"`
+	Affinitygroupid string `json:"affinitygroupid"`
+	Domainid        string `json:"domainid"`
+	Id              string `json:"id"`
+	Zoneid          string `json:"zoneid"`
+	Zonename        string `json:"zonename"`
+}
+
+type DeleteZoneParams struct {
+	p map[string]interface{}
+}
+
+func (p *DeleteZoneParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	return u
+}
+
+func (p *DeleteZoneParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+// You should always use this function to get a new DeleteZoneParams instance,
+// as then you are sure you have configured all required params
+func (s *ZoneService) NewDeleteZoneParams(id string) *DeleteZoneParams {
+	p := &DeleteZoneParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Deletes a Zone.
+func (s *ZoneService) DeleteZone(p *DeleteZoneParams) (*DeleteZoneResponse, error) {
+	resp, err := s.cs.newRequest("deleteZone", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DeleteZoneResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type DeleteZoneResponse struct {
+	Displaytext string `json:"displaytext"`
+	Success     string `json:"success"`
+}
+
+type DisableOutOfBandManagementForZoneParams struct {
+	p map[string]interface{}
+}
+
+func (p *DisableOutOfBandManagementForZoneParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *DisableOutOfBandManagementForZoneParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new DisableOutOfBandManagementForZoneParams instance,
+// as then you are sure you have configured all required params
+func (s *ZoneService) NewDisableOutOfBandManagementForZoneParams(zoneid string) *DisableOutOfBandManagementForZoneParams {
+	p := &DisableOutOfBandManagementForZoneParams{}
+	p.p = make(map[string]interface{})
+	p.p["zoneid"] = zoneid
+	return p
+}
+
+// Disables out-of-band management for a zone
+func (s *ZoneService) DisableOutOfBandManagementForZone(p *DisableOutOfBandManagementForZoneParams) (*DisableOutOfBandManagementForZoneResponse, error) {
+	resp, err := s.cs.newRequest("disableOutOfBandManagementForZone", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r DisableOutOfBandManagementForZoneResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type DisableOutOfBandManagementForZoneResponse struct {
+	JobID       string `json:"jobid"`
+	Action      string `json:"action"`
+	Address     string `json:"address"`
+	Description string `json:"description"`
+	Driver      string `json:"driver"`
+	Enabled     bool   `json:"enabled"`
+	Hostid      string `json:"hostid"`
+	Password    string `json:"password"`
+	Port        string `json:"port"`
+	Powerstate  string `json:"powerstate"`
+	Status      bool   `json:"status"`
+	Username    string `json:"username"`
+}
+
+type EnableOutOfBandManagementForZoneParams struct {
+	p map[string]interface{}
+}
+
+func (p *EnableOutOfBandManagementForZoneParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *EnableOutOfBandManagementForZoneParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new EnableOutOfBandManagementForZoneParams instance,
+// as then you are sure you have configured all required params
+func (s *ZoneService) NewEnableOutOfBandManagementForZoneParams(zoneid string) *EnableOutOfBandManagementForZoneParams {
+	p := &EnableOutOfBandManagementForZoneParams{}
+	p.p = make(map[string]interface{})
+	p.p["zoneid"] = zoneid
+	return p
+}
+
+// Enables out-of-band management for a zone
+func (s *ZoneService) EnableOutOfBandManagementForZone(p *EnableOutOfBandManagementForZoneParams) (*EnableOutOfBandManagementForZoneResponse, error) {
+	resp, err := s.cs.newRequest("enableOutOfBandManagementForZone", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r EnableOutOfBandManagementForZoneResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		b, err = getRawValue(b)
+		if err != nil {
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type EnableOutOfBandManagementForZoneResponse struct {
+	JobID       string `json:"jobid"`
+	Action      string `json:"action"`
+	Address     string `json:"address"`
+	Description string `json:"description"`
+	Driver      string `json:"driver"`
+	Enabled     bool   `json:"enabled"`
+	Hostid      string `json:"hostid"`
+	Password    string `json:"password"`
+	Port        string `json:"port"`
+	Powerstate  string `json:"powerstate"`
+	Status      bool   `json:"status"`
+	Username    string `json:"username"`
+}
+
+type ListDedicatedZonesParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListDedicatedZonesParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["account"]; found {
+		u.Set("account", v.(string))
+	}
+	if v, found := p.p["affinitygroupid"]; found {
+		u.Set("affinitygroupid", v.(string))
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *ListDedicatedZonesParams) SetAccount(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["account"] = v
+	return
+}
+
+func (p *ListDedicatedZonesParams) SetAffinitygroupid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["affinitygroupid"] = v
+	return
+}
+
+func (p *ListDedicatedZonesParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *ListDedicatedZonesParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListDedicatedZonesParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListDedicatedZonesParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListDedicatedZonesParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new ListDedicatedZonesParams instance,
+// as then you are sure you have configured all required params
+func (s *ZoneService) NewListDedicatedZonesParams() *ListDedicatedZonesParams {
+	p := &ListDedicatedZonesParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// List dedicated zones.
+func (s *ZoneService) ListDedicatedZones(p *ListDedicatedZonesParams) (*ListDedicatedZonesResponse, error) {
+	resp, err := s.cs.newRequest("listDedicatedZones", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListDedicatedZonesResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListDedicatedZonesResponse struct {
+	Count          int              `json:"count"`
+	DedicatedZones []*DedicatedZone `json:"dedicatedzone"`
+}
+
+type DedicatedZone struct {
+	Accountid       string `json:"accountid"`
+	Affinitygroupid string `json:"affinitygroupid"`
+	Domainid        string `json:"domainid"`
+	Id              string `json:"id"`
+	Zoneid          string `json:"zoneid"`
+	Zonename        string `json:"zonename"`
+}
+
+type ListVmwareDcsParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListVmwareDcsParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *ListVmwareDcsParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListVmwareDcsParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListVmwareDcsParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListVmwareDcsParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new ListVmwareDcsParams instance,
+// as then you are sure you have configured all required params
+func (s *ZoneService) NewListVmwareDcsParams(zoneid string) *ListVmwareDcsParams {
+	p := &ListVmwareDcsParams{}
+	p.p = make(map[string]interface{})
+	p.p["zoneid"] = zoneid
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *ZoneService) GetVmwareDcID(keyword string, zoneid string, opts ...OptionFunc) (string, int, error) {
+	p := &ListVmwareDcsParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["keyword"] = keyword
+	p.p["zoneid"] = zoneid
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return "", -1, err
+		}
+	}
+
+	l, err := s.ListVmwareDcs(p)
+	if err != nil {
+		return "", -1, err
+	}
+
+	if l.Count == 0 {
+		return "", l.Count, fmt.Errorf("No match found for %s: %+v", keyword, l)
+	}
+
+	if l.Count == 1 {
+		return l.VmwareDcs[0].Id, l.Count, nil
+	}
+
+	if l.Count > 1 {
+		for _, v := range l.VmwareDcs {
+			if v.Name == keyword {
+				return v.Id, l.Count, nil
+			}
+		}
+	}
+	return "", l.Count, fmt.Errorf("Could not find an exact match for %s: %+v", keyword, l)
+}
+
+// Retrieves VMware DC(s) associated with a zone.
+func (s *ZoneService) ListVmwareDcs(p *ListVmwareDcsParams) (*ListVmwareDcsResponse, error) {
+	resp, err := s.cs.newRequest("listVmwareDcs", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListVmwareDcsResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListVmwareDcsResponse struct {
+	Count     int         `json:"count"`
+	VmwareDcs []*VmwareDc `json:"vmwaredc"`
+}
+
+type VmwareDc struct {
+	Id      string `json:"id"`
+	Name    string `json:"name"`
+	Vcenter string `json:"vcenter"`
+	Zoneid  int64  `json:"zoneid"`
+}
+
+type ListZonesParams struct {
+	p map[string]interface{}
+}
+
+func (p *ListZonesParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["available"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("available", vv)
+	}
+	if v, found := p.p["domainid"]; found {
+		u.Set("domainid", v.(string))
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["keyword"]; found {
+		u.Set("keyword", v.(string))
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	if v, found := p.p["networktype"]; found {
+		u.Set("networktype", v.(string))
+	}
+	if v, found := p.p["page"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("page", vv)
+	}
+	if v, found := p.p["pagesize"]; found {
+		vv := strconv.Itoa(v.(int))
+		u.Set("pagesize", vv)
+	}
+	if v, found := p.p["showcapacities"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("showcapacities", vv)
+	}
+	if v, found := p.p["tags"]; found {
+		i := 0
+		for k, vv := range v.(map[string]string) {
+			u.Set(fmt.Sprintf("tags[%d].key", i), k)
+			u.Set(fmt.Sprintf("tags[%d].value", i), vv)
+			i++
+		}
+	}
+	return u
+}
+
+func (p *ListZonesParams) SetAvailable(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["available"] = v
+	return
+}
+
+func (p *ListZonesParams) SetDomainid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domainid"] = v
+	return
+}
+
+func (p *ListZonesParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *ListZonesParams) SetKeyword(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["keyword"] = v
+	return
+}
+
+func (p *ListZonesParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+func (p *ListZonesParams) SetNetworktype(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["networktype"] = v
+	return
+}
+
+func (p *ListZonesParams) SetPage(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["page"] = v
+	return
+}
+
+func (p *ListZonesParams) SetPagesize(v int) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["pagesize"] = v
+	return
+}
+
+func (p *ListZonesParams) SetShowcapacities(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["showcapacities"] = v
+	return
+}
+
+func (p *ListZonesParams) SetTags(v map[string]string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["tags"] = v
+	return
+}
+
+// You should always use this function to get a new ListZonesParams instance,
+// as then you are sure you have configured all required params
+func (s *ZoneService) NewListZonesParams() *ListZonesParams {
+	p := &ListZonesParams{}
+	p.p = make(map[string]interface{})
+	return p
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *ZoneService) GetZoneID(name string, opts ...OptionFunc) (string, int, error) {
+	p := &ListZonesParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["name"] = name
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return "", -1, err
+		}
+	}
+
+	l, err := s.ListZones(p)
+	if err != nil {
+		return "", -1, err
+	}
+
+	if l.Count == 0 {
+		return "", l.Count, fmt.Errorf("No match found for %s: %+v", name, l)
+	}
+
+	if l.Count == 1 {
+		return l.Zones[0].Id, l.Count, nil
+	}
+
+	if l.Count > 1 {
+		for _, v := range l.Zones {
+			if v.Name == name {
+				return v.Id, l.Count, nil
+			}
+		}
+	}
+	return "", l.Count, fmt.Errorf("Could not find an exact match for %s: %+v", name, l)
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *ZoneService) GetZoneByName(name string, opts ...OptionFunc) (*Zone, int, error) {
+	id, count, err := s.GetZoneID(name, opts...)
+	if err != nil {
+		return nil, count, err
+	}
+
+	r, count, err := s.GetZoneByID(id, opts...)
+	if err != nil {
+		return nil, count, err
+	}
+	return r, count, nil
+}
+
+// This is a courtesy helper function, which in some cases may not work as expected!
+func (s *ZoneService) GetZoneByID(id string, opts ...OptionFunc) (*Zone, int, error) {
+	p := &ListZonesParams{}
+	p.p = make(map[string]interface{})
+
+	p.p["id"] = id
+
+	for _, fn := range append(s.cs.options, opts...) {
+		if err := fn(s.cs, p); err != nil {
+			return nil, -1, err
+		}
+	}
+
+	l, err := s.ListZones(p)
+	if err != nil {
+		if strings.Contains(err.Error(), fmt.Sprintf(
+			"Invalid parameter id value=%s due to incorrect long value format, "+
+				"or entity does not exist", id)) {
+			return nil, 0, fmt.Errorf("No match found for %s: %+v", id, l)
+		}
+		return nil, -1, err
+	}
+
+	if l.Count == 0 {
+		return nil, l.Count, fmt.Errorf("No match found for %s: %+v", id, l)
+	}
+
+	if l.Count == 1 {
+		return l.Zones[0], l.Count, nil
+	}
+	return nil, l.Count, fmt.Errorf("There is more then one result for Zone UUID: %s!", id)
+}
+
+// Lists zones
+func (s *ZoneService) ListZones(p *ListZonesParams) (*ListZonesResponse, error) {
+	resp, err := s.cs.newRequest("listZones", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ListZonesResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type ListZonesResponse struct {
+	Count int     `json:"count"`
+	Zones []*Zone `json:"zone"`
+}
+
+type Zone struct {
+	Allocationstate string `json:"allocationstate"`
+	Capacity        []struct {
+		Capacitytotal int64  `json:"capacitytotal"`
+		Capacityused  int64  `json:"capacityused"`
+		Clusterid     string `json:"clusterid"`
+		Clustername   string `json:"clustername"`
+		Percentused   string `json:"percentused"`
+		Podid         string `json:"podid"`
+		Podname       string `json:"podname"`
+		Type          int    `json:"type"`
+		Zoneid        string `json:"zoneid"`
+		Zonename      string `json:"zonename"`
+	} `json:"capacity"`
+	Description           string            `json:"description"`
+	Dhcpprovider          string            `json:"dhcpprovider"`
+	Displaytext           string            `json:"displaytext"`
+	Dns1                  string            `json:"dns1"`
+	Dns2                  string            `json:"dns2"`
+	Domain                string            `json:"domain"`
+	Domainid              string            `json:"domainid"`
+	Domainname            string            `json:"domainname"`
+	Guestcidraddress      string            `json:"guestcidraddress"`
+	Id                    string            `json:"id"`
+	Internaldns1          string            `json:"internaldns1"`
+	Internaldns2          string            `json:"internaldns2"`
+	Ip6dns1               string            `json:"ip6dns1"`
+	Ip6dns2               string            `json:"ip6dns2"`
+	Localstorageenabled   bool              `json:"localstorageenabled"`
+	Name                  string            `json:"name"`
+	Networktype           string            `json:"networktype"`
+	Resourcedetails       map[string]string `json:"resourcedetails"`
+	Securitygroupsenabled bool              `json:"securitygroupsenabled"`
+	Tags                  []struct {
+		Account      string `json:"account"`
+		Customer     string `json:"customer"`
+		Domain       string `json:"domain"`
+		Domainid     string `json:"domainid"`
+		Key          string `json:"key"`
+		Project      string `json:"project"`
+		Projectid    string `json:"projectid"`
+		Resourceid   string `json:"resourceid"`
+		Resourcetype string `json:"resourcetype"`
+		Value        string `json:"value"`
+	} `json:"tags"`
+	Zonetoken string `json:"zonetoken"`
+}
+
+type ReleaseDedicatedZoneParams struct {
+	p map[string]interface{}
+}
+
+func (p *ReleaseDedicatedZoneParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *ReleaseDedicatedZoneParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new ReleaseDedicatedZoneParams instance,
+// as then you are sure you have configured all required params
+func (s *ZoneService) NewReleaseDedicatedZoneParams(zoneid string) *ReleaseDedicatedZoneParams {
+	p := &ReleaseDedicatedZoneParams{}
+	p.p = make(map[string]interface{})
+	p.p["zoneid"] = zoneid
+	return p
+}
+
+// Release dedication of zone
+func (s *ZoneService) ReleaseDedicatedZone(p *ReleaseDedicatedZoneParams) (*ReleaseDedicatedZoneResponse, error) {
+	resp, err := s.cs.newRequest("releaseDedicatedZone", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r ReleaseDedicatedZoneResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	// If we have a async client, we need to wait for the async result
+	if s.cs.async {
+		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)
+		if err != nil {
+			if err == AsyncTimeoutErr {
+				return &r, err
+			}
+			return nil, err
+		}
+
+		if err := json.Unmarshal(b, &r); err != nil {
+			return nil, err
+		}
+	}
+
+	return &r, nil
+}
+
+type ReleaseDedicatedZoneResponse struct {
+	JobID       string `json:"jobid"`
+	Displaytext string `json:"displaytext"`
+	Success     bool   `json:"success"`
+}
+
+type RemoveVmwareDcParams struct {
+	p map[string]interface{}
+}
+
+func (p *RemoveVmwareDcParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["zoneid"]; found {
+		u.Set("zoneid", v.(string))
+	}
+	return u
+}
+
+func (p *RemoveVmwareDcParams) SetZoneid(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["zoneid"] = v
+	return
+}
+
+// You should always use this function to get a new RemoveVmwareDcParams instance,
+// as then you are sure you have configured all required params
+func (s *ZoneService) NewRemoveVmwareDcParams(zoneid string) *RemoveVmwareDcParams {
+	p := &RemoveVmwareDcParams{}
+	p.p = make(map[string]interface{})
+	p.p["zoneid"] = zoneid
+	return p
+}
+
+// Remove a VMware datacenter from a zone.
+func (s *ZoneService) RemoveVmwareDc(p *RemoveVmwareDcParams) (*RemoveVmwareDcResponse, error) {
+	resp, err := s.cs.newRequest("removeVmwareDc", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r RemoveVmwareDcResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type RemoveVmwareDcResponse struct {
+	Displaytext string `json:"displaytext"`
+	Success     string `json:"success"`
+}
+
+type UpdateZoneParams struct {
+	p map[string]interface{}
+}
+
+func (p *UpdateZoneParams) toURLValues() url.Values {
+	u := url.Values{}
+	if p.p == nil {
+		return u
+	}
+	if v, found := p.p["allocationstate"]; found {
+		u.Set("allocationstate", v.(string))
+	}
+	if v, found := p.p["details"]; found {
+		i := 0
+		for k, vv := range v.(map[string]string) {
+			u.Set(fmt.Sprintf("details[%d].%s", i, k), vv)
+			i++
+		}
+	}
+	if v, found := p.p["dhcpprovider"]; found {
+		u.Set("dhcpprovider", v.(string))
+	}
+	if v, found := p.p["dns1"]; found {
+		u.Set("dns1", v.(string))
+	}
+	if v, found := p.p["dns2"]; found {
+		u.Set("dns2", v.(string))
+	}
+	if v, found := p.p["dnssearchorder"]; found {
+		vv := strings.Join(v.([]string), ",")
+		u.Set("dnssearchorder", vv)
+	}
+	if v, found := p.p["domain"]; found {
+		u.Set("domain", v.(string))
+	}
+	if v, found := p.p["guestcidraddress"]; found {
+		u.Set("guestcidraddress", v.(string))
+	}
+	if v, found := p.p["id"]; found {
+		u.Set("id", v.(string))
+	}
+	if v, found := p.p["internaldns1"]; found {
+		u.Set("internaldns1", v.(string))
+	}
+	if v, found := p.p["internaldns2"]; found {
+		u.Set("internaldns2", v.(string))
+	}
+	if v, found := p.p["ip6dns1"]; found {
+		u.Set("ip6dns1", v.(string))
+	}
+	if v, found := p.p["ip6dns2"]; found {
+		u.Set("ip6dns2", v.(string))
+	}
+	if v, found := p.p["ispublic"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("ispublic", vv)
+	}
+	if v, found := p.p["localstorageenabled"]; found {
+		vv := strconv.FormatBool(v.(bool))
+		u.Set("localstorageenabled", vv)
+	}
+	if v, found := p.p["name"]; found {
+		u.Set("name", v.(string))
+	}
+	return u
+}
+
+func (p *UpdateZoneParams) SetAllocationstate(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["allocationstate"] = v
+	return
+}
+
+func (p *UpdateZoneParams) SetDetails(v map[string]string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["details"] = v
+	return
+}
+
+func (p *UpdateZoneParams) SetDhcpprovider(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["dhcpprovider"] = v
+	return
+}
+
+func (p *UpdateZoneParams) SetDns1(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["dns1"] = v
+	return
+}
+
+func (p *UpdateZoneParams) SetDns2(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["dns2"] = v
+	return
+}
+
+func (p *UpdateZoneParams) SetDnssearchorder(v []string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["dnssearchorder"] = v
+	return
+}
+
+func (p *UpdateZoneParams) SetDomain(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["domain"] = v
+	return
+}
+
+func (p *UpdateZoneParams) SetGuestcidraddress(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["guestcidraddress"] = v
+	return
+}
+
+func (p *UpdateZoneParams) SetId(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["id"] = v
+	return
+}
+
+func (p *UpdateZoneParams) SetInternaldns1(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["internaldns1"] = v
+	return
+}
+
+func (p *UpdateZoneParams) SetInternaldns2(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["internaldns2"] = v
+	return
+}
+
+func (p *UpdateZoneParams) SetIp6dns1(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["ip6dns1"] = v
+	return
+}
+
+func (p *UpdateZoneParams) SetIp6dns2(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["ip6dns2"] = v
+	return
+}
+
+func (p *UpdateZoneParams) SetIspublic(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["ispublic"] = v
+	return
+}
+
+func (p *UpdateZoneParams) SetLocalstorageenabled(v bool) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["localstorageenabled"] = v
+	return
+}
+
+func (p *UpdateZoneParams) SetName(v string) {
+	if p.p == nil {
+		p.p = make(map[string]interface{})
+	}
+	p.p["name"] = v
+	return
+}
+
+// You should always use this function to get a new UpdateZoneParams instance,
+// as then you are sure you have configured all required params
+func (s *ZoneService) NewUpdateZoneParams(id string) *UpdateZoneParams {
+	p := &UpdateZoneParams{}
+	p.p = make(map[string]interface{})
+	p.p["id"] = id
+	return p
+}
+
+// Updates a Zone.
+func (s *ZoneService) UpdateZone(p *UpdateZoneParams) (*UpdateZoneResponse, error) {
+	resp, err := s.cs.newRequest("updateZone", p.toURLValues())
+	if err != nil {
+		return nil, err
+	}
+
+	var r UpdateZoneResponse
+	if err := json.Unmarshal(resp, &r); err != nil {
+		return nil, err
+	}
+
+	return &r, nil
+}
+
+type UpdateZoneResponse struct {
+	Allocationstate string `json:"allocationstate"`
+	Capacity        []struct {
+		Capacitytotal int64  `json:"capacitytotal"`
+		Capacityused  int64  `json:"capacityused"`
+		Clusterid     string `json:"clusterid"`
+		Clustername   string `json:"clustername"`
+		Percentused   string `json:"percentused"`
+		Podid         string `json:"podid"`
+		Podname       string `json:"podname"`
+		Type          int    `json:"type"`
+		Zoneid        string `json:"zoneid"`
+		Zonename      string `json:"zonename"`
+	} `json:"capacity"`
+	Description           string            `json:"description"`
+	Dhcpprovider          string            `json:"dhcpprovider"`
+	Displaytext           string            `json:"displaytext"`
+	Dns1                  string            `json:"dns1"`
+	Dns2                  string            `json:"dns2"`
+	Domain                string            `json:"domain"`
+	Domainid              string            `json:"domainid"`
+	Domainname            string            `json:"domainname"`
+	Guestcidraddress      string            `json:"guestcidraddress"`
+	Id                    string            `json:"id"`
+	Internaldns1          string            `json:"internaldns1"`
+	Internaldns2          string            `json:"internaldns2"`
+	Ip6dns1               string            `json:"ip6dns1"`
+	Ip6dns2               string            `json:"ip6dns2"`
+	Localstorageenabled   bool              `json:"localstorageenabled"`
+	Name                  string            `json:"name"`
+	Networktype           string            `json:"networktype"`
+	Resourcedetails       map[string]string `json:"resourcedetails"`
+	Securitygroupsenabled bool              `json:"securitygroupsenabled"`
+	Tags                  []struct {
+		Account      string `json:"account"`
+		Customer     string `json:"customer"`
+		Domain       string `json:"domain"`
+		Domainid     string `json:"domainid"`
+		Key          string `json:"key"`
+		Project      string `json:"project"`
+		Projectid    string `json:"projectid"`
+		Resourceid   string `json:"resourceid"`
+		Resourcetype string `json:"resourcetype"`
+		Value        string `json:"value"`
+	} `json:"tags"`
+	Zonetoken string `json:"zonetoken"`
+}
diff --git a/vendor/github.com/xanzy/go-cloudstack/cloudstack/cloudstack.go b/vendor/github.com/xanzy/go-cloudstack/cloudstack/cloudstack.go
new file mode 100644
index 0000000..2097744
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/cloudstack/cloudstack.go
@@ -0,0 +1,1040 @@
+//
+// Copyright 2018, Sander van Harmelen
+//
+// Licensed 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 cloudstack
+
+import (
+	"bytes"
+	"crypto/hmac"
+	"crypto/sha1"
+	"crypto/tls"
+	"encoding/base64"
+	"encoding/json"
+	"errors"
+	"fmt"
+	"io/ioutil"
+	"net/http"
+	"net/http/cookiejar"
+	"net/url"
+	"regexp"
+	"sort"
+	"strings"
+	"time"
+)
+
+// UnlimitedResourceID is a special ID to define an unlimited resource
+const UnlimitedResourceID = "-1"
+
+var idRegex = regexp.MustCompile(`^([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}|-1)$`)
+
+// IsID return true if the passed ID is either a UUID or a UnlimitedResourceID
+func IsID(id string) bool {
+	return idRegex.MatchString(id)
+}
+
+// OptionFunc can be passed to the courtesy helper functions to set additional parameters
+type OptionFunc func(*CloudStackClient, interface{}) error
+
+type CSError struct {
+	ErrorCode   int    `json:"errorcode"`
+	CSErrorCode int    `json:"cserrorcode"`
+	ErrorText   string `json:"errortext"`
+}
+
+func (e *CSError) Error() error {
+	return fmt.Errorf("CloudStack API error %d (CSExceptionErrorCode: %d): %s", e.ErrorCode, e.CSErrorCode, e.ErrorText)
+}
+
+type CloudStackClient struct {
+	HTTPGETOnly bool // If `true` only use HTTP GET calls
+
+	client  *http.Client // The http client for communicating
+	baseURL string       // The base URL of the API
+	apiKey  string       // Api key
+	secret  string       // Secret key
+	async   bool         // Wait for async calls to finish
+	options []OptionFunc // A list of option functions to apply to all API calls
+	timeout int64        // Max waiting timeout in seconds for async jobs to finish; defaults to 300 seconds
+
+	APIDiscovery        *APIDiscoveryService
+	Account             *AccountService
+	Address             *AddressService
+	AffinityGroup       *AffinityGroupService
+	Alert               *AlertService
+	Asyncjob            *AsyncjobService
+	Authentication      *AuthenticationService
+	AutoScale           *AutoScaleService
+	Baremetal           *BaremetalService
+	BigSwitchBCF        *BigSwitchBCFService
+	BrocadeVCS          *BrocadeVCSService
+	Certificate         *CertificateService
+	CloudIdentifier     *CloudIdentifierService
+	Cluster             *ClusterService
+	Configuration       *ConfigurationService
+	Custom              *CustomService
+	DiskOffering        *DiskOfferingService
+	Domain              *DomainService
+	Event               *EventService
+	ExtFirewall         *ExtFirewallService
+	ExtLoadBalancer     *ExtLoadBalancerService
+	ExternalDevice      *ExternalDeviceService
+	Firewall            *FirewallService
+	GuestOS             *GuestOSService
+	Host                *HostService
+	Hypervisor          *HypervisorService
+	ISO                 *ISOService
+	ImageStore          *ImageStoreService
+	InternalLB          *InternalLBService
+	LDAP                *LDAPService
+	Limit               *LimitService
+	LoadBalancer        *LoadBalancerService
+	NAT                 *NATService
+	NetworkACL          *NetworkACLService
+	NetworkDevice       *NetworkDeviceService
+	NetworkOffering     *NetworkOfferingService
+	Network             *NetworkService
+	Nic                 *NicService
+	NiciraNVP           *NiciraNVPService
+	NuageVSP            *NuageVSPService
+	OutofbandManagement *OutofbandManagementService
+	OvsElement          *OvsElementService
+	Pod                 *PodService
+	Pool                *PoolService
+	PortableIP          *PortableIPService
+	Project             *ProjectService
+	Quota               *QuotaService
+	Region              *RegionService
+	Resourcemetadata    *ResourcemetadataService
+	Resourcetags        *ResourcetagsService
+	Role                *RoleService
+	Router              *RouterService
+	SSH                 *SSHService
+	SecurityGroup       *SecurityGroupService
+	ServiceOffering     *ServiceOfferingService
+	Snapshot            *SnapshotService
+	StoragePool         *StoragePoolService
+	StratosphereSSP     *StratosphereSSPService
+	Swift               *SwiftService
+	SystemCapacity      *SystemCapacityService
+	SystemVM            *SystemVMService
+	Template            *TemplateService
+	UCS                 *UCSService
+	Usage               *UsageService
+	User                *UserService
+	VLAN                *VLANService
+	VMGroup             *VMGroupService
+	VPC                 *VPCService
+	VPN                 *VPNService
+	VirtualMachine      *VirtualMachineService
+	Volume              *VolumeService
+	Zone                *ZoneService
+}
+
+// Creates a new client for communicating with CloudStack
+func newClient(apiurl string, apikey string, secret string, async bool, verifyssl bool) *CloudStackClient {
+	jar, _ := cookiejar.New(nil)
+	cs := &CloudStackClient{
+		client: &http.Client{
+			Jar: jar,
+			Transport: &http.Transport{
+				Proxy:           http.ProxyFromEnvironment,
+				TLSClientConfig: &tls.Config{InsecureSkipVerify: !verifyssl}, // If verifyssl is true, skipping the verify should be false and vice versa
+			},
+			Timeout: time.Duration(60 * time.Second),
+		},
+		baseURL: apiurl,
+		apiKey:  apikey,
+		secret:  secret,
+		async:   async,
+		options: []OptionFunc{},
+		timeout: 300,
+	}
+	cs.APIDiscovery = NewAPIDiscoveryService(cs)
+	cs.Account = NewAccountService(cs)
+	cs.Address = NewAddressService(cs)
+	cs.AffinityGroup = NewAffinityGroupService(cs)
+	cs.Alert = NewAlertService(cs)
+	cs.Asyncjob = NewAsyncjobService(cs)
+	cs.Authentication = NewAuthenticationService(cs)
+	cs.AutoScale = NewAutoScaleService(cs)
+	cs.Baremetal = NewBaremetalService(cs)
+	cs.BigSwitchBCF = NewBigSwitchBCFService(cs)
+	cs.BrocadeVCS = NewBrocadeVCSService(cs)
+	cs.Certificate = NewCertificateService(cs)
+	cs.CloudIdentifier = NewCloudIdentifierService(cs)
+	cs.Cluster = NewClusterService(cs)
+	cs.Configuration = NewConfigurationService(cs)
+	cs.Custom = NewCustomService(cs)
+	cs.DiskOffering = NewDiskOfferingService(cs)
+	cs.Domain = NewDomainService(cs)
+	cs.Event = NewEventService(cs)
+	cs.ExtFirewall = NewExtFirewallService(cs)
+	cs.ExtLoadBalancer = NewExtLoadBalancerService(cs)
+	cs.ExternalDevice = NewExternalDeviceService(cs)
+	cs.Firewall = NewFirewallService(cs)
+	cs.GuestOS = NewGuestOSService(cs)
+	cs.Host = NewHostService(cs)
+	cs.Hypervisor = NewHypervisorService(cs)
+	cs.ISO = NewISOService(cs)
+	cs.ImageStore = NewImageStoreService(cs)
+	cs.InternalLB = NewInternalLBService(cs)
+	cs.LDAP = NewLDAPService(cs)
+	cs.Limit = NewLimitService(cs)
+	cs.LoadBalancer = NewLoadBalancerService(cs)
+	cs.NAT = NewNATService(cs)
+	cs.NetworkACL = NewNetworkACLService(cs)
+	cs.NetworkDevice = NewNetworkDeviceService(cs)
+	cs.NetworkOffering = NewNetworkOfferingService(cs)
+	cs.Network = NewNetworkService(cs)
+	cs.Nic = NewNicService(cs)
+	cs.NiciraNVP = NewNiciraNVPService(cs)
+	cs.NuageVSP = NewNuageVSPService(cs)
+	cs.OutofbandManagement = NewOutofbandManagementService(cs)
+	cs.OvsElement = NewOvsElementService(cs)
+	cs.Pod = NewPodService(cs)
+	cs.Pool = NewPoolService(cs)
+	cs.PortableIP = NewPortableIPService(cs)
+	cs.Project = NewProjectService(cs)
+	cs.Quota = NewQuotaService(cs)
+	cs.Region = NewRegionService(cs)
+	cs.Resourcemetadata = NewResourcemetadataService(cs)
+	cs.Resourcetags = NewResourcetagsService(cs)
+	cs.Role = NewRoleService(cs)
+	cs.Router = NewRouterService(cs)
+	cs.SSH = NewSSHService(cs)
+	cs.SecurityGroup = NewSecurityGroupService(cs)
+	cs.ServiceOffering = NewServiceOfferingService(cs)
+	cs.Snapshot = NewSnapshotService(cs)
+	cs.StoragePool = NewStoragePoolService(cs)
+	cs.StratosphereSSP = NewStratosphereSSPService(cs)
+	cs.Swift = NewSwiftService(cs)
+	cs.SystemCapacity = NewSystemCapacityService(cs)
+	cs.SystemVM = NewSystemVMService(cs)
+	cs.Template = NewTemplateService(cs)
+	cs.UCS = NewUCSService(cs)
+	cs.Usage = NewUsageService(cs)
+	cs.User = NewUserService(cs)
+	cs.VLAN = NewVLANService(cs)
+	cs.VMGroup = NewVMGroupService(cs)
+	cs.VPC = NewVPCService(cs)
+	cs.VPN = NewVPNService(cs)
+	cs.VirtualMachine = NewVirtualMachineService(cs)
+	cs.Volume = NewVolumeService(cs)
+	cs.Zone = NewZoneService(cs)
+	return cs
+}
+
+// Default non-async client. So for async calls you need to implement and check the async job result yourself. When using
+// HTTPS with a self-signed certificate to connect to your CloudStack API, you would probably want to set 'verifyssl' to
+// false so the call ignores the SSL errors/warnings.
+func NewClient(apiurl string, apikey string, secret string, verifyssl bool) *CloudStackClient {
+	cs := newClient(apiurl, apikey, secret, false, verifyssl)
+	return cs
+}
+
+// For sync API calls this client behaves exactly the same as a standard client call, but for async API calls
+// this client will wait until the async job is finished or until the configured AsyncTimeout is reached. When the async
+// job finishes successfully it will return actual object received from the API and nil, but when the timout is
+// reached it will return the initial object containing the async job ID for the running job and a warning.
+func NewAsyncClient(apiurl string, apikey string, secret string, verifyssl bool) *CloudStackClient {
+	cs := newClient(apiurl, apikey, secret, true, verifyssl)
+	return cs
+}
+
+// When using the async client an api call will wait for the async call to finish before returning. The default is to poll for 300 seconds
+// seconds, to check if the async job is finished.
+func (cs *CloudStackClient) AsyncTimeout(timeoutInSeconds int64) {
+	cs.timeout = timeoutInSeconds
+}
+
+// Set any default options that would be added to all API calls that support it.
+func (cs *CloudStackClient) DefaultOptions(options ...OptionFunc) {
+	if options != nil {
+		cs.options = options
+	} else {
+		cs.options = []OptionFunc{}
+	}
+}
+
+var AsyncTimeoutErr = errors.New("Timeout while waiting for async job to finish")
+
+// A helper function that you can use to get the result of a running async job. If the job is not finished within the configured
+// timeout, the async job returns a AsyncTimeoutErr.
+func (cs *CloudStackClient) GetAsyncJobResult(jobid string, timeout int64) (json.RawMessage, error) {
+	var timer time.Duration
+	currentTime := time.Now().Unix()
+
+	for {
+		p := cs.Asyncjob.NewQueryAsyncJobResultParams(jobid)
+		r, err := cs.Asyncjob.QueryAsyncJobResult(p)
+		if err != nil {
+			return nil, err
+		}
+
+		// Status 1 means the job is finished successfully
+		if r.Jobstatus == 1 {
+			return r.Jobresult, nil
+		}
+
+		// When the status is 2, the job has failed
+		if r.Jobstatus == 2 {
+			if r.Jobresulttype == "text" {
+				return nil, fmt.Errorf(string(r.Jobresult))
+			} else {
+				return nil, fmt.Errorf("Undefined error: %s", string(r.Jobresult))
+			}
+		}
+
+		if time.Now().Unix()-currentTime > timeout {
+			return nil, AsyncTimeoutErr
+		}
+
+		// Add an (extremely simple) exponential backoff like feature to prevent
+		// flooding the CloudStack API
+		if timer < 15 {
+			timer++
+		}
+
+		time.Sleep(timer * time.Second)
+	}
+}
+
+// Execute the request against a CS API. Will return the raw JSON data returned by the API and nil if
+// no error occured. If the API returns an error the result will be nil and the HTTP error code and CS
+// error details. If a processing (code) error occurs the result will be nil and the generated error
+func (cs *CloudStackClient) newRequest(api string, params url.Values) (json.RawMessage, error) {
+	params.Set("apiKey", cs.apiKey)
+	params.Set("command", api)
+	params.Set("response", "json")
+
+	// Generate signature for API call
+	// * Serialize parameters, URL encoding only values and sort them by key, done by encodeValues
+	// * Convert the entire argument string to lowercase
+	// * Replace all instances of '+' to '%20'
+	// * Calculate HMAC SHA1 of argument string with CloudStack secret
+	// * URL encode the string and convert to base64
+	s := encodeValues(params)
+	s2 := strings.ToLower(s)
+	s3 := strings.Replace(s2, "+", "%20", -1)
+	mac := hmac.New(sha1.New, []byte(cs.secret))
+	mac.Write([]byte(s3))
+	signature := base64.StdEncoding.EncodeToString(mac.Sum(nil))
+
+	var err error
+	var resp *http.Response
+	if !cs.HTTPGETOnly && (api == "deployVirtualMachine" || api == "login" || api == "updateVirtualMachine") {
+		// The deployVirtualMachine API should be called using a POST call
+		// so we don't have to worry about the userdata size
+
+		// Add the unescaped signature to the POST params
+		params.Set("signature", signature)
+
+		// Make a POST call
+		resp, err = cs.client.PostForm(cs.baseURL, params)
+	} else {
+		// Create the final URL before we issue the request
+		url := cs.baseURL + "?" + s + "&signature=" + url.QueryEscape(signature)
+
+		// Make a GET call
+		resp, err = cs.client.Get(url)
+	}
+	if err != nil {
+		return nil, err
+	}
+	defer resp.Body.Close()
+
+	b, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return nil, err
+	}
+
+	// Need to get the raw value to make the result play nice
+	b, err = getRawValue(b)
+	if err != nil {
+		return nil, err
+	}
+
+	if resp.StatusCode != 200 {
+		var e CSError
+		if err := json.Unmarshal(b, &e); err != nil {
+			return nil, err
+		}
+		return nil, e.Error()
+	}
+	return b, nil
+}
+
+// Custom version of net/url Encode that only URL escapes values
+// Unmodified portions here remain under BSD license of The Go Authors: https://go.googlesource.com/go/+/master/LICENSE
+func encodeValues(v url.Values) string {
+	if v == nil {
+		return ""
+	}
+	var buf bytes.Buffer
+	keys := make([]string, 0, len(v))
+	for k := range v {
+		keys = append(keys, k)
+	}
+	sort.Strings(keys)
+	for _, k := range keys {
+		vs := v[k]
+		prefix := k + "="
+		for _, v := range vs {
+			if buf.Len() > 0 {
+				buf.WriteByte('&')
+			}
+			buf.WriteString(prefix)
+			buf.WriteString(url.QueryEscape(v))
+		}
+	}
+	return buf.String()
+}
+
+// Generic function to get the first raw value from a response as json.RawMessage
+func getRawValue(b json.RawMessage) (json.RawMessage, error) {
+	var m map[string]json.RawMessage
+	if err := json.Unmarshal(b, &m); err != nil {
+		return nil, err
+	}
+	for _, v := range m {
+		return v, nil
+	}
+	return nil, fmt.Errorf("Unable to extract the raw value from:\n\n%s\n\n", string(b))
+}
+
+// ProjectIDSetter is an interface that every type that can set a project ID must implement
+type ProjectIDSetter interface {
+	SetProjectid(string)
+}
+
+// WithProject takes either a project name or ID and sets the `projectid` parameter
+func WithProject(project string) OptionFunc {
+	return func(cs *CloudStackClient, p interface{}) error {
+		ps, ok := p.(ProjectIDSetter)
+
+		if !ok || project == "" {
+			return nil
+		}
+
+		if !IsID(project) {
+			id, _, err := cs.Project.GetProjectID(project)
+			if err != nil {
+				return err
+			}
+			project = id
+		}
+
+		ps.SetProjectid(project)
+
+		return nil
+	}
+}
+
+// VPCIDSetter is an interface that every type that can set a vpc ID must implement
+type VPCIDSetter interface {
+	SetVpcid(string)
+}
+
+// WithVPCID takes a vpc ID and sets the `vpcid` parameter
+func WithVPCID(id string) OptionFunc {
+	return func(cs *CloudStackClient, p interface{}) error {
+		vs, ok := p.(VPCIDSetter)
+
+		if !ok || id == "" {
+			return nil
+		}
+
+		vs.SetVpcid(id)
+
+		return nil
+	}
+}
+
+type APIDiscoveryService struct {
+	cs *CloudStackClient
+}
+
+func NewAPIDiscoveryService(cs *CloudStackClient) *APIDiscoveryService {
+	return &APIDiscoveryService{cs: cs}
+}
+
+type AccountService struct {
+	cs *CloudStackClient
+}
+
+func NewAccountService(cs *CloudStackClient) *AccountService {
+	return &AccountService{cs: cs}
+}
+
+type AddressService struct {
+	cs *CloudStackClient
+}
+
+func NewAddressService(cs *CloudStackClient) *AddressService {
+	return &AddressService{cs: cs}
+}
+
+type AffinityGroupService struct {
+	cs *CloudStackClient
+}
+
+func NewAffinityGroupService(cs *CloudStackClient) *AffinityGroupService {
+	return &AffinityGroupService{cs: cs}
+}
+
+type AlertService struct {
+	cs *CloudStackClient
+}
+
+func NewAlertService(cs *CloudStackClient) *AlertService {
+	return &AlertService{cs: cs}
+}
+
+type AsyncjobService struct {
+	cs *CloudStackClient
+}
+
+func NewAsyncjobService(cs *CloudStackClient) *AsyncjobService {
+	return &AsyncjobService{cs: cs}
+}
+
+type AuthenticationService struct {
+	cs *CloudStackClient
+}
+
+func NewAuthenticationService(cs *CloudStackClient) *AuthenticationService {
+	return &AuthenticationService{cs: cs}
+}
+
+type AutoScaleService struct {
+	cs *CloudStackClient
+}
+
+func NewAutoScaleService(cs *CloudStackClient) *AutoScaleService {
+	return &AutoScaleService{cs: cs}
+}
+
+type BaremetalService struct {
+	cs *CloudStackClient
+}
+
+func NewBaremetalService(cs *CloudStackClient) *BaremetalService {
+	return &BaremetalService{cs: cs}
+}
+
+type BigSwitchBCFService struct {
+	cs *CloudStackClient
+}
+
+func NewBigSwitchBCFService(cs *CloudStackClient) *BigSwitchBCFService {
+	return &BigSwitchBCFService{cs: cs}
+}
+
+type BrocadeVCSService struct {
+	cs *CloudStackClient
+}
+
+func NewBrocadeVCSService(cs *CloudStackClient) *BrocadeVCSService {
+	return &BrocadeVCSService{cs: cs}
+}
+
+type CertificateService struct {
+	cs *CloudStackClient
+}
+
+func NewCertificateService(cs *CloudStackClient) *CertificateService {
+	return &CertificateService{cs: cs}
+}
+
+type CloudIdentifierService struct {
+	cs *CloudStackClient
+}
+
+func NewCloudIdentifierService(cs *CloudStackClient) *CloudIdentifierService {
+	return &CloudIdentifierService{cs: cs}
+}
+
+type ClusterService struct {
+	cs *CloudStackClient
+}
+
+func NewClusterService(cs *CloudStackClient) *ClusterService {
+	return &ClusterService{cs: cs}
+}
+
+type ConfigurationService struct {
+	cs *CloudStackClient
+}
+
+func NewConfigurationService(cs *CloudStackClient) *ConfigurationService {
+	return &ConfigurationService{cs: cs}
+}
+
+type CustomService struct {
+	cs *CloudStackClient
+}
+
+func NewCustomService(cs *CloudStackClient) *CustomService {
+	return &CustomService{cs: cs}
+}
+
+type DiskOfferingService struct {
+	cs *CloudStackClient
+}
+
+func NewDiskOfferingService(cs *CloudStackClient) *DiskOfferingService {
+	return &DiskOfferingService{cs: cs}
+}
+
+type DomainService struct {
+	cs *CloudStackClient
+}
+
+func NewDomainService(cs *CloudStackClient) *DomainService {
+	return &DomainService{cs: cs}
+}
+
+type EventService struct {
+	cs *CloudStackClient
+}
+
+func NewEventService(cs *CloudStackClient) *EventService {
+	return &EventService{cs: cs}
+}
+
+type ExtFirewallService struct {
+	cs *CloudStackClient
+}
+
+func NewExtFirewallService(cs *CloudStackClient) *ExtFirewallService {
+	return &ExtFirewallService{cs: cs}
+}
+
+type ExtLoadBalancerService struct {
+	cs *CloudStackClient
+}
+
+func NewExtLoadBalancerService(cs *CloudStackClient) *ExtLoadBalancerService {
+	return &ExtLoadBalancerService{cs: cs}
+}
+
+type ExternalDeviceService struct {
+	cs *CloudStackClient
+}
+
+func NewExternalDeviceService(cs *CloudStackClient) *ExternalDeviceService {
+	return &ExternalDeviceService{cs: cs}
+}
+
+type FirewallService struct {
+	cs *CloudStackClient
+}
+
+func NewFirewallService(cs *CloudStackClient) *FirewallService {
+	return &FirewallService{cs: cs}
+}
+
+type GuestOSService struct {
+	cs *CloudStackClient
+}
+
+func NewGuestOSService(cs *CloudStackClient) *GuestOSService {
+	return &GuestOSService{cs: cs}
+}
+
+type HostService struct {
+	cs *CloudStackClient
+}
+
+func NewHostService(cs *CloudStackClient) *HostService {
+	return &HostService{cs: cs}
+}
+
+type HypervisorService struct {
+	cs *CloudStackClient
+}
+
+func NewHypervisorService(cs *CloudStackClient) *HypervisorService {
+	return &HypervisorService{cs: cs}
+}
+
+type ISOService struct {
+	cs *CloudStackClient
+}
+
+func NewISOService(cs *CloudStackClient) *ISOService {
+	return &ISOService{cs: cs}
+}
+
+type ImageStoreService struct {
+	cs *CloudStackClient
+}
+
+func NewImageStoreService(cs *CloudStackClient) *ImageStoreService {
+	return &ImageStoreService{cs: cs}
+}
+
+type InternalLBService struct {
+	cs *CloudStackClient
+}
+
+func NewInternalLBService(cs *CloudStackClient) *InternalLBService {
+	return &InternalLBService{cs: cs}
+}
+
+type LDAPService struct {
+	cs *CloudStackClient
+}
+
+func NewLDAPService(cs *CloudStackClient) *LDAPService {
+	return &LDAPService{cs: cs}
+}
+
+type LimitService struct {
+	cs *CloudStackClient
+}
+
+func NewLimitService(cs *CloudStackClient) *LimitService {
+	return &LimitService{cs: cs}
+}
+
+type LoadBalancerService struct {
+	cs *CloudStackClient
+}
+
+func NewLoadBalancerService(cs *CloudStackClient) *LoadBalancerService {
+	return &LoadBalancerService{cs: cs}
+}
+
+type NATService struct {
+	cs *CloudStackClient
+}
+
+func NewNATService(cs *CloudStackClient) *NATService {
+	return &NATService{cs: cs}
+}
+
+type NetworkACLService struct {
+	cs *CloudStackClient
+}
+
+func NewNetworkACLService(cs *CloudStackClient) *NetworkACLService {
+	return &NetworkACLService{cs: cs}
+}
+
+type NetworkDeviceService struct {
+	cs *CloudStackClient
+}
+
+func NewNetworkDeviceService(cs *CloudStackClient) *NetworkDeviceService {
+	return &NetworkDeviceService{cs: cs}
+}
+
+type NetworkOfferingService struct {
+	cs *CloudStackClient
+}
+
+func NewNetworkOfferingService(cs *CloudStackClient) *NetworkOfferingService {
+	return &NetworkOfferingService{cs: cs}
+}
+
+type NetworkService struct {
+	cs *CloudStackClient
+}
+
+func NewNetworkService(cs *CloudStackClient) *NetworkService {
+	return &NetworkService{cs: cs}
+}
+
+type NicService struct {
+	cs *CloudStackClient
+}
+
+func NewNicService(cs *CloudStackClient) *NicService {
+	return &NicService{cs: cs}
+}
+
+type NiciraNVPService struct {
+	cs *CloudStackClient
+}
+
+func NewNiciraNVPService(cs *CloudStackClient) *NiciraNVPService {
+	return &NiciraNVPService{cs: cs}
+}
+
+type NuageVSPService struct {
+	cs *CloudStackClient
+}
+
+func NewNuageVSPService(cs *CloudStackClient) *NuageVSPService {
+	return &NuageVSPService{cs: cs}
+}
+
+type OutofbandManagementService struct {
+	cs *CloudStackClient
+}
+
+func NewOutofbandManagementService(cs *CloudStackClient) *OutofbandManagementService {
+	return &OutofbandManagementService{cs: cs}
+}
+
+type OvsElementService struct {
+	cs *CloudStackClient
+}
+
+func NewOvsElementService(cs *CloudStackClient) *OvsElementService {
+	return &OvsElementService{cs: cs}
+}
+
+type PodService struct {
+	cs *CloudStackClient
+}
+
+func NewPodService(cs *CloudStackClient) *PodService {
+	return &PodService{cs: cs}
+}
+
+type PoolService struct {
+	cs *CloudStackClient
+}
+
+func NewPoolService(cs *CloudStackClient) *PoolService {
+	return &PoolService{cs: cs}
+}
+
+type PortableIPService struct {
+	cs *CloudStackClient
+}
+
+func NewPortableIPService(cs *CloudStackClient) *PortableIPService {
+	return &PortableIPService{cs: cs}
+}
+
+type ProjectService struct {
+	cs *CloudStackClient
+}
+
+func NewProjectService(cs *CloudStackClient) *ProjectService {
+	return &ProjectService{cs: cs}
+}
+
+type QuotaService struct {
+	cs *CloudStackClient
+}
+
+func NewQuotaService(cs *CloudStackClient) *QuotaService {
+	return &QuotaService{cs: cs}
+}
+
+type RegionService struct {
+	cs *CloudStackClient
+}
+
+func NewRegionService(cs *CloudStackClient) *RegionService {
+	return &RegionService{cs: cs}
+}
+
+type ResourcemetadataService struct {
+	cs *CloudStackClient
+}
+
+func NewResourcemetadataService(cs *CloudStackClient) *ResourcemetadataService {
+	return &ResourcemetadataService{cs: cs}
+}
+
+type ResourcetagsService struct {
+	cs *CloudStackClient
+}
+
+func NewResourcetagsService(cs *CloudStackClient) *ResourcetagsService {
+	return &ResourcetagsService{cs: cs}
+}
+
+type RoleService struct {
+	cs *CloudStackClient
+}
+
+func NewRoleService(cs *CloudStackClient) *RoleService {
+	return &RoleService{cs: cs}
+}
+
+type RouterService struct {
+	cs *CloudStackClient
+}
+
+func NewRouterService(cs *CloudStackClient) *RouterService {
+	return &RouterService{cs: cs}
+}
+
+type SSHService struct {
+	cs *CloudStackClient
+}
+
+func NewSSHService(cs *CloudStackClient) *SSHService {
+	return &SSHService{cs: cs}
+}
+
+type SecurityGroupService struct {
+	cs *CloudStackClient
+}
+
+func NewSecurityGroupService(cs *CloudStackClient) *SecurityGroupService {
+	return &SecurityGroupService{cs: cs}
+}
+
+type ServiceOfferingService struct {
+	cs *CloudStackClient
+}
+
+func NewServiceOfferingService(cs *CloudStackClient) *ServiceOfferingService {
+	return &ServiceOfferingService{cs: cs}
+}
+
+type SnapshotService struct {
+	cs *CloudStackClient
+}
+
+func NewSnapshotService(cs *CloudStackClient) *SnapshotService {
+	return &SnapshotService{cs: cs}
+}
+
+type StoragePoolService struct {
+	cs *CloudStackClient
+}
+
+func NewStoragePoolService(cs *CloudStackClient) *StoragePoolService {
+	return &StoragePoolService{cs: cs}
+}
+
+type StratosphereSSPService struct {
+	cs *CloudStackClient
+}
+
+func NewStratosphereSSPService(cs *CloudStackClient) *StratosphereSSPService {
+	return &StratosphereSSPService{cs: cs}
+}
+
+type SwiftService struct {
+	cs *CloudStackClient
+}
+
+func NewSwiftService(cs *CloudStackClient) *SwiftService {
+	return &SwiftService{cs: cs}
+}
+
+type SystemCapacityService struct {
+	cs *CloudStackClient
+}
+
+func NewSystemCapacityService(cs *CloudStackClient) *SystemCapacityService {
+	return &SystemCapacityService{cs: cs}
+}
+
+type SystemVMService struct {
+	cs *CloudStackClient
+}
+
+func NewSystemVMService(cs *CloudStackClient) *SystemVMService {
+	return &SystemVMService{cs: cs}
+}
+
+type TemplateService struct {
+	cs *CloudStackClient
+}
+
+func NewTemplateService(cs *CloudStackClient) *TemplateService {
+	return &TemplateService{cs: cs}
+}
+
+type UCSService struct {
+	cs *CloudStackClient
+}
+
+func NewUCSService(cs *CloudStackClient) *UCSService {
+	return &UCSService{cs: cs}
+}
+
+type UsageService struct {
+	cs *CloudStackClient
+}
+
+func NewUsageService(cs *CloudStackClient) *UsageService {
+	return &UsageService{cs: cs}
+}
+
+type UserService struct {
+	cs *CloudStackClient
+}
+
+func NewUserService(cs *CloudStackClient) *UserService {
+	return &UserService{cs: cs}
+}
+
+type VLANService struct {
+	cs *CloudStackClient
+}
+
+func NewVLANService(cs *CloudStackClient) *VLANService {
+	return &VLANService{cs: cs}
+}
+
+type VMGroupService struct {
+	cs *CloudStackClient
+}
+
+func NewVMGroupService(cs *CloudStackClient) *VMGroupService {
+	return &VMGroupService{cs: cs}
+}
+
+type VPCService struct {
+	cs *CloudStackClient
+}
+
+func NewVPCService(cs *CloudStackClient) *VPCService {
+	return &VPCService{cs: cs}
+}
+
+type VPNService struct {
+	cs *CloudStackClient
+}
+
+func NewVPNService(cs *CloudStackClient) *VPNService {
+	return &VPNService{cs: cs}
+}
+
+type VirtualMachineService struct {
+	cs *CloudStackClient
+}
+
+func NewVirtualMachineService(cs *CloudStackClient) *VirtualMachineService {
+	return &VirtualMachineService{cs: cs}
+}
+
+type VolumeService struct {
+	cs *CloudStackClient
+}
+
+func NewVolumeService(cs *CloudStackClient) *VolumeService {
+	return &VolumeService{cs: cs}
+}
+
+type ZoneService struct {
+	cs *CloudStackClient
+}
+
+func NewZoneService(cs *CloudStackClient) *ZoneService {
+	return &ZoneService{cs: cs}
+}
diff --git a/vendor/github.com/xanzy/go-cloudstack/generate/generate.go b/vendor/github.com/xanzy/go-cloudstack/generate/generate.go
new file mode 100644
index 0000000..219f574
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/generate/generate.go
@@ -0,0 +1,1413 @@
+//
+// Copyright 2018, Sander van Harmelen
+//
+// Licensed 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 main
+
+import (
+	"bytes"
+	"encoding/json"
+	"flag"
+	"fmt"
+	"go/format"
+	"io/ioutil"
+	"log"
+	"os"
+	"os/exec"
+	"path"
+	"sort"
+	"strings"
+	"unicode"
+)
+
+type apiInfo map[string][]string
+
+const pkg = "cloudstack"
+
+type allServices struct {
+	services services
+}
+
+type apiInfoNotFoundError struct {
+	api string
+}
+
+func (e *apiInfoNotFoundError) Error() string {
+	return fmt.Sprintf("Could not find API details for: %s", e.api)
+}
+
+type generateError struct {
+	service *service
+	error   error
+}
+
+func (e *generateError) Error() string {
+	return fmt.Sprintf("API %s failed to generate code: %v", e.service.name, e.error)
+}
+
+type goimportError struct {
+	output string
+}
+
+func (e *goimportError) Error() string {
+	return fmt.Sprintf("GoImport failed to format:\n%v", e.output)
+}
+
+type service struct {
+	name string
+	apis []*API
+
+	p  func(format string, args ...interface{}) // print raw
+	pn func(format string, args ...interface{}) // print with indent and newline
+}
+
+type services []*service
+
+// Add functions for the Sort interface
+func (s services) Len() int {
+	return len(s)
+}
+
+func (s services) Less(i, j int) bool {
+	return s[i].name < s[j].name
+}
+
+func (s services) Swap(i, j int) {
+	s[i], s[j] = s[j], s[i]
+}
+
+// APIParams represents a list of API params
+type APIParams []*APIParam
+
+// Add functions for the Sort interface
+func (s APIParams) Len() int {
+	return len(s)
+}
+
+func (s APIParams) Less(i, j int) bool {
+	return s[i].Name < s[j].Name
+}
+
+func (s APIParams) Swap(i, j int) {
+	s[i], s[j] = s[j], s[i]
+}
+
+// API represents an API endpoint we can call
+type API struct {
+	Name        string       `json:"name"`
+	Description string       `json:"description"`
+	Isasync     bool         `json:"isasync"`
+	Params      APIParams    `json:"params"`
+	Response    APIResponses `json:"response"`
+}
+
+// APIParam represents a single API parameter
+type APIParam struct {
+	Name        string `json:"name"`
+	Description string `json:"description"`
+	Type        string `json:"type"`
+	Required    bool   `json:"required"`
+}
+
+// APIResponse represents a API response
+type APIResponse struct {
+	Name        string       `json:"name"`
+	Description string       `json:"description"`
+	Type        string       `json:"type"`
+	Response    APIResponses `json:"response"`
+}
+
+// APIResponses represents a list of API responses
+type APIResponses []*APIResponse
+
+// Add functions for the Sort interface
+func (s APIResponses) Len() int {
+	return len(s)
+}
+
+func (s APIResponses) Less(i, j int) bool {
+	return s[i].Name < s[j].Name
+}
+
+func (s APIResponses) Swap(i, j int) {
+	s[i], s[j] = s[j], s[i]
+}
+
+func main() {
+	listApis := flag.String("api", "listApis.json", "path to the saved JSON output of listApis")
+	flag.Parse()
+
+	as, errors, err := getAllServices(*listApis)
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	if err = as.WriteGeneralCode(); err != nil {
+		log.Fatal(err)
+	}
+
+	for _, s := range as.services {
+		if err = s.WriteGeneratedCode(); err != nil {
+			errors = append(errors, &generateError{s, err})
+		}
+	}
+
+	outdir, err := sourceDir()
+	if err != nil {
+		log.Fatal(err)
+	}
+	out, err := exec.Command("goimports", "-w", outdir).CombinedOutput()
+	if err != nil {
+		errors = append(errors, &goimportError{string(out)})
+	}
+
+	if len(errors) > 0 {
+		log.Printf("%d API(s) failed to generate:", len(errors))
+		for _, ce := range errors {
+			log.Printf(ce.Error())
+		}
+		os.Exit(1)
+	}
+}
+
+func (as *allServices) WriteGeneralCode() error {
+	outdir, err := sourceDir()
+	if err != nil {
+		log.Fatalf("Failed to get source dir: %s", err)
+	}
+
+	code, err := as.GeneralCode()
+	if err != nil {
+		return err
+	}
+
+	file := path.Join(outdir, "cloudstack.go")
+	return ioutil.WriteFile(file, code, 0644)
+}
+
+func (as *allServices) GeneralCode() ([]byte, error) {
+	// Buffer the output in memory, for gofmt'ing later in the defer.
+	var buf bytes.Buffer
+	p := func(format string, args ...interface{}) {
+		_, err := fmt.Fprintf(&buf, format, args...)
+		if err != nil {
+			panic(err)
+		}
+	}
+	pn := func(format string, args ...interface{}) {
+		p(format+"\n", args...)
+	}
+	pn("//")
+	pn("// Copyright 2018, Sander van Harmelen")
+	pn("//")
+	pn("// Licensed under the Apache License, Version 2.0 (the \"License\");")
+	pn("// you may not use this file except in compliance with the License.")
+	pn("// You may obtain a copy of the License at")
+	pn("//")
+	pn("//     http://www.apache.org/licenses/LICENSE-2.0")
+	pn("//")
+	pn("// Unless required by applicable law or agreed to in writing, software")
+	pn("// distributed under the License is distributed on an \"AS IS\" BASIS,")
+	pn("// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.")
+	pn("// See the License for the specific language governing permissions and")
+	pn("// limitations under the License.")
+	pn("//")
+	pn("")
+	pn("package %s", pkg)
+	pn("")
+	pn("// UnlimitedResourceID is a special ID to define an unlimited resource")
+	pn("const UnlimitedResourceID = \"-1\"")
+	pn("")
+	pn("var idRegex = regexp.MustCompile(`^([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}|-1)$`)")
+	pn("")
+	pn("// IsID return true if the passed ID is either a UUID or a UnlimitedResourceID")
+	pn("func IsID(id string) bool {")
+	pn("	return idRegex.MatchString(id)")
+	pn("}")
+	pn("")
+	pn("// OptionFunc can be passed to the courtesy helper functions to set additional parameters")
+	pn("type OptionFunc func(*CloudStackClient, interface{}) error")
+	pn("")
+	pn("type CSError struct {")
+	pn("	ErrorCode   int    `json:\"errorcode\"`")
+	pn("	CSErrorCode int    `json:\"cserrorcode\"`")
+	pn("	ErrorText   string `json:\"errortext\"`")
+	pn("}")
+	pn("")
+	pn("func (e *CSError) Error() error {")
+	pn("	return fmt.Errorf(\"CloudStack API error %%d (CSExceptionErrorCode: %%d): %%s\", e.ErrorCode, e.CSErrorCode, e.ErrorText)")
+	pn("}")
+	pn("")
+	pn("type CloudStackClient struct {")
+	pn("	HTTPGETOnly bool // If `true` only use HTTP GET calls")
+	pn("")
+	pn("	client  *http.Client // The http client for communicating")
+	pn("	baseURL string       // The base URL of the API")
+	pn("	apiKey  string       // Api key")
+	pn("	secret  string       // Secret key")
+	pn("	async   bool         // Wait for async calls to finish")
+	pn("	options []OptionFunc // A list of option functions to apply to all API calls")
+	pn("	timeout int64        // Max waiting timeout in seconds for async jobs to finish; defaults to 300 seconds")
+	pn("")
+	for _, s := range as.services {
+		pn("  %s *%s", strings.TrimSuffix(s.name, "Service"), s.name)
+	}
+	pn("}")
+	pn("")
+	pn("// Creates a new client for communicating with CloudStack")
+	pn("func newClient(apiurl string, apikey string, secret string, async bool, verifyssl bool) *CloudStackClient {")
+	pn("	jar, _ := cookiejar.New(nil)")
+	pn("	cs := &CloudStackClient{")
+	pn("		client: &http.Client{")
+	pn("			Jar: jar,")
+	pn("			Transport: &http.Transport{")
+	pn("				Proxy:           http.ProxyFromEnvironment,")
+	pn("				TLSClientConfig: &tls.Config{InsecureSkipVerify: !verifyssl}, // If verifyssl is true, skipping the verify should be false and vice versa")
+	pn("			},")
+	pn("		Timeout: time.Duration(60 * time.Second),")
+	pn("		},")
+	pn("		baseURL: apiurl,")
+	pn("		apiKey:  apikey,")
+	pn("		secret:  secret,")
+	pn("		async:   async,")
+	pn("		options: []OptionFunc{},")
+	pn("		timeout: 300,")
+	pn("	}")
+	for _, s := range as.services {
+		pn("	cs.%s = New%s(cs)", strings.TrimSuffix(s.name, "Service"), s.name)
+	}
+	pn("	return cs")
+	pn("}")
+	pn("")
+	pn("// Default non-async client. So for async calls you need to implement and check the async job result yourself. When using")
+	pn("// HTTPS with a self-signed certificate to connect to your CloudStack API, you would probably want to set 'verifyssl' to")
+	pn("// false so the call ignores the SSL errors/warnings.")
+	pn("func NewClient(apiurl string, apikey string, secret string, verifyssl bool) *CloudStackClient {")
+	pn("	cs := newClient(apiurl, apikey, secret, false, verifyssl)")
+	pn("	return cs")
+	pn("}")
+	pn("")
+	pn("// For sync API calls this client behaves exactly the same as a standard client call, but for async API calls")
+	pn("// this client will wait until the async job is finished or until the configured AsyncTimeout is reached. When the async")
+	pn("// job finishes successfully it will return actual object received from the API and nil, but when the timout is")
+	pn("// reached it will return the initial object containing the async job ID for the running job and a warning.")
+	pn("func NewAsyncClient(apiurl string, apikey string, secret string, verifyssl bool) *CloudStackClient {")
+	pn("	cs := newClient(apiurl, apikey, secret, true, verifyssl)")
+	pn("	return cs")
+	pn("}")
+	pn("")
+	pn("// When using the async client an api call will wait for the async call to finish before returning. The default is to poll for 300 seconds")
+	pn("// seconds, to check if the async job is finished.")
+	pn("func (cs *CloudStackClient) AsyncTimeout(timeoutInSeconds int64) {")
+	pn("	cs.timeout = timeoutInSeconds")
+	pn("}")
+	pn("")
+	pn("// Set any default options that would be added to all API calls that support it.")
+	pn("func (cs *CloudStackClient) DefaultOptions(options ...OptionFunc) {")
+	pn("	if options != nil {")
+	pn("		cs.options = options")
+	pn("	} else {")
+	pn("		cs.options = []OptionFunc{}")
+	pn("	}")
+	pn("}")
+	pn("")
+	pn("var AsyncTimeoutErr = errors.New(\"Timeout while waiting for async job to finish\")")
+	pn("")
+	pn("// A helper function that you can use to get the result of a running async job. If the job is not finished within the configured")
+	pn("// timeout, the async job returns a AsyncTimeoutErr.")
+	pn("func (cs *CloudStackClient) GetAsyncJobResult(jobid string, timeout int64) (json.RawMessage, error) {")
+	pn("	var timer time.Duration")
+	pn("	currentTime := time.Now().Unix()")
+	pn("")
+	pn("		for {")
+	pn("		p := cs.Asyncjob.NewQueryAsyncJobResultParams(jobid)")
+	pn("		r, err := cs.Asyncjob.QueryAsyncJobResult(p)")
+	pn("		if err != nil {")
+	pn("			return nil, err")
+	pn("		}")
+	pn("")
+	pn("		// Status 1 means the job is finished successfully")
+	pn("		if r.Jobstatus == 1 {")
+	pn("			return r.Jobresult, nil")
+	pn("		}")
+	pn("")
+	pn("		// When the status is 2, the job has failed")
+	pn("		if r.Jobstatus == 2 {")
+	pn("			if r.Jobresulttype == \"text\" {")
+	pn("				return nil, fmt.Errorf(string(r.Jobresult))")
+	pn("			} else {")
+	pn("				return nil, fmt.Errorf(\"Undefined error: %%s\", string(r.Jobresult))")
+	pn("			}")
+	pn("		}")
+	pn("")
+	pn("		if time.Now().Unix()-currentTime > timeout {")
+	pn("			return nil, AsyncTimeoutErr")
+	pn("		}")
+	pn("")
+	pn("		// Add an (extremely simple) exponential backoff like feature to prevent")
+	pn("		// flooding the CloudStack API")
+	pn("		if timer < 15 {")
+	pn("			timer++")
+	pn("		}")
+	pn("")
+	pn("		time.Sleep(timer * time.Second)")
+	pn("	}")
+	pn("}")
+	pn("")
+	pn("// Execute the request against a CS API. Will return the raw JSON data returned by the API and nil if")
+	pn("// no error occured. If the API returns an error the result will be nil and the HTTP error code and CS")
+	pn("// error details. If a processing (code) error occurs the result will be nil and the generated error")
+	pn("func (cs *CloudStackClient) newRequest(api string, params url.Values) (json.RawMessage, error) {")
+	pn("	params.Set(\"apiKey\", cs.apiKey)")
+	pn("	params.Set(\"command\", api)")
+	pn("	params.Set(\"response\", \"json\")")
+	pn("")
+	pn("	// Generate signature for API call")
+	pn("	// * Serialize parameters, URL encoding only values and sort them by key, done by encodeValues")
+	pn("	// * Convert the entire argument string to lowercase")
+	pn("	// * Replace all instances of '+' to '%%20'")
+	pn("	// * Calculate HMAC SHA1 of argument string with CloudStack secret")
+	pn("	// * URL encode the string and convert to base64")
+	pn("	s := encodeValues(params)")
+	pn("	s2 := strings.ToLower(s)")
+	pn("	s3 := strings.Replace(s2, \"+\", \"%%20\", -1)")
+	pn("	mac := hmac.New(sha1.New, []byte(cs.secret))")
+	pn("	mac.Write([]byte(s3))")
+	pn("	signature := base64.StdEncoding.EncodeToString(mac.Sum(nil))")
+	pn("")
+	pn("	var err error")
+	pn("	var resp *http.Response")
+	pn("	if !cs.HTTPGETOnly && (api == \"deployVirtualMachine\" || api == \"login\" || api == \"updateVirtualMachine\") {")
+	pn("		// The deployVirtualMachine API should be called using a POST call")
+	pn("  	// so we don't have to worry about the userdata size")
+	pn("")
+	pn("		// Add the unescaped signature to the POST params")
+	pn("		params.Set(\"signature\", signature)")
+	pn("")
+	pn("		// Make a POST call")
+	pn("		resp, err = cs.client.PostForm(cs.baseURL, params)")
+	pn("	} else {")
+	pn("		// Create the final URL before we issue the request")
+	pn("		url := cs.baseURL + \"?\" + s + \"&signature=\" + url.QueryEscape(signature)")
+	pn("")
+	pn("		// Make a GET call")
+	pn("		resp, err = cs.client.Get(url)")
+	pn("	}")
+	pn("	if err != nil {")
+	pn("		return nil, err")
+	pn("	}")
+	pn("	defer resp.Body.Close()")
+	pn("")
+	pn("	b, err := ioutil.ReadAll(resp.Body)")
+	pn("	if err != nil {")
+	pn("		return nil, err")
+	pn("	}")
+	pn("")
+	pn("	// Need to get the raw value to make the result play nice")
+	pn("	b, err = getRawValue(b)")
+	pn("	if err != nil {")
+	pn("		return nil, err")
+	pn("	}")
+	pn("")
+	pn("	if resp.StatusCode != 200 {")
+	pn("		var e CSError")
+	pn("		if err := json.Unmarshal(b, &e); err != nil {")
+	pn("			return nil, err")
+	pn("		}")
+	pn("		return nil, e.Error()")
+	pn("	}")
+	pn("	return b, nil")
+	pn("}")
+	pn("")
+	pn("// Custom version of net/url Encode that only URL escapes values")
+	pn("// Unmodified portions here remain under BSD license of The Go Authors: https://go.googlesource.com/go/+/master/LICENSE")
+	pn("func encodeValues(v url.Values) string {")
+	pn("	if v == nil {")
+	pn("		return \"\"")
+	pn("	}")
+	pn("	var buf bytes.Buffer")
+	pn("	keys := make([]string, 0, len(v))")
+	pn("	for k := range v {")
+	pn("		keys = append(keys, k)")
+	pn("	}")
+	pn("	sort.Strings(keys)")
+	pn("	for _, k := range keys {")
+	pn("		vs := v[k]")
+	pn("		prefix := k + \"=\"")
+	pn("		for _, v := range vs {")
+	pn("			if buf.Len() > 0 {")
+	pn("				buf.WriteByte('&')")
+	pn("			}")
+	pn("			buf.WriteString(prefix)")
+	pn("			buf.WriteString(url.QueryEscape(v))")
+	pn("		}")
+	pn("	}")
+	pn("	return buf.String()")
+	pn("}")
+	pn("")
+	pn("// Generic function to get the first raw value from a response as json.RawMessage")
+	pn("func getRawValue(b json.RawMessage) (json.RawMessage, error) {")
+	pn("	var m map[string]json.RawMessage")
+	pn("	if err := json.Unmarshal(b, &m); err != nil {")
+	pn("		return nil, err")
+	pn("	}")
+	pn("	for _, v := range m {")
+	pn("		return v, nil")
+	pn("	}")
+	pn("	return nil, fmt.Errorf(\"Unable to extract the raw value from:\\n\\n%%s\\n\\n\", string(b))")
+	pn("}")
+	pn("")
+	pn("// ProjectIDSetter is an interface that every type that can set a project ID must implement")
+	pn("type ProjectIDSetter interface {")
+	pn("	SetProjectid(string)")
+	pn("}")
+	pn("")
+	pn("// WithProject takes either a project name or ID and sets the `projectid` parameter")
+	pn("func WithProject(project string) OptionFunc {")
+	pn("	return func(cs *CloudStackClient, p interface{}) error {")
+	pn("		ps, ok := p.(ProjectIDSetter)")
+	pn("")
+	pn("		if !ok || project == \"\" {")
+	pn("			return nil")
+	pn("		}")
+	pn("")
+	pn("		if !IsID(project) {")
+	pn("			id, _, err := cs.Project.GetProjectID(project)")
+	pn("			if err != nil {")
+	pn("				return err")
+	pn("			}")
+	pn("			project = id")
+	pn("		}")
+	pn("")
+	pn("		ps.SetProjectid(project)")
+	pn("")
+	pn("		return nil")
+	pn("	}")
+	pn("}")
+	pn("")
+	pn("// VPCIDSetter is an interface that every type that can set a vpc ID must implement")
+	pn("type VPCIDSetter interface {")
+	pn("	SetVpcid(string)")
+	pn("}")
+	pn("")
+	pn("// WithVPCID takes a vpc ID and sets the `vpcid` parameter")
+	pn("func WithVPCID(id string) OptionFunc {")
+	pn("	return func(cs *CloudStackClient, p interface{}) error {")
+	pn("		vs, ok := p.(VPCIDSetter)")
+	pn("")
+	pn("		if !ok || id == \"\" {")
+	pn("			return nil")
+	pn("		}")
+	pn("")
+	pn("		vs.SetVpcid(id)")
+	pn("")
+	pn("		return nil")
+	pn("	}")
+	pn("}")
+	pn("")
+	for _, s := range as.services {
+		pn("type %s struct {", s.name)
+		pn("  cs *CloudStackClient")
+		pn("}")
+		pn("")
+		pn("func New%s(cs *CloudStackClient) *%s {", s.name, s.name)
+		pn("	return &%s{cs: cs}", s.name)
+		pn("}")
+		pn("")
+	}
+
+	clean, err := format.Source(buf.Bytes())
+	if err != nil {
+		return buf.Bytes(), err
+	}
+	return clean, err
+}
+
+func (s *service) WriteGeneratedCode() error {
+	outdir, err := sourceDir()
+	if err != nil {
+		log.Fatalf("Failed to get source dir: %s", err)
+	}
+
+	code, err := s.GenerateCode()
+	if err != nil {
+		return err
+	}
+
+	file := path.Join(outdir, s.name+".go")
+	return ioutil.WriteFile(file, code, 0644)
+}
+
+func (s *service) GenerateCode() ([]byte, error) {
+	// Buffer the output in memory, for gofmt'ing later in the defer.
+	var buf bytes.Buffer
+	s.p = func(format string, args ...interface{}) {
+		_, err := fmt.Fprintf(&buf, format, args...)
+		if err != nil {
+			panic(err)
+		}
+	}
+	s.pn = func(format string, args ...interface{}) {
+		s.p(format+"\n", args...)
+	}
+	pn := s.pn
+
+	pn("//")
+	pn("// Copyright 2018, Sander van Harmelen")
+	pn("//")
+	pn("// Licensed under the Apache License, Version 2.0 (the \"License\");")
+	pn("// you may not use this file except in compliance with the License.")
+	pn("// You may obtain a copy of the License at")
+	pn("//")
+	pn("//     http://www.apache.org/licenses/LICENSE-2.0")
+	pn("//")
+	pn("// Unless required by applicable law or agreed to in writing, software")
+	pn("// distributed under the License is distributed on an \"AS IS\" BASIS,")
+	pn("// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.")
+	pn("// See the License for the specific language governing permissions and")
+	pn("// limitations under the License.")
+	pn("//")
+	pn("")
+	pn("package %s", pkg)
+	pn("")
+	if s.name == "FirewallService" {
+		pn("// Helper function for maintaining backwards compatibility")
+		pn("func convertFirewallServiceResponse(b []byte) ([]byte, error) {")
+		pn("	var raw map[string]interface{}")
+		pn("	if err := json.Unmarshal(b, &raw); err != nil {")
+		pn("		return nil, err")
+		pn("	}")
+		pn("")
+		pn("	if _, ok := raw[\"firewallrule\"]; ok {")
+		pn("		return convertFirewallServiceListResponse(b)")
+		pn("	}")
+		pn("")
+		pn("	for _, k := range []string{\"endport\", \"startport\"} {")
+		pn("		if sVal, ok := raw[k].(string); ok {")
+		pn("			iVal, err := strconv.Atoi(sVal)")
+		pn("			if err != nil {")
+		pn("				return nil, err")
+		pn("			}")
+		pn("			raw[k] = iVal")
+		pn("		}")
+		pn("	}")
+		pn("")
+		pn("	return json.Marshal(raw)")
+		pn("}")
+		pn("")
+		pn("// Helper function for maintaining backwards compatibility")
+		pn("func convertFirewallServiceListResponse(b []byte) ([]byte, error) {")
+		pn("	var rawList struct {")
+		pn("		Count         int                      `json:\"count\"`")
+		pn("		FirewallRules []map[string]interface{} `json:\"firewallrule\"`")
+		pn("	}")
+		pn("")
+		pn("	if err := json.Unmarshal(b, &rawList); err != nil {")
+		pn("		return nil, err")
+		pn("	}")
+		pn("")
+		pn("	for _, r := range rawList.FirewallRules {")
+		pn("		for _, k := range []string{\"endport\", \"startport\"} {")
+		pn("			if sVal, ok := r[k].(string); ok {")
+		pn("				iVal, err := strconv.Atoi(sVal)")
+		pn("				if err != nil {")
+		pn("					return nil, err")
+		pn("				}")
+		pn("				r[k] = iVal")
+		pn("			}")
+		pn("		}")
+		pn("	}")
+		pn("")
+		pn("	return json.Marshal(rawList)")
+		pn("}")
+		pn("")
+	}
+	if s.name == "SecurityGroupService" {
+		pn("// Helper function for maintaining backwards compatibility")
+		pn("func convertAuthorizeSecurityGroupIngressResponse(b []byte) ([]byte, error) {")
+		pn("	var raw struct {")
+		pn("		Ingressrule []interface{} `json:\"ingressrule\"`")
+		pn("	}")
+		pn("	if err := json.Unmarshal(b, &raw); err != nil {")
+		pn("		return nil, err")
+		pn("	}")
+		pn("")
+		pn("	if len(raw.Ingressrule) != 1 {")
+		pn("		return b, nil")
+		pn("	}")
+		pn("")
+		pn("	return json.Marshal(raw.Ingressrule[0])")
+		pn("}")
+		pn("")
+		pn("// Helper function for maintaining backwards compatibility")
+		pn("func convertAuthorizeSecurityGroupEgressResponse(b []byte) ([]byte, error) {")
+		pn("	var raw struct {")
+		pn("		Egressrule []interface{} `json:\"egressrule\"`")
+		pn("	}")
+		pn("	if err := json.Unmarshal(b, &raw); err != nil {")
+		pn("		return nil, err")
+		pn("	}")
+		pn("")
+		pn("	if len(raw.Egressrule) != 1 {")
+		pn("		return b, nil")
+		pn("	}")
+		pn("")
+		pn("	return json.Marshal(raw.Egressrule[0])")
+		pn("}")
+		pn("")
+	}
+	if s.name == "CustomService" {
+		pn("type CustomServiceParams struct {")
+		pn("	p map[string]interface{}")
+		pn("}")
+		pn("")
+		pn("func (p *CustomServiceParams) toURLValues() url.Values {")
+		pn("	u := url.Values{}")
+		pn("	if p.p == nil {")
+		pn("		return u")
+		pn("	}")
+		pn("")
+		pn("	for k, v := range p.p {")
+		pn("		switch t := v.(type) {")
+		pn("		case bool:")
+		pn("			u.Set(k, strconv.FormatBool(t))")
+		pn("		case int:")
+		pn("			u.Set(k, strconv.Itoa(t))")
+		pn("		case int64:")
+		pn("			vv := strconv.FormatInt(t, 10)")
+		pn("			u.Set(k, vv)")
+		pn("		case string:")
+		pn("			u.Set(k, t)")
+		pn("		case []string:")
+		pn("			u.Set(k, strings.Join(t, \", \"))")
+		pn("		case map[string]string:")
+		pn("			i := 0")
+		pn("			for kk, vv := range t {")
+		pn("				u.Set(fmt.Sprintf(\"%%s[%%d].%%s\", k, i, kk), vv)")
+		pn("				i++")
+		pn("			}")
+		pn("		}")
+		pn("	}")
+		pn("")
+		pn("	return u")
+		pn("}")
+		pn("")
+		pn("func (p *CustomServiceParams) SetParam(param string, v interface{}) {")
+		pn("	if p.p == nil {")
+		pn("		p.p = make(map[string]interface{})")
+		pn("	}")
+		pn("	p.p[param] = v")
+		pn("	return")
+		pn("}")
+		pn("")
+		pn("func (s *CustomService) CustomRequest(api string, p *CustomServiceParams, result interface{}) error {")
+		pn("	resp, err := s.cs.newRequest(api, p.toURLValues())")
+		pn("	if err != nil {")
+		pn("		return err")
+		pn("	}")
+		pn("")
+		pn("	return json.Unmarshal(resp, result)")
+		pn("}")
+	}
+
+	for _, a := range s.apis {
+		s.generateParamType(a)
+		s.generateToURLValuesFunc(a)
+		s.generateParamSettersFunc(a)
+		s.generateNewParamTypeFunc(a)
+		s.generateHelperFuncs(a)
+		s.generateNewAPICallFunc(a)
+		s.generateResponseType(a)
+	}
+
+	clean, err := format.Source(buf.Bytes())
+	if err != nil {
+		buf.WriteTo(os.Stdout)
+		return buf.Bytes(), err
+	}
+	return clean, nil
+}
+
+func (s *service) generateParamType(a *API) {
+	pn := s.pn
+
+	pn("type %s struct {", capitalize(a.Name+"Params"))
+	pn("	p map[string]interface{}")
+	pn("}\n")
+	return
+}
+
+func (s *service) generateToURLValuesFunc(a *API) {
+	pn := s.pn
+
+	pn("func (p *%s) toURLValues() url.Values {", capitalize(a.Name+"Params"))
+	pn("	u := url.Values{}")
+	pn("	if p.p == nil {")
+	pn("		return u")
+	pn("	}")
+	for _, ap := range a.Params {
+		pn("	if v, found := p.p[\"%s\"]; found {", ap.Name)
+		s.generateConvertCode(ap.Name, mapType(ap.Type))
+		pn("	}")
+	}
+	pn("	return u")
+	pn("}")
+	pn("")
+	return
+}
+
+func (s *service) generateConvertCode(name, typ string) {
+	pn := s.pn
+
+	switch typ {
+	case "string":
+		pn("u.Set(\"%s\", v.(string))", name)
+	case "int":
+		pn("vv := strconv.Itoa(v.(int))")
+		pn("u.Set(\"%s\", vv)", name)
+	case "int64":
+		pn("vv := strconv.FormatInt(v.(int64), 10)")
+		pn("u.Set(\"%s\", vv)", name)
+	case "bool":
+		pn("vv := strconv.FormatBool(v.(bool))")
+		pn("u.Set(\"%s\", vv)", name)
+	case "[]string":
+		pn("vv := strings.Join(v.([]string), \",\")")
+		pn("u.Set(\"%s\", vv)", name)
+	case "map[string]string":
+		pn("i := 0")
+		pn("for k, vv := range v.(map[string]string) {")
+		switch name {
+		case "details":
+			pn("	u.Set(fmt.Sprintf(\"%s[%%d].%%s\", i, k), vv)", name)
+		case "serviceproviderlist":
+			pn("	u.Set(fmt.Sprintf(\"%s[%%d].service\", i), k)", name)
+			pn("	u.Set(fmt.Sprintf(\"%s[%%d].provider\", i), vv)", name)
+		case "usersecuritygrouplist":
+			pn("	u.Set(fmt.Sprintf(\"%s[%%d].account\", i), k)", name)
+			pn("	u.Set(fmt.Sprintf(\"%s[%%d].group\", i), vv)", name)
+		default:
+			pn("	u.Set(fmt.Sprintf(\"%s[%%d].key\", i), k)", name)
+			pn("	u.Set(fmt.Sprintf(\"%s[%%d].value\", i), vv)", name)
+		}
+		pn("	i++")
+		pn("}")
+	}
+	return
+}
+
+func (s *service) parseParamName(name string) string {
+	if name != "type" {
+		return name
+	}
+	return uncapitalize(strings.TrimSuffix(s.name, "Service")) + "Type"
+}
+
+func (s *service) generateParamSettersFunc(a *API) {
+	pn := s.pn
+	found := make(map[string]bool)
+
+	for _, ap := range a.Params {
+		if !found[ap.Name] {
+			pn("func (p *%s) Set%s(v %s) {", capitalize(a.Name+"Params"), capitalize(ap.Name), mapType(ap.Type))
+			pn("	if p.p == nil {")
+			pn("		p.p = make(map[string]interface{})")
+			pn("	}")
+			pn("	p.p[\"%s\"] = v", ap.Name)
+			pn("	return")
+			pn("}")
+			pn("")
+			found[ap.Name] = true
+		}
+	}
+	return
+}
+
+func (s *service) generateNewParamTypeFunc(a *API) {
+	p, pn := s.p, s.pn
+	tn := capitalize(a.Name + "Params")
+	rp := APIParams{}
+
+	// Generate the function signature
+	pn("// You should always use this function to get a new %s instance,", tn)
+	pn("// as then you are sure you have configured all required params")
+	p("func (s *%s) New%s(", s.name, tn)
+	for _, ap := range a.Params {
+		if ap.Required {
+			rp = append(rp, ap)
+			p("%s %s, ", s.parseParamName(ap.Name), mapType(ap.Type))
+		}
+	}
+	pn(") *%s {", tn)
+
+	// Generate the function body
+	pn("	p := &%s{}", tn)
+	pn("	p.p = make(map[string]interface{})")
+	sort.Sort(rp)
+	for _, ap := range rp {
+		pn("	p.p[\"%s\"] = %s", ap.Name, s.parseParamName(ap.Name))
+	}
+	pn("	return p")
+	pn("}")
+	pn("")
+	return
+}
+
+func (s *service) generateHelperFuncs(a *API) {
+	p, pn := s.p, s.pn
+
+	if strings.HasPrefix(a.Name, "list") {
+		v, found := hasNameOrKeywordParamField(a.Params)
+		if found && hasIDAndNameResponseField(a.Response) {
+			ln := strings.TrimPrefix(a.Name, "list")
+
+			// Check if ID is a required parameters and bail if so
+			for _, ap := range a.Params {
+				if ap.Required && ap.Name == "id" {
+					return
+				}
+			}
+
+			// Generate the function signature
+			pn("// This is a courtesy helper function, which in some cases may not work as expected!")
+			p("func (s *%s) Get%sID(%s string, ", s.name, parseSingular(ln), v)
+			for _, ap := range a.Params {
+				if ap.Required {
+					p("%s %s, ", s.parseParamName(ap.Name), mapType(ap.Type))
+				}
+			}
+			if parseSingular(ln) == "Iso" {
+				p("isofilter string, ")
+			}
+			if parseSingular(ln) == "Template" || parseSingular(ln) == "Iso" {
+				p("zoneid string, ")
+			}
+			pn("opts ...OptionFunc) (string, int, error) {")
+
+			// Generate the function body
+			pn("	p := &List%sParams{}", ln)
+			pn("	p.p = make(map[string]interface{})")
+			pn("")
+			pn("	p.p[\"%s\"] = %s", v, v)
+			for _, ap := range a.Params {
+				if ap.Required {
+					pn("	p.p[\"%s\"] = %s", ap.Name, s.parseParamName(ap.Name))
+				}
+			}
+			if parseSingular(ln) == "Iso" {
+				pn("	p.p[\"isofilter\"] = isofilter")
+			}
+			if parseSingular(ln) == "Template" || parseSingular(ln) == "Iso" {
+				pn("	p.p[\"zoneid\"] = zoneid")
+			}
+			pn("")
+			pn("	for _, fn := range append(s.cs.options, opts...) {")
+			pn("		if err := fn(s.cs, p); err != nil {")
+			pn("			return \"\", -1, err")
+			pn("		}")
+			pn("	}")
+			pn("")
+			pn("	l, err := s.List%s(p)", ln)
+			pn("	if err != nil {")
+			pn("		return \"\", -1, err")
+			pn("	}")
+			pn("")
+			if ln == "AffinityGroups" {
+				pn("	// This is needed because of a bug with the listAffinityGroup call. It reports the")
+				pn("	// number of VirtualMachines in the groups as being the number of groups found.")
+				pn("	l.Count = len(l.%s)", ln)
+				pn("")
+			}
+			pn("	if l.Count == 0 {")
+			pn("	  return \"\", l.Count, fmt.Errorf(\"No match found for %%s: %%+v\", %s, l)", v)
+			pn("	}")
+			pn("")
+			pn("	if l.Count == 1 {")
+			pn("	  return l.%s[0].Id, l.Count, nil", ln)
+			pn("	}")
+			pn("")
+			pn(" 	if l.Count > 1 {")
+			pn("    for _, v := range l.%s {", ln)
+			pn("      if v.Name == %s {", v)
+			pn("        return v.Id, l.Count, nil")
+			pn("      }")
+			pn("    }")
+			pn("	}")
+			pn("  return \"\", l.Count, fmt.Errorf(\"Could not find an exact match for %%s: %%+v\", %s, l)", v)
+			pn("}\n")
+			pn("")
+
+			if hasIDParamField(a.Params) {
+				// Generate the function signature
+				pn("// This is a courtesy helper function, which in some cases may not work as expected!")
+				p("func (s *%s) Get%sByName(name string, ", s.name, parseSingular(ln))
+				for _, ap := range a.Params {
+					if ap.Required {
+						p("%s %s, ", s.parseParamName(ap.Name), mapType(ap.Type))
+					}
+				}
+				if parseSingular(ln) == "Iso" {
+					p("isofilter string, ")
+				}
+				if parseSingular(ln) == "Template" || parseSingular(ln) == "Iso" {
+					p("zoneid string, ")
+				}
+				pn("opts ...OptionFunc) (*%s, int, error) {", parseSingular(ln))
+
+				// Generate the function body
+				p("  id, count, err := s.Get%sID(name, ", parseSingular(ln))
+				for _, ap := range a.Params {
+					if ap.Required {
+						p("%s, ", s.parseParamName(ap.Name))
+					}
+				}
+				if parseSingular(ln) == "Iso" {
+					p("isofilter, ")
+				}
+				if parseSingular(ln) == "Template" || parseSingular(ln) == "Iso" {
+					p("zoneid, ")
+				}
+				pn("opts...)")
+				pn("  if err != nil {")
+				pn("    return nil, count, err")
+				pn("  }")
+				pn("")
+				p("  r, count, err := s.Get%sByID(id, ", parseSingular(ln))
+				for _, ap := range a.Params {
+					if ap.Required {
+						p("%s, ", s.parseParamName(ap.Name))
+					}
+				}
+				pn("opts...)")
+				pn("  if err != nil {")
+				pn("    return nil, count, err")
+				pn("  }")
+				pn("	return r, count, nil")
+				pn("}")
+				pn("")
+			}
+		}
+
+		if hasIDParamField(a.Params) {
+			ln := strings.TrimPrefix(a.Name, "list")
+
+			// Generate the function signature
+			pn("// This is a courtesy helper function, which in some cases may not work as expected!")
+			p("func (s *%s) Get%sByID(id string, ", s.name, parseSingular(ln))
+			for _, ap := range a.Params {
+				if ap.Required && s.parseParamName(ap.Name) != "id" {
+					p("%s %s, ", ap.Name, mapType(ap.Type))
+				}
+			}
+			if ln == "LoadBalancerRuleInstances" {
+				pn("opts ...OptionFunc) (*VirtualMachine, int, error) {")
+			} else {
+				pn("opts ...OptionFunc) (*%s, int, error) {", parseSingular(ln))
+			}
+
+			// Generate the function body
+			pn("	p := &List%sParams{}", ln)
+			pn("	p.p = make(map[string]interface{})")
+			pn("")
+			pn("	p.p[\"id\"] = id")
+			for _, ap := range a.Params {
+				if ap.Required && s.parseParamName(ap.Name) != "id" {
+					pn("	p.p[\"%s\"] = %s", ap.Name, s.parseParamName(ap.Name))
+				}
+			}
+			pn("")
+			pn("	for _, fn := range append(s.cs.options, opts...) {")
+			pn("		if err := fn(s.cs, p); err != nil {")
+			pn("			return nil, -1, err")
+			pn("		}")
+			pn("	}")
+			pn("")
+			pn("	l, err := s.List%s(p)", ln)
+			pn("	if err != nil {")
+			pn("		if strings.Contains(err.Error(), fmt.Sprintf(")
+			pn("			\"Invalid parameter id value=%%s due to incorrect long value format, \"+")
+			pn("				\"or entity does not exist\", id)) {")
+			pn("			return nil, 0, fmt.Errorf(\"No match found for %%s: %%+v\", id, l)")
+			pn("		}")
+			pn("		return nil, -1, err")
+			pn("	}")
+			pn("")
+			if ln == "AffinityGroups" {
+				pn("	// This is needed because of a bug with the listAffinityGroup call. It reports the")
+				pn("	// number of VirtualMachines in the groups as being the number of groups found.")
+				pn("	l.Count = len(l.%s)", ln)
+				pn("")
+			}
+			pn("	if l.Count == 0 {")
+			pn("	  return nil, l.Count, fmt.Errorf(\"No match found for %%s: %%+v\", id, l)")
+			pn("	}")
+			pn("")
+			pn("	if l.Count == 1 {")
+			pn("	  return l.%s[0], l.Count, nil", ln)
+			pn("	}")
+			pn("  return nil, l.Count, fmt.Errorf(\"There is more then one result for %s UUID: %%s!\", id)", parseSingular(ln))
+			pn("}\n")
+			pn("")
+		}
+	}
+	return
+}
+
+func hasNameOrKeywordParamField(params APIParams) (v string, found bool) {
+	for _, p := range params {
+		if p.Name == "keyword" && mapType(p.Type) == "string" {
+			v = "keyword"
+			found = true
+		}
+		if p.Name == "name" && mapType(p.Type) == "string" {
+			return "name", true
+		}
+
+	}
+	return v, found
+}
+
+func hasIDParamField(params APIParams) bool {
+	for _, p := range params {
+		if p.Name == "id" && mapType(p.Type) == "string" {
+			return true
+		}
+	}
+	return false
+}
+
+func hasIDAndNameResponseField(resp APIResponses) bool {
+	id := false
+	name := false
+
+	for _, r := range resp {
+		if r.Name == "id" && mapType(r.Type) == "string" {
+			id = true
+		}
+		if r.Name == "name" && mapType(r.Type) == "string" {
+			name = true
+		}
+	}
+	return id && name
+}
+
+func (s *service) generateNewAPICallFunc(a *API) {
+	pn := s.pn
+	n := capitalize(a.Name)
+
+	// Generate the function signature
+	pn("// %s", a.Description)
+	pn("func (s *%s) %s(p *%s) (*%s, error) {", s.name, n, n+"Params", strings.TrimPrefix(n, "Configure")+"Response")
+
+	// Generate the function body
+	if n == "QueryAsyncJobResult" {
+		pn("	var resp json.RawMessage")
+		pn("	var err error")
+		pn("")
+		pn("	// We should be able to retry on failure as this call is idempotent")
+		pn("	for i := 0; i < 3; i++ {")
+		pn("		resp, err = s.cs.newRequest(\"%s\", p.toURLValues())", a.Name)
+		pn("		if err == nil {")
+		pn("			break")
+		pn("		}")
+		pn("		time.Sleep(500 * time.Millisecond)")
+		pn("	}")
+	} else {
+		pn("	resp, err := s.cs.newRequest(\"%s\", p.toURLValues())", a.Name)
+	}
+	pn("	if err != nil {")
+	pn("		return nil, err")
+	pn("	}")
+	pn("")
+	switch n {
+	case "CreateAccount", "CreateUser", "RegisterUserKeys", "CreateNetwork", "CreateNetworkOffering", "CreateSecurityGroup", "CreateServiceOffering", "CreateSSHKeyPair", "RegisterSSHKeyPair":
+		pn("	if resp, err = getRawValue(resp); err != nil {")
+		pn("		return nil, err")
+		pn("	}")
+		pn("")
+	}
+	if !a.Isasync && s.name == "FirewallService" {
+		pn("		resp, err = convertFirewallServiceResponse(resp)")
+		pn("		if err != nil {")
+		pn("			return nil, err")
+		pn("		}")
+		pn("")
+	}
+	pn("	var r %s", strings.TrimPrefix(n, "Configure")+"Response")
+	pn("	if err := json.Unmarshal(resp, &r); err != nil {")
+	pn("		return nil, err")
+	pn("	}")
+	pn("")
+	if a.Isasync {
+		pn("	// If we have a async client, we need to wait for the async result")
+		pn("	if s.cs.async {")
+		pn("		b, err := s.cs.GetAsyncJobResult(r.JobID, s.cs.timeout)")
+		pn("		if err != nil {")
+		pn("			if err == AsyncTimeoutErr {")
+		pn("				return &r, err")
+		pn("			}")
+		pn("			return nil, err")
+		pn("		}")
+		pn("")
+		if !isSuccessOnlyResponse(a.Response) {
+			pn("		b, err = getRawValue(b)")
+			pn("		if err != nil {")
+			pn("		  return nil, err")
+			pn("		}")
+			pn("")
+		}
+		if s.name == "FirewallService" {
+			pn("		b, err = convertFirewallServiceResponse(b)")
+			pn("		if err != nil {")
+			pn("			return nil, err")
+			pn("		}")
+			pn("")
+		}
+		if n == "AuthorizeSecurityGroupIngress" {
+			pn("		b, err = convertAuthorizeSecurityGroupIngressResponse(b)")
+			pn("		if err != nil {")
+			pn("			return nil, err")
+			pn("		}")
+			pn("")
+		}
+		if n == "AuthorizeSecurityGroupEgress" {
+			pn("		b, err = convertAuthorizeSecurityGroupEgressResponse(b)")
+			pn("		if err != nil {")
+			pn("			return nil, err")
+			pn("		}")
+			pn("")
+		}
+		pn("		if err := json.Unmarshal(b, &r); err != nil {")
+		pn("			return nil, err")
+		pn("		}")
+		pn("	}")
+		pn("")
+	}
+	pn("	return &r, nil")
+	pn("}")
+	pn("")
+}
+
+func isSuccessOnlyResponse(resp APIResponses) bool {
+	success := false
+	displaytext := false
+
+	for _, r := range resp {
+		if r.Name == "displaytext" {
+			displaytext = true
+		}
+		if r.Name == "success" {
+			success = true
+		}
+	}
+	return displaytext && success
+}
+
+func (s *service) generateResponseType(a *API) {
+	pn := s.pn
+	tn := capitalize(strings.TrimPrefix(a.Name, "configure") + "Response")
+	ln := capitalize(strings.TrimPrefix(a.Name, "list"))
+
+	// If this is a 'list' response, we need an seperate list struct. There seem to be other
+	// types of responses that also need a seperate list struct, so checking on exact matches
+	// for those once.
+	if strings.HasPrefix(a.Name, "list") || a.Name == "registerTemplate" {
+		pn("type %s struct {", tn)
+		pn("	Count int `json:\"count\"`")
+
+		// This nasty check is for some specific response that do not behave consistent
+		switch a.Name {
+		case "listAsyncJobs":
+			pn("	%s []*%s `json:\"%s\"`", ln, parseSingular(ln), "asyncjobs")
+		case "listEgressFirewallRules":
+			pn("	%s []*%s `json:\"%s\"`", ln, parseSingular(ln), "firewallrule")
+		case "listLoadBalancerRuleInstances":
+			pn("	LBRuleVMIDIPs []*%s `json:\"%s\"`", parseSingular(ln), "lbrulevmidip")
+			pn("	LoadBalancerRuleInstances []*VirtualMachine `json:\"%s\"`", strings.ToLower(parseSingular(ln)))
+		case "registerTemplate":
+			pn("	%s []*%s `json:\"%s\"`", ln, parseSingular(ln), "template")
+		default:
+			pn("	%s []*%s `json:\"%s\"`", ln, parseSingular(ln), strings.ToLower(parseSingular(ln)))
+		}
+		pn("}")
+		pn("")
+		tn = parseSingular(ln)
+	}
+
+	pn("type %s struct {", tn)
+	if a.Isasync {
+		pn("	JobID string `json:\"jobid\"`")
+	}
+	sort.Sort(a.Response)
+	s.recusiveGenerateResponseType(a.Response, a.Isasync)
+	pn("}")
+	pn("")
+	return
+}
+
+func parseSingular(n string) string {
+	if strings.HasSuffix(n, "ies") {
+		return strings.TrimSuffix(n, "ies") + "y"
+	}
+	if strings.HasSuffix(n, "sses") {
+		return strings.TrimSuffix(n, "es")
+	}
+	return strings.TrimSuffix(n, "s")
+}
+
+func (s *service) recusiveGenerateResponseType(resp APIResponses, async bool) (output string) {
+	pn := s.pn
+	found := make(map[string]bool)
+
+	for _, r := range resp {
+		if r.Name == "" {
+			continue
+		}
+		if r.Name == "secondaryip" {
+			pn("%s []struct {", capitalize(r.Name))
+			pn("Id string `json:\"id\"`")
+			pn("Ipaddress string `json:\"ipaddress\"`")
+			pn("} `json:\"%s\"`", r.Name)
+			continue
+		}
+		if r.Response != nil {
+			pn("%s []struct {", capitalize(r.Name))
+			sort.Sort(r.Response)
+			s.recusiveGenerateResponseType(r.Response, async)
+			pn("} `json:\"%s\"`", r.Name)
+		} else {
+			if !found[r.Name] {
+				// This code is needed because the response field is different for sync and async calls :(
+				if r.Name == "success" {
+					if async {
+						pn("%s bool `json:\"%s\"`", capitalize(r.Name), r.Name)
+					} else {
+						pn("%s string `json:\"%s\"`", capitalize(r.Name), r.Name)
+					}
+				} else {
+					pn("%s %s `json:\"%s\"`", capitalize(r.Name), mapType(r.Type), r.Name)
+				}
+				found[r.Name] = true
+			}
+		}
+	}
+	return
+}
+
+func getAllServices(listApis string) (*allServices, []error, error) {
+	// Get a map with all API info
+	ai, err := getAPIInfo(listApis)
+	if err != nil {
+		return nil, nil, err
+	}
+
+	// Generate a complete set of services with their methods (APIs)
+	as := &allServices{}
+	errors := []error{}
+	for sn, apis := range layout {
+		s := &service{name: sn}
+		for _, api := range apis {
+			a, found := ai[api]
+			if !found {
+				errors = append(errors, &apiInfoNotFoundError{api})
+				continue
+			}
+			s.apis = append(s.apis, a)
+		}
+		for _, apis := range s.apis {
+			sort.Sort(apis.Params)
+		}
+		as.services = append(as.services, s)
+	}
+
+	// Add an extra field to enable adding a custom service
+	as.services = append(as.services, &service{name: "CustomService"})
+
+	sort.Sort(as.services)
+	return as, errors, nil
+}
+
+func getAPIInfo(listApis string) (map[string]*API, error) {
+	apis, err := ioutil.ReadFile(listApis)
+	if err != nil {
+		return nil, err
+	}
+
+	var ar struct {
+		Count int    `json:"count"`
+		APIs  []*API `json:"api"`
+	}
+	if err := json.Unmarshal(apis, &ar); err != nil {
+		return nil, err
+	}
+
+	// Make a map of all retrieved APIs
+	ai := make(map[string]*API)
+	for _, api := range ar.APIs {
+		ai[api.Name] = api
+	}
+	return ai, nil
+}
+
+func sourceDir() (string, error) {
+	wd, err := os.Getwd()
+	if err != nil {
+		return "", err
+	}
+	outdir := path.Join(path.Dir(wd), pkg)
+
+	if err := os.MkdirAll(outdir, 0755); err != nil {
+		return "", fmt.Errorf("Failed to Mkdir %s: %v", outdir, err)
+	}
+	return outdir, nil
+}
+
+func mapType(t string) string {
+	switch t {
+	case "boolean":
+		return "bool"
+	case "short", "int", "integer":
+		return "int"
+	case "long":
+		return "int64"
+	case "list":
+		return "[]string"
+	case "map":
+		return "map[string]string"
+	case "set":
+		return "[]interface{}"
+	case "responseobject":
+		return "json.RawMessage"
+	case "uservmresponse":
+		// This is a really specific anomaly of the API
+		return "*VirtualMachine"
+	case "outofbandmanagementresponse":
+		return "OutOfBandManagementResponse"
+	default:
+		return "string"
+	}
+}
+
+func capitalize(s string) string {
+	r := []rune(s)
+	r[0] = unicode.ToUpper(r[0])
+	return string(r)
+}
+
+func uncapitalize(s string) string {
+	r := []rune(s)
+	r[0] = unicode.ToLower(r[0])
+	return string(r)
+}
diff --git a/vendor/github.com/xanzy/go-cloudstack/generate/layout.go b/vendor/github.com/xanzy/go-cloudstack/generate/layout.go
new file mode 100644
index 0000000..e874631
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/generate/layout.go
@@ -0,0 +1,698 @@
+//
+// Copyright 2018, Sander van Harmelen
+//
+// Licensed 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 main
+
+var layout = apiInfo{
+	"LoadBalancerService": {
+		"addF5LoadBalancer",
+		"addNetscalerLoadBalancer",
+		"assignCertToLoadBalancer",
+		"assignToGlobalLoadBalancerRule",
+		"assignToLoadBalancerRule",
+		"configureF5LoadBalancer",
+		"configureNetscalerLoadBalancer",
+		"createGlobalLoadBalancerRule",
+		"createLBHealthCheckPolicy",
+		"createLBStickinessPolicy",
+		"createLoadBalancer",
+		"createLoadBalancerRule",
+		"deleteF5LoadBalancer",
+		"deleteGlobalLoadBalancerRule",
+		"deleteLBHealthCheckPolicy",
+		"deleteLBStickinessPolicy",
+		"deleteLoadBalancer",
+		"deleteLoadBalancerRule",
+		"deleteNetscalerLoadBalancer",
+		"deleteSslCert",
+		"listF5LoadBalancers",
+		"listGlobalLoadBalancerRules",
+		"listLBHealthCheckPolicies",
+		"listLBStickinessPolicies",
+		"listLoadBalancerRuleInstances",
+		"listLoadBalancerRules",
+		"listLoadBalancers",
+		"listNetscalerLoadBalancers",
+		"listSslCerts",
+		"removeCertFromLoadBalancer",
+		"removeFromGlobalLoadBalancerRule",
+		"removeFromLoadBalancerRule",
+		"updateGlobalLoadBalancerRule",
+		"updateLBHealthCheckPolicy",
+		"updateLBStickinessPolicy",
+		"updateLoadBalancer",
+		"updateLoadBalancerRule",
+		"uploadSslCert",
+	},
+	"NetworkService": {
+		"addNetworkServiceProvider",
+		"addOpenDaylightController",
+		"createNetwork",
+		"createPhysicalNetwork",
+		"createServiceInstance",
+		"createStorageNetworkIpRange",
+		"dedicatePublicIpRange",
+		"deleteNetwork",
+		"deleteNetworkServiceProvider",
+		"deleteOpenDaylightController",
+		"deletePhysicalNetwork",
+		"deleteStorageNetworkIpRange",
+		"listF5LoadBalancerNetworks",
+		"listNetscalerLoadBalancerNetworks",
+		"listNetworkIsolationMethods",
+		"listNetworkServiceProviders",
+		"listNetworks",
+		"listNiciraNvpDeviceNetworks",
+		"listOpenDaylightControllers",
+		"listPaloAltoFirewallNetworks",
+		"listPhysicalNetworks",
+		"listSrxFirewallNetworks",
+		"listStorageNetworkIpRange",
+		"listSupportedNetworkServices",
+		"releasePublicIpRange",
+		"restartNetwork",
+		"updateNetwork",
+		"updateNetworkServiceProvider",
+		"updatePhysicalNetwork",
+		"updateStorageNetworkIpRange",
+	},
+	"VirtualMachineService": {
+		"addNicToVirtualMachine",
+		"assignVirtualMachine",
+		"changeServiceForVirtualMachine",
+		"cleanVMReservations",
+		"deployVirtualMachine",
+		"destroyVirtualMachine",
+		"expungeVirtualMachine",
+		"getVMPassword",
+		"listVirtualMachines",
+		"migrateVirtualMachine",
+		"migrateVirtualMachineWithVolume",
+		"rebootVirtualMachine",
+		"recoverVirtualMachine",
+		"removeNicFromVirtualMachine",
+		"resetPasswordForVirtualMachine",
+		"restoreVirtualMachine",
+		"scaleVirtualMachine",
+		"startVirtualMachine",
+		"stopVirtualMachine",
+		"updateDefaultNicForVirtualMachine",
+		"updateVirtualMachine",
+	},
+	"VPNService": {
+		"addVpnUser",
+		"createRemoteAccessVpn",
+		"createVpnConnection",
+		"createVpnCustomerGateway",
+		"createVpnGateway",
+		"deleteRemoteAccessVpn",
+		"deleteVpnConnection",
+		"deleteVpnCustomerGateway",
+		"deleteVpnGateway",
+		"listRemoteAccessVpns",
+		"listVpnConnections",
+		"listVpnCustomerGateways",
+		"listVpnGateways",
+		"listVpnUsers",
+		"removeVpnUser",
+		"resetVpnConnection",
+		"updateRemoteAccessVpn",
+		"updateVpnConnection",
+		"updateVpnCustomerGateway",
+		"updateVpnGateway",
+	},
+	"FirewallService": {
+		"addPaloAltoFirewall",
+		"addSrxFirewall",
+		"configurePaloAltoFirewall",
+		"configureSrxFirewall",
+		"createEgressFirewallRule",
+		"createFirewallRule",
+		"createPortForwardingRule",
+		"deleteEgressFirewallRule",
+		"deleteFirewallRule",
+		"deletePaloAltoFirewall",
+		"deletePortForwardingRule",
+		"deleteSrxFirewall",
+		"listEgressFirewallRules",
+		"listFirewallRules",
+		"listPaloAltoFirewalls",
+		"listPortForwardingRules",
+		"listSrxFirewalls",
+		"updateEgressFirewallRule",
+		"updateFirewallRule",
+		"updatePortForwardingRule",
+	},
+	"AutoScaleService": {
+		"createAutoScalePolicy",
+		"createAutoScaleVmGroup",
+		"createAutoScaleVmProfile",
+		"createCondition",
+		"createCounter",
+		"deleteAutoScalePolicy",
+		"deleteAutoScaleVmGroup",
+		"deleteAutoScaleVmProfile",
+		"deleteCondition",
+		"deleteCounter",
+		"disableAutoScaleVmGroup",
+		"enableAutoScaleVmGroup",
+		"listAutoScalePolicies",
+		"listAutoScaleVmGroups",
+		"listAutoScaleVmProfiles",
+		"listConditions",
+		"listCounters",
+		"updateAutoScalePolicy",
+		"updateAutoScaleVmGroup",
+		"updateAutoScaleVmProfile",
+	},
+	"HostService": {
+		"addBaremetalHost",
+		"addGloboDnsHost",
+		"addHost",
+		"addSecondaryStorage",
+		"cancelHostMaintenance",
+		"dedicateHost",
+		"deleteHost",
+		"disableOutOfBandManagementForHost",
+		"enableOutOfBandManagementForHost",
+		"findHostsForMigration",
+		"listDedicatedHosts",
+		"listHostTags",
+		"listHosts",
+		"prepareHostForMaintenance",
+		"reconnectHost",
+		"releaseDedicatedHost",
+		"releaseHostReservation",
+		"updateHost",
+		"updateHostPassword",
+	},
+	"VolumeService": {
+		"attachVolume",
+		"createVolume",
+		"deleteVolume",
+		"detachVolume",
+		"extractVolume",
+		"getPathForVolume",
+		"getSolidFireVolumeAccessGroupId",
+		"getSolidFireVolumeSize",
+		"getUploadParamsForVolume",
+		"getVolumeiScsiName",
+		"listVolumes",
+		"migrateVolume",
+		"resizeVolume",
+		"updateVolume",
+		"uploadVolume",
+	},
+	"VPCService": {
+		"createPrivateGateway",
+		"createStaticRoute",
+		"createVPC",
+		"createVPCOffering",
+		"deletePrivateGateway",
+		"deleteStaticRoute",
+		"deleteVPC",
+		"deleteVPCOffering",
+		"listPrivateGateways",
+		"listStaticRoutes",
+		"listVPCOfferings",
+		"listVPCs",
+		"restartVPC",
+		"updateVPC",
+		"updateVPCOffering",
+	},
+	"TemplateService": {
+		"copyTemplate",
+		"createTemplate",
+		"deleteTemplate",
+		"extractTemplate",
+		"getUploadParamsForTemplate",
+		"listTemplatePermissions",
+		"listTemplates",
+		"prepareTemplate",
+		"registerTemplate",
+		"updateTemplate",
+		"updateTemplatePermissions",
+		"upgradeRouterTemplate",
+	},
+	"AccountService": {
+		"addAccountToProject",
+		"createAccount",
+		"deleteAccount",
+		"deleteAccountFromProject",
+		"disableAccount",
+		"enableAccount",
+		"getSolidFireAccountId",
+		"listAccounts",
+		"listProjectAccounts",
+		"lockAccount",
+		"markDefaultZoneForAccount",
+		"updateAccount",
+	},
+	"ZoneService": {
+		"addVmwareDc",
+		"createZone",
+		"dedicateZone",
+		"deleteZone",
+		"disableOutOfBandManagementForZone",
+		"enableOutOfBandManagementForZone",
+		"listDedicatedZones",
+		"listVmwareDcs",
+		"listZones",
+		"releaseDedicatedZone",
+		"removeVmwareDc",
+		"updateZone",
+	},
+	"UsageService": {
+		"addTrafficMonitor",
+		"addTrafficType",
+		"deleteTrafficMonitor",
+		"deleteTrafficType",
+		"generateUsageRecords",
+		"listTrafficMonitors",
+		"listTrafficTypeImplementors",
+		"listTrafficTypes",
+		"listUsageRecords",
+		"listUsageTypes",
+		"removeRawUsageRecords",
+		"updateTrafficType",
+	},
+	"SnapshotService": {
+		"createSnapshot",
+		"createSnapshotPolicy",
+		"createVMSnapshot",
+		"deleteSnapshot",
+		"deleteSnapshotPolicies",
+		"deleteVMSnapshot",
+		"listSnapshotPolicies",
+		"listSnapshots",
+		"listVMSnapshot",
+		"revertSnapshot",
+		"revertToVMSnapshot",
+		"updateSnapshotPolicy",
+	},
+	"UserService": {
+		"createUser",
+		"deleteUser",
+		"disableUser",
+		"enableUser",
+		"getUser",
+		"getVirtualMachineUserData",
+		"listUsers",
+		"lockUser",
+		"registerUserKeys",
+		"updateUser",
+	},
+	"LDAPService": {
+		"addLdapConfiguration",
+		"deleteLdapConfiguration",
+		"importLdapUsers",
+		"ldapConfig",
+		"ldapCreateAccount",
+		"ldapRemove",
+		"linkDomainToLdap",
+		"listLdapConfigurations",
+		"listLdapUsers",
+		"searchLdap",
+	},
+	"ISOService": {
+		"attachIso",
+		"copyIso",
+		"deleteIso",
+		"detachIso",
+		"extractIso",
+		"listIsoPermissions",
+		"listIsos",
+		"registerIso",
+		"updateIso",
+		"updateIsoPermissions",
+	},
+	"ExternalDeviceService": {
+		"addCiscoAsa1000vResource",
+		"addCiscoVnmcResource",
+		"deleteCiscoAsa1000vResource",
+		"deleteCiscoNexusVSM",
+		"deleteCiscoVnmcResource",
+		"disableCiscoNexusVSM",
+		"enableCiscoNexusVSM",
+		"listCiscoAsa1000vResources",
+		"listCiscoNexusVSMs",
+		"listCiscoVnmcResources",
+	},
+	"RouterService": {
+		"changeServiceForRouter",
+		"configureVirtualRouterElement",
+		"createVirtualRouterElement",
+		"destroyRouter",
+		"listRouters",
+		"listVirtualRouterElements",
+		"rebootRouter",
+		"startRouter",
+		"stopRouter",
+	},
+	"ProjectService": {
+		"activateProject",
+		"createProject",
+		"deleteProject",
+		"deleteProjectInvitation",
+		"listProjectInvitations",
+		"listProjects",
+		"suspendProject",
+		"updateProject",
+		"updateProjectInvitation",
+	},
+	"PoolService": {
+		"createStoragePool",
+		"deleteStoragePool",
+		"findStoragePoolsForMigration",
+		"listStoragePools",
+		"updateStoragePool",
+	},
+	"NetworkACLService": {
+		"createNetworkACL",
+		"createNetworkACLList",
+		"deleteNetworkACL",
+		"deleteNetworkACLList",
+		"listNetworkACLLists",
+		"listNetworkACLs",
+		"replaceNetworkACLList",
+		"updateNetworkACLItem",
+		"updateNetworkACLList",
+	},
+	"GuestOSService": {
+		"addGuestOs",
+		"addGuestOsMapping",
+		"listGuestOsMapping",
+		"listOsCategories",
+		"listOsTypes",
+		"removeGuestOs",
+		"removeGuestOsMapping",
+		"updateGuestOs",
+		"updateGuestOsMapping",
+	},
+	"ClusterService": {
+		"addCluster",
+		"dedicateCluster",
+		"deleteCluster",
+		"disableOutOfBandManagementForCluster",
+		"enableOutOfBandManagementForCluster",
+		"listClusters",
+		"listDedicatedClusters",
+		"releaseDedicatedCluster",
+		"updateCluster",
+	},
+	"BaremetalService": {
+		"addBaremetalDhcp",
+		"addBaremetalPxeKickStartServer",
+		"addBaremetalPxePingServer",
+		"addBaremetalRct",
+		"deleteBaremetalRct",
+		"listBaremetalDhcp",
+		"listBaremetalPxeServers",
+		"listBaremetalRct",
+		"notifyBaremetalProvisionDone",
+	},
+	"SystemVMService": {
+		"changeServiceForSystemVm",
+		"destroySystemVm",
+		"listSystemVms",
+		"migrateSystemVm",
+		"rebootSystemVm",
+		"scaleSystemVm",
+		"startSystemVm",
+		"stopSystemVm",
+	},
+	"RoleService": {
+		"createRole",
+		"createRolePermission",
+		"deleteRole",
+		"deleteRolePermission",
+		"listRolePermissions",
+		"listRoles",
+		"updateRole",
+		"updateRolePermission",
+	},
+	"ImageStoreService": {
+		"addImageStore",
+		"addImageStoreS3",
+		"createSecondaryStagingStore",
+		"deleteImageStore",
+		"deleteSecondaryStagingStore",
+		"listImageStores",
+		"listSecondaryStagingStores",
+		"updateCloudToUseObjectStore",
+	},
+	"AuthenticationService": {
+		"login",
+		"logout",
+	},
+	"SecurityGroupService": {
+		"authorizeSecurityGroupEgress",
+		"authorizeSecurityGroupIngress",
+		"createSecurityGroup",
+		"deleteSecurityGroup",
+		"listSecurityGroups",
+		"revokeSecurityGroupEgress",
+		"revokeSecurityGroupIngress",
+	},
+	"QuotaService": {
+		"quotaIsEnabled",
+	},
+	"PodService": {
+		"createPod",
+		"dedicatePod",
+		"deletePod",
+		"listDedicatedPods",
+		"listPods",
+		"releaseDedicatedPod",
+		"updatePod",
+	},
+	"VLANService": {
+		"createVlanIpRange",
+		"dedicateGuestVlanRange",
+		"deleteVlanIpRange",
+		"listDedicatedGuestVlanRanges",
+		"listVlanIpRanges",
+		"releaseDedicatedGuestVlanRange",
+	},
+	"UCSService": {
+		"addUcsManager",
+		"associateUcsProfileToBlade",
+		"deleteUcsManager",
+		"listUcsBlades",
+		"listUcsManagers",
+		"listUcsProfiles",
+	},
+	"InternalLBService": {
+		"configureInternalLoadBalancerElement",
+		"createInternalLoadBalancerElement",
+		"listInternalLoadBalancerElements",
+		"listInternalLoadBalancerVMs",
+		"startInternalLoadBalancerVM",
+		"stopInternalLoadBalancerVM",
+	},
+	"SSHService": {
+		"createSSHKeyPair",
+		"deleteSSHKeyPair",
+		"listSSHKeyPairs",
+		"registerSSHKeyPair",
+		"resetSSHKeyForVirtualMachine",
+	},
+	"NATService": {
+		"createIpForwardingRule",
+		"deleteIpForwardingRule",
+		"disableStaticNat",
+		"enableStaticNat",
+		"listIpForwardingRules",
+	},
+	"LimitService": {
+		"getApiLimit",
+		"listResourceLimits",
+		"resetApiLimit",
+		"updateResourceCount",
+		"updateResourceLimit",
+	},
+	"DomainService": {
+		"createDomain",
+		"deleteDomain",
+		"listDomainChildren",
+		"listDomains",
+		"updateDomain",
+	},
+	"AffinityGroupService": {
+		"createAffinityGroup",
+		"deleteAffinityGroup",
+		"listAffinityGroupTypes",
+		"listAffinityGroups",
+		"updateVMAffinityGroup",
+	},
+	"VMGroupService": {
+		"createInstanceGroup",
+		"deleteInstanceGroup",
+		"listInstanceGroups",
+		"updateInstanceGroup",
+	},
+	"ServiceOfferingService": {
+		"createServiceOffering",
+		"deleteServiceOffering",
+		"listServiceOfferings",
+		"updateServiceOffering",
+	},
+	"ResourcetagsService": {
+		"createTags",
+		"deleteTags",
+		"listStorageTags",
+		"listTags",
+	},
+	"ResourcemetadataService": {
+		"addResourceDetail",
+		"getVolumeSnapshotDetails",
+		"listResourceDetails",
+		"removeResourceDetail",
+	},
+	"RegionService": {
+		"addRegion",
+		"listRegions",
+		"removeRegion",
+		"updateRegion",
+	},
+	"NuageVSPService": {
+		"addNuageVspDevice",
+		"deleteNuageVspDevice",
+		"listNuageVspDevices",
+		"updateNuageVspDevice",
+	},
+	"NicService": {
+		"addIpToNic",
+		"listNics",
+		"removeIpFromNic",
+		"updateVmNicIp",
+	},
+	"NetworkOfferingService": {
+		"createNetworkOffering",
+		"deleteNetworkOffering",
+		"listNetworkOfferings",
+		"updateNetworkOffering",
+	},
+	"EventService": {
+		"archiveEvents",
+		"deleteEvents",
+		"listEventTypes",
+		"listEvents",
+	},
+	"DiskOfferingService": {
+		"createDiskOffering",
+		"deleteDiskOffering",
+		"listDiskOfferings",
+		"updateDiskOffering",
+	},
+	"ConfigurationService": {
+		"listCapabilities",
+		"listConfigurations",
+		"listDeploymentPlanners",
+		"updateConfiguration",
+	},
+	"BrocadeVCSService": {
+		"addBrocadeVcsDevice",
+		"deleteBrocadeVcsDevice",
+		"listBrocadeVcsDeviceNetworks",
+		"listBrocadeVcsDevices",
+	},
+	"AlertService": {
+		"archiveAlerts",
+		"deleteAlerts",
+		"generateAlert",
+		"listAlerts",
+	},
+	"AddressService": {
+		"associateIpAddress",
+		"disassociateIpAddress",
+		"listPublicIpAddresses",
+		"updateIpAddress",
+	},
+	"StoragePoolService": {
+		"cancelStorageMaintenance",
+		"enableStorageMaintenance",
+		"listStorageProviders",
+	},
+	"PortableIPService": {
+		"createPortableIpRange",
+		"deletePortableIpRange",
+		"listPortableIpRanges",
+	},
+	"OutofbandManagementService": {
+		"changeOutOfBandManagementPassword",
+		"configureOutOfBandManagement",
+		"issueOutOfBandManagementPowerAction",
+	},
+	"NiciraNVPService": {
+		"addNiciraNvpDevice",
+		"deleteNiciraNvpDevice",
+		"listNiciraNvpDevices",
+	},
+	"NetworkDeviceService": {
+		"addNetworkDevice",
+		"deleteNetworkDevice",
+		"listNetworkDevice",
+	},
+	"HypervisorService": {
+		"listHypervisorCapabilities",
+		"listHypervisors",
+		"updateHypervisorCapabilities",
+	},
+	"ExtLoadBalancerService": {
+		"addExternalLoadBalancer",
+		"deleteExternalLoadBalancer",
+		"listExternalLoadBalancers",
+	},
+	"ExtFirewallService": {
+		"addExternalFirewall",
+		"deleteExternalFirewall",
+		"listExternalFirewalls",
+	},
+	"BigSwitchBCFService": {
+		"addBigSwitchBcfDevice",
+		"deleteBigSwitchBcfDevice",
+		"listBigSwitchBcfDevices",
+	},
+	"SwiftService": {
+		"addSwift",
+		"listSwifts",
+	},
+	"OvsElementService": {
+		"configureOvsElement",
+		"listOvsElements",
+	},
+	"AsyncjobService": {
+		"listAsyncJobs",
+		"queryAsyncJobResult",
+	},
+	"StratosphereSSPService": {
+		"addStratosphereSsp",
+		"deleteStratosphereSsp",
+	},
+	"SystemCapacityService": {
+		"listCapacity",
+	},
+	"CloudIdentifierService": {
+		"getCloudIdentifier",
+	},
+	"CertificateService": {
+		"uploadCustomCertificate",
+	},
+	"APIDiscoveryService": {
+		"listApis",
+	},
+}
diff --git a/vendor/github.com/xanzy/go-cloudstack/generate/listApis.json b/vendor/github.com/xanzy/go-cloudstack/generate/listApis.json
new file mode 100644
index 0000000..98a5c3b
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/generate/listApis.json
@@ -0,0 +1,89528 @@
+{
+    "api": [
+        {
+            "description": "Creates VPC offering",
+            "isasync": true,
+            "name": "createVPCOffering",
+            "params": [
+                {
+                    "description": "services supported by the vpc offering",
+                    "length": 255,
+                    "name": "supportedservices",
+                    "required": true,
+                    "type": "list"
+                },
+                {
+                    "description": "provider to service mapping. If not specified, the provider for the service will be mapped to the default provider on the physical network",
+                    "length": 255,
+                    "name": "serviceproviderlist",
+                    "required": false,
+                    "type": "map"
+                },
+                {
+                    "description": "desired service capabilities as part of vpc offering",
+                    "length": 255,
+                    "name": "servicecapabilitylist",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "map"
+                },
+                {
+                    "description": "the display text of the vpc offering",
+                    "length": 255,
+                    "name": "displaytext",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the vpc offering",
+                    "length": 255,
+                    "name": "name",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the service offering for the VPC router appliance",
+                    "length": 255,
+                    "name": "serviceofferingid",
+                    "related": "createServiceOffering,updateServiceOffering,listServiceOfferings",
+                    "required": false,
+                    "type": "uuid"
+                }
+            ],
+            "related": "listVPCOfferings,updateVPCOffering",
+            "response": [
+                {
+                    "description": " indicates if the vpc offering supports distributed router for one-hop forwarding",
+                    "name": "distributedvpcrouter",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the list of supported services",
+                    "name": "service",
+                    "response": [
+                        {
+                            "description": "the service name",
+                            "name": "name",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the service provider name",
+                            "name": "provider",
+                            "response": [
+                                {
+                                    "description": "the provider name",
+                                    "name": "name",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "state of the network provider",
+                                    "name": "state",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "uuid of the network provider",
+                                    "name": "id",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the physical network this belongs to",
+                                    "name": "physicalnetworkid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "services for this provider",
+                                    "name": "servicelist",
+                                    "type": "list"
+                                },
+                                {
+                                    "description": "the destination physical network",
+                                    "name": "destinationphysicalnetworkid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "true if individual services can be enabled/disabled",
+                                    "name": "canenableindividualservice",
+                                    "type": "boolean"
+                                }
+                            ],
+                            "type": "list"
+                        },
+                        {
+                            "description": "the list of capabilities",
+                            "name": "capability",
+                            "response": [
+                                {
+                                    "description": "the capability name",
+                                    "name": "name",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "can this service capability value can be choosable while creatine network offerings",
+                                    "name": "canchooseservicecapability",
+                                    "type": "boolean"
+                                },
+                                {
+                                    "description": "the capability value",
+                                    "name": "value",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "list"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "the date this vpc offering was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the name of the vpc offering",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": " indicated if the offering can support region level vpc",
+                    "name": "supportsregionLevelvpc",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the id of the vpc offering",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "an alternate display text of the vpc offering.",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "true if vpc offering is default, false otherwise",
+                    "name": "isdefault",
+                    "type": "boolean"
+                },
+                {
+                    "description": "state of the vpc offering. Can be Disabled/Enabled",
+                    "name": "state",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Creates an account from an LDAP user",
+            "isasync": false,
+            "name": "ldapCreateAccount",
+            "params": [
+                {
+                    "description": "Specifies a timezone for this command. For more information on the timezone parameter, see Time Zone Format.",
+                    "length": 255,
+                    "name": "timezone",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "Creates the user under the specified domain.",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "updateDomain,createDomain,listDomains,listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "Unique username.",
+                    "length": 255,
+                    "name": "username",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "Network domain for the account's networks",
+                    "length": 255,
+                    "name": "networkdomain",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "Account UUID, required for adding account from external provisioning system",
+                    "length": 255,
+                    "name": "accountid",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "Creates the account under the specified role.",
+                    "length": 255,
+                    "name": "roleid",
+                    "related": "listRoles,createRole",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "Type of the account. Specify 0 for user, 1 for root admin, and 2 for domain admin",
+                    "length": 255,
+                    "name": "accounttype",
+                    "required": false,
+                    "type": "short"
+                },
+                {
+                    "description": "Creates the user under the specified account. If no account is specified, the username will be used as the account name.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "User UUID, required for adding account from external provisioning system",
+                    "length": 255,
+                    "name": "userid",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "details for account used to store specific parameters",
+                    "length": 255,
+                    "name": "accountdetails",
+                    "required": false,
+                    "type": "map"
+                }
+            ],
+            "related": "disableAccount,listAccounts,markDefaultZoneForAccount,listAccounts,enableAccount,updateAccount,lockAccount,createAccount",
+            "response": [
+                {
+                    "description": "the total volume available for this account",
+                    "name": "volumeavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of vpcs available to be created for this account",
+                    "name": "vpcavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of networks the account can own",
+                    "name": "networklimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of virtual machines that can be deployed by this account",
+                    "name": "vmlimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of public ip addresses available for this account to acquire",
+                    "name": "ipavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "true if account is default, false otherwise",
+                    "name": "isdefault",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the total secondary storage space (in GiB) the account can own",
+                    "name": "secondarystoragelimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the network domain",
+                    "name": "networkdomain",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the role",
+                    "name": "roleid",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of networks owned by account",
+                    "name": "networktotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of networks available to be created for this account",
+                    "name": "networkavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of virtual machines deployed by this account",
+                    "name": "vmtotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the type of the role (Admin, ResourceAdmin, DomainAdmin, User)",
+                    "name": "roletype",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of projects available for administration by this account",
+                    "name": "projectavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of public ip addresses this account can acquire",
+                    "name": "iplimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of virtual machines running for this account",
+                    "name": "vmrunning",
+                    "type": "integer"
+                },
+                {
+                    "description": "the list of acl groups that account belongs to",
+                    "name": "groups",
+                    "type": "list"
+                },
+                {
+                    "description": "the total secondary storage space (in GiB) available to be used for this account",
+                    "name": "secondarystorageavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total memory (in MB) available to be created for this account",
+                    "name": "memoryavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "id of the Domain the account belongs too",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of snapshots which can be stored by this account",
+                    "name": "snapshotlimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of cpu cores owned by account",
+                    "name": "cputotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total memory (in MB) owned by account",
+                    "name": "memorytotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of virtual machines stopped for this account",
+                    "name": "vmstopped",
+                    "type": "integer"
+                },
+                {
+                    "description": "the total primary storage space (in GiB) the account can own",
+                    "name": "primarystoragelimit",
+                    "type": "string"
+                },
+                {
+                    "description": "account type (admin, domain-admin, user)",
+                    "name": "accounttype",
+                    "type": "short"
+                },
+                {
+                    "description": "the total number of snapshots available for this account",
+                    "name": "snapshotavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total memory (in MB) the account can own",
+                    "name": "memorylimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of vpcs the account can own",
+                    "name": "vpclimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of templates available to be created by this account",
+                    "name": "templateavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total volume being used by this account",
+                    "name": "volumetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of public ip addresses allocated for this account",
+                    "name": "iptotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of network traffic bytes sent",
+                    "name": "sentbytes",
+                    "type": "long"
+                },
+                {
+                    "description": "the default zone of the account",
+                    "name": "defaultzoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of network traffic bytes received",
+                    "name": "receivedbytes",
+                    "type": "long"
+                },
+                {
+                    "description": "the id of the account",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of vpcs owned by account",
+                    "name": "vpctotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of cpu cores available to be created for this account",
+                    "name": "cpuavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total secondary storage space (in GiB) owned by account",
+                    "name": "secondarystoragetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the list of users associated with account",
+                    "name": "user",
+                    "response": [
+                        {
+                            "description": "the timezone user was created in",
+                            "name": "timezone",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the date and time the user account was created",
+                            "name": "created",
+                            "type": "date"
+                        },
+                        {
+                            "description": "the ID of the role",
+                            "name": "roleid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if user is default, false otherwise",
+                            "name": "isdefault",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "the user lastname",
+                            "name": "lastname",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the user name",
+                            "name": "username",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the name of the role",
+                            "name": "rolename",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the secret key of the user",
+                            "name": "secretkey",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the user email address",
+                            "name": "email",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account name of the user",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account ID of the user",
+                            "name": "accountid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account type of the user",
+                            "name": "accounttype",
+                            "type": "short"
+                        },
+                        {
+                            "description": "the user firstname",
+                            "name": "firstname",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain ID of the user",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the user ID",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the user state",
+                            "name": "state",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the api key of the user",
+                            "name": "apikey",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the boolean value representing if the updating target is in caller's child domain",
+                            "name": "iscallerchilddomain",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "the type of the role",
+                            "name": "roletype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain name of the user",
+                            "name": "domain",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "the total number of templates which have been created by this account",
+                    "name": "templatetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of projects the account can own",
+                    "name": "projectlimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of snapshots stored by this account",
+                    "name": "snapshottotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total volume which can be used by this account",
+                    "name": "volumelimit",
+                    "type": "string"
+                },
+                {
+                    "description": "details for the account",
+                    "name": "accountdetails",
+                    "type": "map"
+                },
+                {
+                    "description": "the total number of projects being administrated by this account",
+                    "name": "projecttotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the state of the account",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "true if the account requires cleanup",
+                    "name": "iscleanuprequired",
+                    "type": "boolean"
+                },
+                {
+                    "description": "name of the Domain the account belongs too",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the role",
+                    "name": "rolename",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of cpu cores the account can own",
+                    "name": "cpulimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of virtual machines available for this account to acquire",
+                    "name": "vmavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the account",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the total primary storage space (in GiB) available to be used for this account",
+                    "name": "primarystorageavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of templates which can be created by this account",
+                    "name": "templatelimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total primary storage space (in GiB) owned by account",
+                    "name": "primarystoragetotal",
+                    "type": "long"
+                }
+            ],
+            "since": "4.2.0"
+        },
+        {
+            "description": "Creates a new Pod.",
+            "isasync": false,
+            "name": "createPod",
+            "params": [
+                {
+                    "description": "the starting IP address for the Pod",
+                    "length": 255,
+                    "name": "startip",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone ID in which the Pod will be created",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones,listZones,createZone,updateZone",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the gateway for the Pod",
+                    "length": 255,
+                    "name": "gateway",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the netmask for the Pod",
+                    "length": 255,
+                    "name": "netmask",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the ending IP address for the Pod",
+                    "length": 255,
+                    "name": "endip",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "Allocation state of this Pod for allocation of new resources",
+                    "length": 255,
+                    "name": "allocationstate",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the Pod",
+                    "length": 255,
+                    "name": "name",
+                    "required": true,
+                    "type": "string"
+                }
+            ],
+            "related": "listPods,updatePod",
+            "response": [
+                {
+                    "description": "the name of the Pod",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the netmask of the Pod",
+                    "name": "netmask",
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone name of the Pod",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the ending IP for the Pod",
+                    "name": "endip",
+                    "type": "string"
+                },
+                {
+                    "description": "the starting IP for the Pod",
+                    "name": "startip",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the Pod",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the gateway of the Pod",
+                    "name": "gateway",
+                    "type": "string"
+                },
+                {
+                    "description": "the capacity of the Pod",
+                    "name": "capacity",
+                    "response": [
+                        {
+                            "description": "the capacity type",
+                            "name": "type",
+                            "type": "short"
+                        },
+                        {
+                            "description": "the Cluster ID",
+                            "name": "clusterid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the total capacity available",
+                            "name": "capacitytotal",
+                            "type": "long"
+                        },
+                        {
+                            "description": "the Zone ID",
+                            "name": "zoneid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the Cluster name",
+                            "name": "clustername",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the Zone name",
+                            "name": "zonename",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the Pod name",
+                            "name": "podname",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the capacity currently in use",
+                            "name": "capacityused",
+                            "type": "long"
+                        },
+                        {
+                            "description": "the percentage of capacity currently in use",
+                            "name": "percentused",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the Pod ID",
+                            "name": "podid",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "the Zone ID of the Pod",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the allocation state of the Pod",
+                    "name": "allocationstate",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Safely removes raw records from cloud_usage table",
+            "isasync": false,
+            "name": "removeRawUsageRecords",
+            "params": [
+                {
+                    "description": "Specify the number of days (greater than zero) to remove records that are older than those number of days from today. For example, specifying 10 would result in removing all the records created before 10 days from today",
+                    "length": 255,
+                    "name": "interval",
+                    "required": true,
+                    "type": "integer"
+                }
+            ],
+            "response": [
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                }
+            ],
+            "since": "4.6.0"
+        },
+        {
+            "description": "Copies an iso from one zone to another.",
+            "isasync": true,
+            "name": "copyIso",
+            "params": [
+                {
+                    "description": "ID of the zone the template is currently hosted on. If not specified and template is cross-zone, then we will sync this template to region wide image store.",
+                    "length": 255,
+                    "name": "sourcezoneid",
+                    "related": "listZones,listZones,createZone,updateZone",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "Template ID.",
+                    "length": 255,
+                    "name": "id",
+                    "related": "copyTemplate,registerTemplate,listIsos,copyIso,copyTemplate,listTemplates,registerTemplate,listTemplates,createTemplate,registerIso,registerIso,prepareTemplate,updateIso,listIsos,updateTemplate,createTemplate,copyIso",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "ID of the zone the template is being copied to.",
+                    "length": 255,
+                    "name": "destzoneid",
+                    "related": "listZones,listZones,createZone,updateZone",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "copyTemplate,registerTemplate,listIsos,copyTemplate,listTemplates,registerTemplate,listTemplates,createTemplate,registerIso,registerIso,prepareTemplate,updateIso,listIsos,updateTemplate,createTemplate,copyIso",
+            "response": [
+                {
+                    "description": "the template ID",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the template",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the zone for this template",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the template display text",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "the account id to which the template belongs",
+                    "name": "accountid",
+                    "type": "string"
+                },
+                {
+                    "description": "the tag of this template",
+                    "name": "templatetag",
+                    "type": "string"
+                },
+                {
+                    "description": "checksum of the template",
+                    "name": "checksum",
+                    "type": "string"
+                },
+                {
+                    "description": "true if template is sshkey enabled, false otherwise",
+                    "name": "sshkeyenabled",
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if template contains XS/VMWare tools inorder to support dynamic scaling of VM cpu/memory",
+                    "name": "isdynamicallyscalable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the format of the template.",
+                    "name": "format",
+                    "type": "imageformat"
+                },
+                {
+                    "description": "additional key/value details tied with template",
+                    "name": "details",
+                    "type": "map"
+                },
+                {
+                    "description": "the account name to which the template belongs",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the hypervisor on which the template runs",
+                    "name": "hypervisor",
+                    "type": "string"
+                },
+                {
+                    "description": "true if the ISO is bootable, false otherwise",
+                    "name": "bootable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the name of the domain to which the template belongs",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the secondary storage host for the template",
+                    "name": "hostid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the OS type for this template.",
+                    "name": "ostypeid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the secondary storage host for the template",
+                    "name": "hostname",
+                    "type": "string"
+                },
+                {
+                    "description": "true if the template is extractable, false otherwise",
+                    "name": "isextractable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the ID of the domain to which the template belongs",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the zone for this template",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the date this template was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "true if the reset password feature is enabled, false otherwise",
+                    "name": "passwordenabled",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the template name",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "true if this template is a public template, false otherwise",
+                    "name": "ispublic",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the size of the template",
+                    "name": "size",
+                    "type": "long"
+                },
+                {
+                    "description": "true if the template is managed across all Zones, false otherwise",
+                    "name": "crossZones",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the type of the template",
+                    "name": "templatetype",
+                    "type": "string"
+                },
+                {
+                    "description": "the date this template was removed",
+                    "name": "removed",
+                    "type": "date"
+                },
+                {
+                    "description": "the template ID of the parent template if present",
+                    "name": "sourcetemplateid",
+                    "type": "string"
+                },
+                {
+                    "description": "true if the template is ready to be deployed from, false otherwise.",
+                    "name": "isready",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the name of the OS type for this template.",
+                    "name": "ostypename",
+                    "type": "string"
+                },
+                {
+                    "description": "the status of the template",
+                    "name": "status",
+                    "type": "string"
+                },
+                {
+                    "description": "true if this template is a featured template, false otherwise",
+                    "name": "isfeatured",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the project id of the template",
+                    "name": "projectid",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Deletes a autoscale vm profile.",
+            "isasync": true,
+            "name": "deleteAutoScaleVmProfile",
+            "params": [
+                {
+                    "description": "the ID of the autoscale profile",
+                    "length": 255,
+                    "name": "id",
+                    "related": "updateAutoScaleVmProfile,listAutoScaleVmProfiles,createAutoScaleVmProfile",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                },
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Adds an external firewall appliance",
+            "isasync": false,
+            "name": "addExternalFirewall",
+            "params": [
+                {
+                    "description": "Password of the external firewall appliance.",
+                    "length": 255,
+                    "name": "password",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "Zone in which to add the external firewall appliance.",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones,listZones,createZone,updateZone",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "Username of the external firewall appliance.",
+                    "length": 255,
+                    "name": "username",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "URL of the external firewall appliance.",
+                    "length": 255,
+                    "name": "url",
+                    "required": true,
+                    "type": "string"
+                }
+            ],
+            "related": "listExternalFirewalls",
+            "response": [
+                {
+                    "description": "the ID of the external firewall",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the management IP address of the external firewall",
+                    "name": "ipaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the zone ID of the external firewall",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the username that's used to log in to the external firewall",
+                    "name": "username",
+                    "type": "string"
+                },
+                {
+                    "description": "the usage interface of the external firewall",
+                    "name": "usageinterface",
+                    "type": "string"
+                },
+                {
+                    "description": "the public interface of the external firewall",
+                    "name": "publicinterface",
+                    "type": "string"
+                },
+                {
+                    "description": "the private interface of the external firewall",
+                    "name": "privateinterface",
+                    "type": "string"
+                },
+                {
+                    "description": "the number of times to retry requests to the external firewall",
+                    "name": "numretries",
+                    "type": "string"
+                },
+                {
+                    "description": "the public security zone of the external firewall",
+                    "name": "publiczone",
+                    "type": "string"
+                },
+                {
+                    "description": "the private security zone of the external firewall",
+                    "name": "privatezone",
+                    "type": "string"
+                },
+                {
+                    "description": "the timeout (in seconds) for requests to the external firewall",
+                    "name": "timeout",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Deletes a F5 external load balancer appliance added in a zone.",
+            "isasync": false,
+            "name": "deleteExternalLoadBalancer",
+            "params": [
+                {
+                    "description": "Id of the external loadbalancer appliance.",
+                    "length": 255,
+                    "name": "id",
+                    "related": "addBaremetalHost,listExternalLoadBalancers,prepareHostForMaintenance,reconnectHost,addHost,updateHost,cancelHostMaintenance,listHosts",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                },
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Lists VM metrics",
+            "isasync": false,
+            "name": "listVirtualMachinesMetrics",
+            "params": [
+                {
+                    "description": "defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.",
+                    "length": 255,
+                    "name": "isrecursive",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "state of the virtual machine. Possible values are: Running, Stopped, Present, Destroyed, Expunged. Present is used for the state equal not destroyed.",
+                    "length": 255,
+                    "name": "state",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the IDs of the virtual machines, mutually exclusive with id",
+                    "length": 255,
+                    "name": "ids",
+                    "related": "updateVMAffinityGroup,rebootVirtualMachine,changeServiceForVirtualMachine,detachIso,resetSSHKeyForVirtualMachine,resetSSHKeyForVirtualMachine,migrateVirtualMachineWithVolume,restoreVirtualMachine,attachIso,removeNicFromVirtualMachine,updateVirtualMachine,recoverVirtualMachine,migrateVirtualMachine,resetPasswordForVirtualMachine,revertToVMSnapshot,assignVirtualMachine,updateVMAffinityGroup,listVirtualMachines,rebootVirtualMachine,restoreVirtualMachine,destroyVirtualMachine,stopVirtualMachine,deployVirtualMachine,detachIso,deployVirtualMachine,updateDefaultNicForVirtualMachine,updateVirtualMachine,revertToVMSnapshot,addNicToVirtualMachine,tmDestroyVirtualMachine,resetPasswordForVirtualMachine,startVirtualMachine,updateDefaultNicForVirtualMachine,startVirtualMachine,updateVmNicIp,attachIso,listVirtualMachines,addNicToVirtualMachine,stopVirtualMachine,destroyVirtualMachine,removeNicFromVirtualMachine,changeServiceForVirtualMachine",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "list"
+                },
+                {
+                    "description": "list objects by project",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "listProjectAccounts,suspendProject,activateProject,updateProject,createProject,listProjects",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list vms by affinity group",
+                    "length": 255,
+                    "name": "affinitygroupid",
+                    "related": "createAffinityGroup,listAffinityGroups",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list vms by ssh keypair name",
+                    "length": 255,
+                    "name": "keypair",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the availability zone ID",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones,listZones,createZone,updateZone",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the host ID",
+                    "length": 255,
+                    "name": "hostid",
+                    "related": "addBaremetalHost,listExternalLoadBalancers,prepareHostForMaintenance,reconnectHost,addHost,updateHost,cancelHostMaintenance,listHosts",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the pod ID",
+                    "length": 255,
+                    "name": "podid",
+                    "related": "listPods,updatePod",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the ID of the virtual machine",
+                    "length": 255,
+                    "name": "id",
+                    "related": "updateVMAffinityGroup,rebootVirtualMachine,changeServiceForVirtualMachine,detachIso,resetSSHKeyForVirtualMachine,resetSSHKeyForVirtualMachine,migrateVirtualMachineWithVolume,restoreVirtualMachine,attachIso,removeNicFromVirtualMachine,updateVirtualMachine,recoverVirtualMachine,migrateVirtualMachine,resetPasswordForVirtualMachine,revertToVMSnapshot,assignVirtualMachine,updateVMAffinityGroup,listVirtualMachines,rebootVirtualMachine,restoreVirtualMachine,destroyVirtualMachine,stopVirtualMachine,deployVirtualMachine,detachIso,deployVirtualMachine,updateDefaultNicForVirtualMachine,updateVirtualMachine,revertToVMSnapshot,addNicToVirtualMachine,tmDestroyVirtualMachine,resetPasswordForVirtualMachine,startVirtualMachine,updateDefaultNicForVirtualMachine,startVirtualMachine,updateVmNicIp,attachIso,listVirtualMachines,addNicToVirtualMachine,stopVirtualMachine,destroyVirtualMachine,removeNicFromVirtualMachine,changeServiceForVirtualMachine",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the target hypervisor for the template",
+                    "length": 255,
+                    "name": "hypervisor",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "list resources by display flag; only ROOT admin is eligible to pass this parameter",
+                    "length": 255,
+                    "name": "displayvm",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "boolean"
+                },
+                {
+                    "description": "list by network type; true if need to list vms using Virtual Network, false otherwise",
+                    "length": 255,
+                    "name": "forvirtualnetwork",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "the user ID that created the VM and is under the account that owns the VM",
+                    "length": 255,
+                    "name": "userid",
+                    "related": "disableUser,lockUser,enableUser,getUser,listUsers,updateUser,createUser",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the pod ID",
+                    "length": 255,
+                    "name": "podid",
+                    "related": "listPods,updatePod",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the storage ID where vm's volumes belong to",
+                    "length": 255,
+                    "name": "storageid",
+                    "related": "createStoragePool,listStoragePools,findStoragePoolsForMigration,updateStoragePool,enableStorageMaintenance,cancelStorageMaintenance",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the host ID",
+                    "length": 255,
+                    "name": "hostid",
+                    "related": "addBaremetalHost,listExternalLoadBalancers,prepareHostForMaintenance,reconnectHost,addHost,updateHost,cancelHostMaintenance,listHosts",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "List resources by tags (key/value pairs)",
+                    "length": 255,
+                    "name": "tags",
+                    "required": false,
+                    "type": "map"
+                },
+                {
+                    "description": "list vms by iso",
+                    "length": 255,
+                    "name": "isoid",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list resources by account. Must be used with the domainId parameter.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "list vms by vpc",
+                    "length": 255,
+                    "name": "vpcid",
+                    "related": "restartVPC,updateVPC,listVPCs,createVPC,updateVPC,listVPCs,createVPC",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list by network id",
+                    "length": 255,
+                    "name": "networkid",
+                    "related": "createNetwork,updateNetwork,listSrxFirewallNetworks,listNetworks,updateNetwork,listBrocadeVcsDeviceNetworks,listNiciraNvpDeviceNetworks,createNetwork,listNetworks,listNetscalerLoadBalancerNetworks,listF5LoadBalancerNetworks,listPaloAltoFirewallNetworks",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "the group ID",
+                    "length": 255,
+                    "name": "groupid",
+                    "related": "createInstanceGroup,listInstanceGroups,updateInstanceGroup",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list vms by template",
+                    "length": 255,
+                    "name": "templateid",
+                    "related": "copyTemplate,registerTemplate,listIsos,copyTemplate,listTemplates,registerTemplate,listTemplates,createTemplate,registerIso,registerIso,prepareTemplate,updateIso,listIsos,updateTemplate,createTemplate,copyIso",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list by the service offering",
+                    "length": 255,
+                    "name": "serviceofferingid",
+                    "related": "createServiceOffering,updateServiceOffering,listServiceOfferings",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "uuid"
+                },
+                {
+                    "description": "name of the virtual machine (a substring match is made against the parameter value, data for all matching VMs will be returned)",
+                    "length": 255,
+                    "name": "name",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "list only resources belonging to the domain specified",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "updateDomain,createDomain,listDomains,listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "If set to false, list only resources belonging to the command's caller; if set to true - list resources that the caller is authorized to see. Default value is false",
+                    "length": 255,
+                    "name": "listall",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "comma separated list of host details requested, value can be a list of [all, group, nics, stats, secgrp, tmpl, servoff, diskoff, iso, volume, min, affgrp]. If no parameter is passed in, the details will be defaulted to all",
+                    "length": 255,
+                    "name": "details",
+                    "required": false,
+                    "type": "list"
+                },
+                {
+                    "description": "the storage ID where vm's volumes belong to",
+                    "length": 255,
+                    "name": "storageid",
+                    "related": "createStoragePool,listStoragePools,findStoragePoolsForMigration,updateStoragePool,enableStorageMaintenance,cancelStorageMaintenance",
+                    "required": false,
+                    "type": "uuid"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the VM's primary IP address",
+                    "name": "ipaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "disk read in MiB",
+                    "name": "diskread",
+                    "type": "string"
+                },
+                {
+                    "description": "the total memory capacity in GiB",
+                    "name": "memorytotal",
+                    "type": "string"
+                },
+                {
+                    "description": "network read in MiB",
+                    "name": "networkread",
+                    "type": "string"
+                },
+                {
+                    "description": "disk write in MiB",
+                    "name": "diskwrite",
+                    "type": "string"
+                },
+                {
+                    "description": "the total cpu capacity in Ghz",
+                    "name": "cputotal",
+                    "type": "string"
+                },
+                {
+                    "description": "the total disk iops",
+                    "name": "diskiopstotal",
+                    "type": "long"
+                },
+                {
+                    "description": "network write in MiB",
+                    "name": "networkwrite",
+                    "type": "string"
+                }
+            ],
+            "since": "4.9.3"
+        },
+        {
+            "description": "Deletes a storage pool.",
+            "isasync": false,
+            "name": "deleteStoragePool",
+            "params": [
+                {
+                    "description": "Storage pool id",
+                    "length": 255,
+                    "name": "id",
+                    "related": "createStoragePool,listStoragePools,findStoragePoolsForMigration,updateStoragePool,enableStorageMaintenance,cancelStorageMaintenance",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "Force destroy storage pool (force expunge volumes in Destroyed state as a part of pool removal)",
+                    "length": 255,
+                    "name": "forced",
+                    "required": false,
+                    "type": "boolean"
+                }
+            ],
+            "response": [
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                },
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Lists hosts.",
+            "isasync": false,
+            "name": "listHosts",
+            "params": [
+                {
+                    "description": "comma separated list of host details requested, value can be a list of [ min, all, capacity, events, stats]",
+                    "length": 255,
+                    "name": "details",
+                    "required": false,
+                    "type": "list"
+                },
+                {
+                    "description": "the id of the host",
+                    "length": 255,
+                    "name": "id",
+                    "related": "addBaremetalHost,listExternalLoadBalancers,prepareHostForMaintenance,reconnectHost,addHost,updateHost,cancelHostMaintenance,listHosts",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the host type",
+                    "length": 255,
+                    "name": "type",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "the state of the host",
+                    "length": 255,
+                    "name": "state",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "hypervisor type of host: XenServer,KVM,VMware,Hyperv,BareMetal,Simulator",
+                    "length": 255,
+                    "name": "hypervisor",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "list hosts by resource state. Resource state represents current state determined by admin of host, value can be one of [Enabled, Disabled, Unmanaged, PrepareForMaintenance, ErrorInMaintenance, Maintenance, Error]",
+                    "length": 255,
+                    "name": "resourcestate",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone ID for the host",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones,listZones,createZone,updateZone",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "lists hosts existing in particular cluster",
+                    "length": 255,
+                    "name": "clusterid",
+                    "related": "addCluster,listClusters,updateCluster",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list hosts by its out-of-band management interface's power state. Its value can be one of [On, Off, Unknown]",
+                    "length": 255,
+                    "name": "outofbandmanagementpowerstate",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "if true, list only hosts dedicated to HA",
+                    "length": 255,
+                    "name": "hahost",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "the name of the host",
+                    "length": 255,
+                    "name": "name",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "list hosts for which out-of-band management is enabled",
+                    "length": 255,
+                    "name": "outofbandmanagementenabled",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "the Pod ID for the host",
+                    "length": 255,
+                    "name": "podid",
+                    "related": "listPods,updatePod",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "lists hosts in the same cluster as this VM and flag hosts with enough CPU/RAm to host this VM",
+                    "length": 255,
+                    "name": "virtualmachineid",
+                    "related": "updateVMAffinityGroup,rebootVirtualMachine,changeServiceForVirtualMachine,detachIso,resetSSHKeyForVirtualMachine,resetSSHKeyForVirtualMachine,migrateVirtualMachineWithVolume,restoreVirtualMachine,attachIso,removeNicFromVirtualMachine,updateVirtualMachine,recoverVirtualMachine,migrateVirtualMachine,resetPasswordForVirtualMachine,revertToVMSnapshot,assignVirtualMachine,updateVMAffinityGroup,listVirtualMachines,rebootVirtualMachine,restoreVirtualMachine,destroyVirtualMachine,stopVirtualMachine,deployVirtualMachine,detachIso,deployVirtualMachine,updateDefaultNicForVirtualMachine,updateVirtualMachine,revertToVMSnapshot,addNicToVirtualMachine,tmDestroyVirtualMachine,resetPasswordForVirtualMachine,startVirtualMachine,updateDefaultNicForVirtualMachine,startVirtualMachine,updateVmNicIp,attachIso,listVirtualMachines,addNicToVirtualMachine,stopVirtualMachine,destroyVirtualMachine,removeNicFromVirtualMachine,changeServiceForVirtualMachine",
+                    "required": false,
+                    "type": "uuid"
+                }
+            ],
+            "related": "addBaremetalHost,listExternalLoadBalancers,prepareHostForMaintenance,reconnectHost,addHost,updateHost,cancelHostMaintenance",
+            "response": [
+                {
+                    "description": "GPU cards present in the host",
+                    "name": "gpugroup",
+                    "response": [
+                        {
+                            "description": "GPU cards present in the host",
+                            "name": "gpugroupname",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of enabled vGPUs",
+                            "name": "vgpu",
+                            "response": [
+                                {
+                                    "description": "Maximum displays per user",
+                                    "name": "maxheads",
+                                    "type": "long"
+                                },
+                                {
+                                    "description": "Maximum Y resolution per display",
+                                    "name": "maxresolutiony",
+                                    "type": "long"
+                                },
+                                {
+                                    "description": "Remaining capacity in terms of no. of more VMs that can be deployped with this vGPU type",
+                                    "name": "remainingcapacity",
+                                    "type": "long"
+                                },
+                                {
+                                    "description": "Maximum vgpu can be created with this vgpu type on the given gpu group",
+                                    "name": "maxcapacity",
+                                    "type": "long"
+                                },
+                                {
+                                    "description": "Video RAM for this vGPU type",
+                                    "name": "videoram",
+                                    "type": "long"
+                                },
+                                {
+                                    "description": "Model Name of vGPU",
+                                    "name": "vgputype",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "Maximum no. of vgpu per gpu card (pgpu)",
+                                    "name": "maxvgpuperpgpu",
+                                    "type": "long"
+                                },
+                                {
+                                    "description": "Maximum X resolution per display",
+                                    "name": "maxresolutionx",
+                                    "type": "long"
+                                }
+                            ],
+                            "type": "list"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "true if this host has enough CPU and RAM capacity to migrate a VM to it, false otherwise",
+                    "name": "hasenoughcapacity",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the Zone ID of the host",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the memory total of the host",
+                    "name": "memorytotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the Pod ID of the host",
+                    "name": "podid",
+                    "type": "string"
+                },
+                {
+                    "description": "the IP address of the host",
+                    "name": "ipaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the host's currently allocated disk size",
+                    "name": "disksizeallocated",
+                    "type": "long"
+                },
+                {
+                    "description": "events available for the host",
+                    "name": "events",
+                    "type": "string"
+                },
+                {
+                    "description": "the OS category ID of the host",
+                    "name": "oscategoryid",
+                    "type": "string"
+                },
+                {
+                    "description": "the number of CPU sockets on the host",
+                    "name": "cpusockets",
+                    "type": "integer"
+                },
+                {
+                    "description": "the Zone name of the host",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the outgoing network traffic on the host",
+                    "name": "networkkbswrite",
+                    "type": "long"
+                },
+                {
+                    "description": "the management server ID of the host",
+                    "name": "managementserverid",
+                    "type": "long"
+                },
+                {
+                    "description": "Host details in key/value pairs.",
+                    "name": "details",
+                    "type": "map"
+                },
+                {
+                    "description": "the hypervisor version",
+                    "name": "hypervisorversion",
+                    "type": "string"
+                },
+                {
+                    "description": "the Pod name of the host",
+                    "name": "podname",
+                    "type": "string"
+                },
+                {
+                    "description": "the OS category name of the host",
+                    "name": "oscategoryname",
+                    "type": "string"
+                },
+                {
+                    "description": "the amount of the host's CPU currently used",
+                    "name": "cpuused",
+                    "type": "string"
+                },
+                {
+                    "description": "the date and time the host was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the host type",
+                    "name": "type",
+                    "type": "type"
+                },
+                {
+                    "description": "the host version",
+                    "name": "version",
+                    "type": "string"
+                },
+                {
+                    "description": "true if the host is Ha host (dedicated to vms started by HA process; false otherwise",
+                    "name": "hahost",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the amount of the host's memory currently used",
+                    "name": "memoryused",
+                    "type": "long"
+                },
+                {
+                    "description": "the total disk size of the host",
+                    "name": "disksizetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "true if local storage is active, false otherwise",
+                    "name": "islocalstorageactive",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the cluster ID of the host",
+                    "name": "clusterid",
+                    "type": "string"
+                },
+                {
+                    "description": "the cluster type of the cluster that host belongs to",
+                    "name": "clustertype",
+                    "type": "string"
+                },
+                {
+                    "description": "the CPU speed of the host",
+                    "name": "cpuspeed",
+                    "type": "long"
+                },
+                {
+                    "description": "true if the host is disconnected. False otherwise.",
+                    "name": "disconnected",
+                    "type": "date"
+                },
+                {
+                    "description": "the resource state of the host",
+                    "name": "resourcestate",
+                    "type": "string"
+                },
+                {
+                    "description": "the host hypervisor",
+                    "name": "hypervisor",
+                    "type": "hypervisortype"
+                },
+                {
+                    "description": "the date and time the host was last pinged",
+                    "name": "lastpinged",
+                    "type": "date"
+                },
+                {
+                    "description": "the date and time the host was removed",
+                    "name": "removed",
+                    "type": "date"
+                },
+                {
+                    "description": "the name of the host",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the amount of the host's CPU currently allocated",
+                    "name": "cpuallocated",
+                    "type": "string"
+                },
+                {
+                    "description": "the CPU number of the host",
+                    "name": "cpunumber",
+                    "type": "integer"
+                },
+                {
+                    "description": "the state of the host",
+                    "name": "state",
+                    "type": "status"
+                },
+                {
+                    "description": "the incoming network traffic on the host",
+                    "name": "networkkbsread",
+                    "type": "long"
+                },
+                {
+                    "description": "the cluster name of the host",
+                    "name": "clustername",
+                    "type": "string"
+                },
+                {
+                    "description": "the amount of the host's memory currently allocated",
+                    "name": "memoryallocated",
+                    "type": "long"
+                },
+                {
+                    "description": "the ID of the host",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "true if this host is suitable(has enough capacity and satisfies all conditions like hosttags, max guests vm limit etc) to migrate a VM to it , false otherwise",
+                    "name": "suitableformigration",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the amount of the host's CPU after applying the cpu.overprovisioning.factor ",
+                    "name": "cpuwithoverprovisioning",
+                    "type": "string"
+                },
+                {
+                    "description": "the cpu average load on the host",
+                    "name": "averageload",
+                    "type": "long"
+                },
+                {
+                    "description": "comma-separated list of tags for the host",
+                    "name": "hosttags",
+                    "type": "string"
+                },
+                {
+                    "description": "the host out-of-band management information",
+                    "name": "outofbandmanagement",
+                    "type": "outofbandmanagementresponse"
+                },
+                {
+                    "description": "capabilities of the host",
+                    "name": "capabilities",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Updates a storage pool.",
+            "isasync": false,
+            "name": "updateStoragePool",
+            "params": [
+                {
+                    "description": "bytes CloudStack can provision from this storage pool",
+                    "length": 255,
+                    "name": "capacitybytes",
+                    "required": false,
+                    "type": "long"
+                },
+                {
+                    "description": "IOPS CloudStack can provision from this storage pool",
+                    "length": 255,
+                    "name": "capacityiops",
+                    "required": false,
+                    "type": "long"
+                },
+                {
+                    "description": "the Id of the storage pool",
+                    "length": 255,
+                    "name": "id",
+                    "related": "createStoragePool,listStoragePools,findStoragePoolsForMigration,updateStoragePool,enableStorageMaintenance,cancelStorageMaintenance",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "false to disable the pool for allocation of new volumes, true to enable it back.",
+                    "length": 255,
+                    "name": "enabled",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "comma-separated list of tags for the storage pool",
+                    "length": 255,
+                    "name": "tags",
+                    "required": false,
+                    "type": "list"
+                }
+            ],
+            "related": "createStoragePool,listStoragePools,findStoragePoolsForMigration,enableStorageMaintenance,cancelStorageMaintenance",
+            "response": [
+                {
+                    "description": "true if this pool is suitable to migrate a volume, false otherwise",
+                    "name": "suitableformigration",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the Zone name of the storage pool",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the storage pool type",
+                    "name": "type",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the cluster for the storage pool",
+                    "name": "clusterid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the storage pool",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the host's currently used disk size",
+                    "name": "disksizeused",
+                    "type": "long"
+                },
+                {
+                    "description": "the ID of the storage pool",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the IP address of the storage pool",
+                    "name": "ipaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the Pod name of the storage pool",
+                    "name": "podname",
+                    "type": "string"
+                },
+                {
+                    "description": "the total disk size of the storage pool",
+                    "name": "disksizetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the state of the storage pool",
+                    "name": "state",
+                    "type": "storagepoolstatus"
+                },
+                {
+                    "description": "the Pod ID of the storage pool",
+                    "name": "podid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the cluster for the storage pool",
+                    "name": "clustername",
+                    "type": "string"
+                },
+                {
+                    "description": "the tags for the storage pool",
+                    "name": "tags",
+                    "type": "string"
+                },
+                {
+                    "description": "the scope of the storage pool",
+                    "name": "scope",
+                    "type": "string"
+                },
+                {
+                    "description": "the hypervisor type of the storage pool",
+                    "name": "hypervisor",
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone ID of the storage pool",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the date and time the storage pool was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the overprovisionfactor for the storage pool",
+                    "name": "overprovisionfactor",
+                    "type": "string"
+                },
+                {
+                    "description": "the storage pool path",
+                    "name": "path",
+                    "type": "string"
+                },
+                {
+                    "description": "the host's currently allocated disk size",
+                    "name": "disksizeallocated",
+                    "type": "long"
+                },
+                {
+                    "description": "the storage pool capabilities",
+                    "name": "storagecapabilities",
+                    "type": "map"
+                },
+                {
+                    "description": "IOPS CloudStack can provision from this storage pool",
+                    "name": "capacityiops",
+                    "type": "long"
+                }
+            ],
+            "since": "3.0.0"
+        },
+        {
+            "description": "Reboots a system VM.",
+            "isasync": true,
+            "name": "rebootSystemVm",
+            "params": [
+                {
+                    "description": "The ID of the system virtual machine",
+                    "length": 255,
+                    "name": "id",
+                    "related": "destroySystemVm,changeServiceForSystemVm,scaleSystemVm,migrateSystemVm,rebootSystemVm,listSystemVms,stopSystemVm,startSystemVm",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "destroySystemVm,changeServiceForSystemVm,scaleSystemVm,migrateSystemVm,listSystemVms,stopSystemVm,startSystemVm",
+            "response": [
+                {
+                    "description": "the template ID for the system VM",
+                    "name": "templateid",
+                    "type": "string"
+                },
+                {
+                    "description": "the first DNS for the system VM",
+                    "name": "dns1",
+                    "type": "string"
+                },
+                {
+                    "description": "the gateway for the system VM",
+                    "name": "gateway",
+                    "type": "string"
+                },
+                {
+                    "description": "the link local MAC address for the system vm",
+                    "name": "linklocalmacaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone ID for the system VM",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the Pod ID for the system VM",
+                    "name": "podid",
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone name for the system VM",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the public netmask for the system VM",
+                    "name": "publicnetmask",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of the system VM",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the job status associated with the system VM.  This is only displayed if the router listed is part of a currently running asynchronous job.",
+                    "name": "jobstatus",
+                    "type": "integer"
+                },
+                {
+                    "description": "the private IP address for the system VM",
+                    "name": "privateip",
+                    "type": "string"
+                },
+                {
+                    "description": "the host ID for the system VM",
+                    "name": "hostid",
+                    "type": "string"
+                },
+                {
+                    "description": "the job ID associated with the system VM. This is only displayed if the router listed is part of a currently running asynchronous job.",
+                    "name": "jobid",
+                    "type": "string"
+                },
+                {
+                    "description": "the number of active console sessions for the console proxy system vm",
+                    "name": "activeviewersessions",
+                    "type": "integer"
+                },
+                {
+                    "description": "the network domain for the system VM",
+                    "name": "networkdomain",
+                    "type": "string"
+                },
+                {
+                    "description": "the private netmask for the system VM",
+                    "name": "privatenetmask",
+                    "type": "string"
+                },
+                {
+                    "description": "the link local netmask for the system vm",
+                    "name": "linklocalnetmask",
+                    "type": "string"
+                },
+                {
+                    "description": "the public MAC address for the system VM",
+                    "name": "publicmacaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the system VM type",
+                    "name": "systemvmtype",
+                    "type": "string"
+                },
+                {
+                    "description": "the second DNS for the system VM",
+                    "name": "dns2",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the system VM",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the system VM",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the hostname for the system VM",
+                    "name": "hostname",
+                    "type": "string"
+                },
+                {
+                    "description": "the date and time the system VM was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the private MAC address for the system VM",
+                    "name": "privatemacaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the link local IP address for the system vm",
+                    "name": "linklocalip",
+                    "type": "string"
+                },
+                {
+                    "description": "the public IP address for the system VM",
+                    "name": "publicip",
+                    "type": "string"
+                },
+                {
+                    "description": "the hypervisor on which the template runs",
+                    "name": "hypervisor",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Import LDAP users",
+            "isasync": false,
+            "name": "importLdapUsers",
+            "params": [
+                {
+                    "description": "Specifies a timezone for this command. For more information on the timezone parameter, see Time Zone Format.",
+                    "length": 255,
+                    "name": "timezone",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "Specifies the domain to which the ldap users are to be imported. If no domain is specified, a domain will created using group parameter. If the group is also not specified, a domain name based on the OU information will be created. If no OU hierarchy exists, will be defaulted to ROOT domain",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "updateDomain,createDomain,listDomains,listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "Creates the user under the specified account. If no account is specified, the username will be used as the account name.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "Type of the account.  Specify 0 for user, 1 for root admin, and 2 for domain admin",
+                    "length": 255,
+                    "name": "accounttype",
+                    "required": false,
+                    "type": "short"
+                },
+                {
+                    "description": "Creates the account under the specified role.",
+                    "length": 255,
+                    "name": "roleid",
+                    "related": "listRoles,createRole",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "Specifies the group name from which the ldap users are to be imported. If no group is specified, all the users will be imported.",
+                    "length": 255,
+                    "name": "group",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "details for account used to store specific parameters",
+                    "length": 255,
+                    "name": "accountdetails",
+                    "required": false,
+                    "type": "map"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "searchLdap,listLdapUsers",
+            "response": [
+                {
+                    "description": "The user's lastname",
+                    "name": "lastname",
+                    "type": "string"
+                },
+                {
+                    "description": "The user's username",
+                    "name": "username",
+                    "type": "string"
+                },
+                {
+                    "description": "The user's domain",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "The user's principle",
+                    "name": "principal",
+                    "type": "string"
+                },
+                {
+                    "description": "The user's email",
+                    "name": "email",
+                    "type": "string"
+                },
+                {
+                    "description": "The user's firstname",
+                    "name": "firstname",
+                    "type": "string"
+                }
+            ],
+            "since": "4.3.0"
+        },
+        {
+            "description": "Lists all available networks.",
+            "isasync": false,
+            "name": "listNetworks",
+            "params": [
+                {
+                    "description": "list objects by project",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "listProjectAccounts,suspendProject,activateProject,updateProject,createProject,listProjects",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list networks supporting certain services",
+                    "length": 255,
+                    "name": "supportedservices",
+                    "required": false,
+                    "type": "list"
+                },
+                {
+                    "description": "the zone ID of the network",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones,listZones,createZone,updateZone",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "type of the traffic",
+                    "length": 255,
+                    "name": "traffictype",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "list networks available for VM deployment",
+                    "length": 255,
+                    "name": "canusefordeploy",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "the network belongs to VPC",
+                    "length": 255,
+                    "name": "forvpc",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.",
+                    "length": 255,
+                    "name": "isrecursive",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "list resources by account. Must be used with the domainId parameter.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "list networks by ID",
+                    "length": 255,
+                    "name": "id",
+                    "related": "createNetwork,updateNetwork,listSrxFirewallNetworks,listNetworks,updateNetwork,listBrocadeVcsDeviceNetworks,listNiciraNvpDeviceNetworks,createNetwork,listNetworks,listNetscalerLoadBalancerNetworks,listF5LoadBalancerNetworks,listPaloAltoFirewallNetworks",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list resources by display flag; only ROOT admin is eligible to pass this parameter",
+                    "length": 255,
+                    "name": "displaynetwork",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "boolean"
+                },
+                {
+                    "description": "list networks by ACL (access control list) type. Supported values are account and domain",
+                    "length": 255,
+                    "name": "acltype",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the type of the network. Supported values are: isolated and shared",
+                    "length": 255,
+                    "name": "type",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "List resources by tags (key/value pairs)",
+                    "length": 255,
+                    "name": "tags",
+                    "required": false,
+                    "type": "map"
+                },
+                {
+                    "description": "List networks by VPC",
+                    "length": 255,
+                    "name": "vpcid",
+                    "related": "restartVPC,updateVPC,listVPCs,createVPC,updateVPC,listVPCs,createVPC",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "true if need to list only networks which support specifying IP ranges",
+                    "length": 255,
+                    "name": "specifyipranges",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "list networks by physical network id",
+                    "length": 255,
+                    "name": "physicalnetworkid",
+                    "related": "updatePhysicalNetwork,createPhysicalNetwork,listPhysicalNetworks",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "If set to false, list only resources belonging to the command's caller; if set to true - list resources that the caller is authorized to see. Default value is false",
+                    "length": 255,
+                    "name": "listall",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "list only resources belonging to the domain specified",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "updateDomain,createDomain,listDomains,listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "list networks by restartRequired",
+                    "length": 255,
+                    "name": "restartrequired",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "true if network is system, false otherwise",
+                    "length": 255,
+                    "name": "issystem",
+                    "required": false,
+                    "type": "boolean"
+                }
+            ],
+            "related": "createNetwork,updateNetwork,listSrxFirewallNetworks,updateNetwork,listBrocadeVcsDeviceNetworks,listNiciraNvpDeviceNetworks,createNetwork,listNetworks,listNetscalerLoadBalancerNetworks,listF5LoadBalancerNetworks,listPaloAltoFirewallNetworks",
+            "response": [
+                {
+                    "description": "the project id of the ipaddress",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the network's IP range not to be used by CloudStack guest VMs and can be used for non CloudStack purposes",
+                    "name": "reservediprange",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the address",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "If a network is enabled for 'streched l2 subnet' then represents zones on which network currently spans",
+                    "name": "zonesnetworkspans",
+                    "type": "set"
+                },
+                {
+                    "description": "the traffic type of the network",
+                    "name": "traffictype",
+                    "type": "string"
+                },
+                {
+                    "description": "an optional field, whether to the display the network to the end user or not.",
+                    "name": "displaynetwork",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the list of resource tags associated with network",
+                    "name": "tags",
+                    "response": [
+                        {
+                            "description": "the project name where tag belongs to",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag value",
+                            "name": "value",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain associated with the tag",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project id the tag belongs to",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "id of the resource",
+                            "name": "resourceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag key name",
+                            "name": "key",
+                            "type": "string"
+                        },
+                        {
+                            "description": "resource type",
+                            "name": "resourcetype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account associated with the tag",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the domain associated with the tag",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "customer associated with the tag",
+                            "name": "customer",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "ACL Id associated with the VPC network",
+                    "name": "aclid",
+                    "type": "string"
+                },
+                {
+                    "description": "related to what other network configuration",
+                    "name": "related",
+                    "type": "string"
+                },
+                {
+                    "description": "the first DNS for the network",
+                    "name": "dns1",
+                    "type": "string"
+                },
+                {
+                    "description": "Cloudstack managed address space, all CloudStack managed VMs get IP address from CIDR",
+                    "name": "cidr",
+                    "type": "string"
+                },
+                {
+                    "description": "network offering id the network is created from",
+                    "name": "networkofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "the second DNS for the network",
+                    "name": "dns2",
+                    "type": "string"
+                },
+                {
+                    "description": "The vlan of the network. This parameter is visible to ROOT admins only",
+                    "name": "vlan",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the network",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "broadcast uri of the network. This parameter is visible to ROOT admins only",
+                    "name": "broadcasturi",
+                    "type": "string"
+                },
+                {
+                    "description": "name of the network offering the network is created from",
+                    "name": "networkofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the zone the network belongs to",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the id of the network",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "zone id of the network",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "true if network is default, false otherwise",
+                    "name": "isdefault",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the domain id of the network owner",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "list networks that are persistent",
+                    "name": "ispersistent",
+                    "type": "boolean"
+                },
+                {
+                    "description": "VPC the network belongs to",
+                    "name": "vpcid",
+                    "type": "string"
+                },
+                {
+                    "description": "the network CIDR of the guest network configured with IP reservation. It is the summation of CIDR and RESERVED_IP_RANGE",
+                    "name": "networkcidr",
+                    "type": "string"
+                },
+                {
+                    "description": "the owner of the network",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "true network requires restart",
+                    "name": "restartrequired",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the domain name of the network owner",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "availability of the network offering the network is created from",
+                    "name": "networkofferingavailability",
+                    "type": "string"
+                },
+                {
+                    "description": "true if network is system, false otherwise",
+                    "name": "issystem",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the type of the network",
+                    "name": "type",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of services",
+                    "name": "service",
+                    "response": [
+                        {
+                            "description": "the service provider name",
+                            "name": "provider",
+                            "response": [
+                                {
+                                    "description": "the physical network this belongs to",
+                                    "name": "physicalnetworkid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the destination physical network",
+                                    "name": "destinationphysicalnetworkid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "uuid of the network provider",
+                                    "name": "id",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the provider name",
+                                    "name": "name",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "services for this provider",
+                                    "name": "servicelist",
+                                    "type": "list"
+                                },
+                                {
+                                    "description": "true if individual services can be enabled/disabled",
+                                    "name": "canenableindividualservice",
+                                    "type": "boolean"
+                                },
+                                {
+                                    "description": "state of the network provider",
+                                    "name": "state",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "list"
+                        },
+                        {
+                            "description": "the list of capabilities",
+                            "name": "capability",
+                            "response": [
+                                {
+                                    "description": "the capability value",
+                                    "name": "value",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the capability name",
+                                    "name": "name",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "can this service capability value can be choosable while creatine network offerings",
+                                    "name": "canchooseservicecapability",
+                                    "type": "boolean"
+                                }
+                            ],
+                            "type": "list"
+                        },
+                        {
+                            "description": "the service name",
+                            "name": "name",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "the displaytext of the network",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "the network's gateway",
+                    "name": "gateway",
+                    "type": "string"
+                },
+                {
+                    "description": "the physical network id",
+                    "name": "physicalnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "Broadcast domain type of the network",
+                    "name": "broadcastdomaintype",
+                    "type": "string"
+                },
+                {
+                    "description": "display text of the network offering the network is created from",
+                    "name": "networkofferingdisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "state of the network",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "acl type - access type to the network",
+                    "name": "acltype",
+                    "type": "string"
+                },
+                {
+                    "description": "list networks available for vm deployment",
+                    "name": "canusefordeploy",
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if network supports specifying ip ranges, false otherwise",
+                    "name": "specifyipranges",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the network's netmask",
+                    "name": "netmask",
+                    "type": "string"
+                },
+                {
+                    "description": "true if network offering is ip conserve mode enabled",
+                    "name": "networkofferingconservemode",
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if network can span multiple zones",
+                    "name": "strechedl2subnet",
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if users from subdomains can access the domain level network",
+                    "name": "subdomainaccess",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the network domain",
+                    "name": "networkdomain",
+                    "type": "string"
+                },
+                {
+                    "description": "the cidr of IPv6 network",
+                    "name": "ip6cidr",
+                    "type": "string"
+                },
+                {
+                    "description": "the gateway of IPv6 network",
+                    "name": "ip6gateway",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "List dedicated zones.",
+            "isasync": false,
+            "name": "listDedicatedZones",
+            "params": [
+                {
+                    "description": "list dedicated zones by affinity group",
+                    "length": 255,
+                    "name": "affinitygroupid",
+                    "related": "createAffinityGroup,listAffinityGroups",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the ID of the domain associated with the zone",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "updateDomain,createDomain,listDomains,listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "the name of the account associated with the zone. Must be used with domainId.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the Zone",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones,listZones,createZone,updateZone",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                }
+            ],
+            "related": "dedicateZone",
+            "response": [
+                {
+                    "description": "the ID of the dedicated resource",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the Dedication Affinity Group ID of the zone",
+                    "name": "affinitygroupid",
+                    "type": "string"
+                },
+                {
+                    "description": "the Account Id to which the Zone is dedicated",
+                    "name": "accountid",
+                    "type": "string"
+                },
+                {
+                    "description": "the Name of the Zone",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the Zone",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain ID to which the Zone is dedicated",
+                    "name": "domainid",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Lists the pools of elastistor",
+            "isasync": false,
+            "name": "listElastistorPool",
+            "params": [
+                {
+                    "description": "the ID of the Pool",
+                    "length": 255,
+                    "name": "id",
+                    "required": false,
+                    "type": "long"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the current available space of the pool",
+                    "name": "size",
+                    "type": "long"
+                },
+                {
+                    "description": "controller of the pool",
+                    "name": "controllerid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the storage pool",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of the storage pool",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the storage pool",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "available iops of the pool",
+                    "name": "maxiops",
+                    "type": "long"
+                },
+                {
+                    "description": "default gateway of the pool",
+                    "name": "gateway",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Updates firewall rule ",
+            "isasync": true,
+            "name": "updateFirewallRule",
+            "params": [
+                {
+                    "description": "an optional field, in case you want to set a custom id to the resource. Allowed to Root Admins only",
+                    "length": 255,
+                    "name": "customid",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "string"
+                },
+                {
+                    "description": "an optional field, whether to the display the rule to the end user or not",
+                    "length": 255,
+                    "name": "fordisplay",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the ID of the firewall rule",
+                    "length": 255,
+                    "name": "id",
+                    "related": "listIpForwardingRules,createIpForwardingRule,updatePortForwardingRule,createPortForwardingRule,listPortForwardingRules",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "listFirewallRules,createFirewallRule,createEgressFirewallRule,updateEgressFirewallRule,listEgressFirewallRules",
+            "response": [
+                {
+                    "description": "is rule for display to the regular user",
+                    "name": "fordisplay",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the starting port of firewall rule's port range",
+                    "name": "startport",
+                    "type": "integer"
+                },
+                {
+                    "description": "the public ip address for the firewall rule",
+                    "name": "ipaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of resource tags associated with the rule",
+                    "name": "tags",
+                    "response": [
+                        {
+                            "description": "the project name where tag belongs to",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag key name",
+                            "name": "key",
+                            "type": "string"
+                        },
+                        {
+                            "description": "customer associated with the tag",
+                            "name": "customer",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag value",
+                            "name": "value",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain associated with the tag",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "resource type",
+                            "name": "resourcetype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account associated with the tag",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the domain associated with the tag",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "id of the resource",
+                            "name": "resourceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project id the tag belongs to",
+                            "name": "projectid",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "the cidr list to forward traffic from",
+                    "name": "cidrlist",
+                    "type": "string"
+                },
+                {
+                    "description": "type of the icmp message being sent",
+                    "name": "icmptype",
+                    "type": "integer"
+                },
+                {
+                    "description": "the state of the rule",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the network id of the firewall rule",
+                    "name": "networkid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the firewall rule",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the protocol of the firewall rule",
+                    "name": "protocol",
+                    "type": "string"
+                },
+                {
+                    "description": "the ending port of firewall rule's port range",
+                    "name": "endport",
+                    "type": "integer"
+                },
+                {
+                    "description": "error code for this icmp message",
+                    "name": "icmpcode",
+                    "type": "integer"
+                },
+                {
+                    "description": "the public ip address id for the firewall rule",
+                    "name": "ipaddressid",
+                    "type": "string"
+                }
+            ],
+            "since": "4.4"
+        },
+        {
+            "description": "Return true if the plugin is enabled",
+            "isasync": false,
+            "name": "quotaIsEnabled",
+            "params": [
+
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "is quota service enabled",
+                    "name": "isenabled",
+                    "type": "boolean"
+                }
+            ],
+            "since": "4.7.0"
+        },
+        {
+            "description": "lists SRX firewall devices in a physical network",
+            "isasync": false,
+            "name": "listSrxFirewalls",
+            "params": [
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the Physical Network ID",
+                    "length": 255,
+                    "name": "physicalnetworkid",
+                    "related": "updatePhysicalNetwork,createPhysicalNetwork,listPhysicalNetworks",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "SRX firewall device ID",
+                    "length": 255,
+                    "name": "fwdeviceid",
+                    "related": "listSrxFirewalls,addSrxFirewall,configureSrxFirewall",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                }
+            ],
+            "related": "addSrxFirewall,configureSrxFirewall",
+            "response": [
+                {
+                    "description": "the public security zone of the external firewall",
+                    "name": "publiczone",
+                    "type": "string"
+                },
+                {
+                    "description": "the physical network to which this SRX firewall belongs to",
+                    "name": "physicalnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "the zone ID of the external firewall",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the private security zone of the external firewall",
+                    "name": "privatezone",
+                    "type": "string"
+                },
+                {
+                    "description": "device state",
+                    "name": "fwdevicestate",
+                    "type": "string"
+                },
+                {
+                    "description": "the timeout (in seconds) for requests to the external firewall",
+                    "name": "timeout",
+                    "type": "string"
+                },
+                {
+                    "description": "the public interface of the external firewall",
+                    "name": "publicinterface",
+                    "type": "string"
+                },
+                {
+                    "description": "the number of times to retry requests to the external firewall",
+                    "name": "numretries",
+                    "type": "string"
+                },
+                {
+                    "description": "the username that's used to log in to the external firewall",
+                    "name": "username",
+                    "type": "string"
+                },
+                {
+                    "description": "device name",
+                    "name": "fwdevicename",
+                    "type": "string"
+                },
+                {
+                    "description": "name of the provider",
+                    "name": "provider",
+                    "type": "string"
+                },
+                {
+                    "description": "the private interface of the external firewall",
+                    "name": "privateinterface",
+                    "type": "string"
+                },
+                {
+                    "description": "device id of the SRX firewall",
+                    "name": "fwdeviceid",
+                    "type": "string"
+                },
+                {
+                    "description": "the usage interface of the external firewall",
+                    "name": "usageinterface",
+                    "type": "string"
+                },
+                {
+                    "description": "device capacity",
+                    "name": "fwdevicecapacity",
+                    "type": "long"
+                },
+                {
+                    "description": "the management IP address of the external firewall",
+                    "name": "ipaddress",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "List hypervisors",
+            "isasync": false,
+            "name": "listHypervisors",
+            "params": [
+                {
+                    "description": "the zone id for listing hypervisors.",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones,listZones,createZone,updateZone",
+                    "required": false,
+                    "type": "uuid"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "Hypervisor name",
+                    "name": "name",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Deletes account from the project",
+            "isasync": true,
+            "name": "deleteAccountFromProject",
+            "params": [
+                {
+                    "description": "ID of the project to remove the account from",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "listProjectAccounts,suspendProject,activateProject,updateProject,createProject,listProjects",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "name of the account to be removed from the project",
+                    "length": 255,
+                    "name": "account",
+                    "required": true,
+                    "type": "string"
+                }
+            ],
+            "response": [
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                },
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                }
+            ],
+            "since": "3.0.0"
+        },
+        {
+            "description": "Get the SF Volume Access Group ID",
+            "isasync": false,
+            "name": "getSolidFireVolumeAccessGroupId",
+            "params": [
+                {
+                    "description": "Cluster UUID",
+                    "length": 255,
+                    "name": "clusterid",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "Storage Pool UUID",
+                    "length": 255,
+                    "name": "storageid",
+                    "required": true,
+                    "type": "string"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "SolidFire Volume Access Group Id",
+                    "name": "solidFireVolumeAccessGroupId",
+                    "type": "long"
+                }
+            ]
+        },
+        {
+            "description": "Updates the information about Guest OS",
+            "isasync": true,
+            "name": "updateGuestOs",
+            "params": [
+                {
+                    "description": "UUID of the Guest OS",
+                    "length": 255,
+                    "name": "id",
+                    "related": "updateGuestOs,addGuestOs,listOsTypes",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "Unique display name for Guest OS",
+                    "length": 255,
+                    "name": "osdisplayname",
+                    "required": true,
+                    "type": "string"
+                }
+            ],
+            "related": "addGuestOs,listOsTypes",
+            "response": [
+                {
+                    "description": "the ID of the OS type",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the name/description of the OS type",
+                    "name": "description",
+                    "type": "string"
+                },
+                {
+                    "description": "is the guest OS user defined",
+                    "name": "isuserdefined",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the OS category",
+                    "name": "oscategoryid",
+                    "type": "string"
+                }
+            ],
+            "since": "4.4.0"
+        },
+        {
+            "description": "Updates resource limits for an account or domain.",
+            "isasync": false,
+            "name": "updateResourceLimit",
+            "params": [
+                {
+                    "description": "Update resource limits for project",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "listProjectAccounts,suspendProject,activateProject,updateProject,createProject,listProjects",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "Update resource for a specified account. Must be used with the domainId parameter.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "  Maximum resource limit.",
+                    "length": 255,
+                    "name": "max",
+                    "required": false,
+                    "type": "long"
+                },
+                {
+                    "description": "Update resource limits for all accounts in specified domain. If used with the account parameter, updates resource limits for a specified account in specified domain.",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "updateDomain,createDomain,listDomains,listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "Type of resource to update. Values are 0, 1, 2, 3, 4, 6, 7, 8, 9, 10 and 11. 0 - Instance. Number of instances a user can create. 1 - IP. Number of public IP addresses a user can own. 2 - Volume. Number of disk volumes a user can create. 3 - Snapshot. Number of snapshots a user can create. 4 - Template. Number of templates that a user can register/create. 6 - Network. Number of guest network a user can create. 7 - VPC. Number of VPC a user can create. 8 - CPU. Total number of CPU cores a user can use. 9 - Memory. Total Memory (in MB) a user can use. 10 - PrimaryStorage. Total primary storage space (in GiB) a user can use. 11 - SecondaryStorage. Total secondary storage space (in GiB) a user can use. ",
+                    "length": 255,
+                    "name": "resourcetype",
+                    "required": true,
+                    "type": "integer"
+                }
+            ],
+            "related": "listResourceLimits",
+            "response": [
+                {
+                    "description": "the project id of the resource limit",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain ID of the resource limit",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the resource limit",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "resource type. Values include 0, 1, 2, 3, 4, 6, 7, 8, 9, 10, 11. See the resourceType parameter for more information on these values.",
+                    "name": "resourcetype",
+                    "type": "string"
+                },
+                {
+                    "description": "the maximum number of the resource. A -1 means the resource currently has no limit.",
+                    "name": "max",
+                    "type": "long"
+                },
+                {
+                    "description": "the domain name of the resource limit",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the account of the resource limit",
+                    "name": "account",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Deletes a static route",
+            "isasync": true,
+            "name": "deleteStaticRoute",
+            "params": [
+                {
+                    "description": "the ID of the static route",
+                    "length": 255,
+                    "name": "id",
+                    "related": "createStaticRoute,listStaticRoutes",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "Lists hosts metrics",
+            "isasync": false,
+            "name": "listHostsMetrics",
+            "params": [
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "list hosts by its out-of-band management interface's power state. Its value can be one of [On, Off, Unknown]",
+                    "length": 255,
+                    "name": "outofbandmanagementpowerstate",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the state of the host",
+                    "length": 255,
+                    "name": "state",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "list hosts by resource state. Resource state represents current state determined by admin of host, value can be one of [Enabled, Disabled, Unmanaged, PrepareForMaintenance, ErrorInMaintenance, Maintenance, Error]",
+                    "length": 255,
+                    "name": "resourcestate",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "lists hosts in the same cluster as this VM and flag hosts with enough CPU/RAm to host this VM",
+                    "length": 255,
+                    "name": "virtualmachineid",
+                    "related": "updateVMAffinityGroup,rebootVirtualMachine,changeServiceForVirtualMachine,detachIso,resetSSHKeyForVirtualMachine,resetSSHKeyForVirtualMachine,migrateVirtualMachineWithVolume,restoreVirtualMachine,attachIso,removeNicFromVirtualMachine,updateVirtualMachine,recoverVirtualMachine,migrateVirtualMachine,resetPasswordForVirtualMachine,revertToVMSnapshot,assignVirtualMachine,updateVMAffinityGroup,listVirtualMachines,rebootVirtualMachine,restoreVirtualMachine,destroyVirtualMachine,stopVirtualMachine,deployVirtualMachine,detachIso,deployVirtualMachine,updateDefaultNicForVirtualMachine,updateVirtualMachine,revertToVMSnapshot,addNicToVirtualMachine,tmDestroyVirtualMachine,resetPasswordForVirtualMachine,startVirtualMachine,updateDefaultNicForVirtualMachine,startVirtualMachine,updateVmNicIp,attachIso,listVirtualMachines,addNicToVirtualMachine,stopVirtualMachine,destroyVirtualMachine,removeNicFromVirtualMachine,changeServiceForVirtualMachine",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the host type",
+                    "length": 255,
+                    "name": "type",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the id of the host",
+                    "length": 255,
+                    "name": "id",
+                    "related": "addBaremetalHost,listExternalLoadBalancers,prepareHostForMaintenance,reconnectHost,addHost,updateHost,cancelHostMaintenance",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "comma separated list of host details requested, value can be a list of [ min, all, capacity, events, stats]",
+                    "length": 255,
+                    "name": "details",
+                    "required": false,
+                    "type": "list"
+                },
+                {
+                    "description": "the Zone ID for the host",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones,listZones,createZone,updateZone",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list hosts for which out-of-band management is enabled",
+                    "length": 255,
+                    "name": "outofbandmanagementenabled",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "hypervisor type of host: XenServer,KVM,VMware,Hyperv,BareMetal,Simulator",
+                    "length": 255,
+                    "name": "hypervisor",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the host",
+                    "length": 255,
+                    "name": "name",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the Pod ID for the host",
+                    "length": 255,
+                    "name": "podid",
+                    "related": "listPods,updatePod",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "lists hosts existing in particular cluster",
+                    "length": 255,
+                    "name": "clusterid",
+                    "related": "addCluster,listClusters,updateCluster",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "if true, list only hosts dedicated to HA",
+                    "length": 255,
+                    "name": "hahost",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the total cpu used in GiB",
+                    "name": "memoryusedgb",
+                    "type": "string"
+                },
+                {
+                    "description": "cpu allocated notification threshold exceeded",
+                    "name": "cpuallocatedthreshold",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the total cpu capacity in Ghz",
+                    "name": "cputotalghz",
+                    "type": "string"
+                },
+                {
+                    "description": "memory usage notification threshold exceeded",
+                    "name": "memorythreshold",
+                    "type": "boolean"
+                },
+                {
+                    "description": "memory allocated notification threshold exceeded",
+                    "name": "memoryallocatedthreshold",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the total cpu allocated in Ghz",
+                    "name": "cpuallocatedghz",
+                    "type": "string"
+                },
+                {
+                    "description": "memory allocated disable threshold exceeded",
+                    "name": "memoryallocateddisablethreshold",
+                    "type": "boolean"
+                },
+                {
+                    "description": "cpu usage notification threshold exceeded",
+                    "name": "cputhreshold",
+                    "type": "boolean"
+                },
+                {
+                    "description": "instances on the host",
+                    "name": "instances",
+                    "type": "string"
+                },
+                {
+                    "description": "the total cpu capacity in GiB",
+                    "name": "memorytotalgb",
+                    "type": "string"
+                },
+                {
+                    "description": "network write in GiB",
+                    "name": "networkwrite",
+                    "type": "string"
+                },
+                {
+                    "description": "cpu allocated disable threshold exceeded",
+                    "name": "cpuallocateddisablethreshold",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the total cpu used in Ghz",
+                    "name": "cpuusedghz",
+                    "type": "string"
+                },
+                {
+                    "description": "network read in GiB",
+                    "name": "networkread",
+                    "type": "string"
+                },
+                {
+                    "description": "out-of-band management power state",
+                    "name": "powerstate",
+                    "type": "powerstate"
+                },
+                {
+                    "description": "the total cpu allocated in GiB",
+                    "name": "memoryallocatedgb",
+                    "type": "string"
+                },
+                {
+                    "description": "memory usage disable threshold exceeded",
+                    "name": "memorydisablethreshold",
+                    "type": "boolean"
+                },
+                {
+                    "description": "cpu usage disable threshold exceeded",
+                    "name": "cpudisablethreshold",
+                    "type": "boolean"
+                }
+            ],
+            "since": "4.9.3"
+        },
+        {
+            "description": "Release the dedication for the pod",
+            "isasync": true,
+            "name": "releaseDedicatedPod",
+            "params": [
+                {
+                    "description": "the ID of the Pod",
+                    "length": 255,
+                    "name": "podid",
+                    "related": "listPods,updatePod",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                },
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Lists affinity groups",
+            "isasync": false,
+            "name": "listAffinityGroups",
+            "params": [
+                {
+                    "description": "list objects by project",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "listProjectAccounts,suspendProject,activateProject,updateProject,createProject,listProjects",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list the affinity group by the ID provided",
+                    "length": 255,
+                    "name": "id",
+                    "related": "createAffinityGroup,listAffinityGroups",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.",
+                    "length": 255,
+                    "name": "isrecursive",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "lists affinity groups by type",
+                    "length": 255,
+                    "name": "type",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "list resources by account. Must be used with the domainId parameter.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "If set to false, list only resources belonging to the command's caller; if set to true - list resources that the caller is authorized to see. Default value is false",
+                    "length": 255,
+                    "name": "listall",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "lists affinity groups by virtual machine ID",
+                    "length": 255,
+                    "name": "virtualmachineid",
+                    "related": "updateVMAffinityGroup,rebootVirtualMachine,changeServiceForVirtualMachine,detachIso,resetSSHKeyForVirtualMachine,resetSSHKeyForVirtualMachine,migrateVirtualMachineWithVolume,restoreVirtualMachine,attachIso,removeNicFromVirtualMachine,updateVirtualMachine,recoverVirtualMachine,migrateVirtualMachine,resetPasswordForVirtualMachine,revertToVMSnapshot,assignVirtualMachine,updateVMAffinityGroup,listVirtualMachines,rebootVirtualMachine,restoreVirtualMachine,destroyVirtualMachine,stopVirtualMachine,deployVirtualMachine,detachIso,deployVirtualMachine,updateDefaultNicForVirtualMachine,updateVirtualMachine,revertToVMSnapshot,addNicToVirtualMachine,tmDestroyVirtualMachine,resetPasswordForVirtualMachine,startVirtualMachine,updateDefaultNicForVirtualMachine,startVirtualMachine,updateVmNicIp,attachIso,listVirtualMachines,addNicToVirtualMachine,stopVirtualMachine,destroyVirtualMachine,removeNicFromVirtualMachine,changeServiceForVirtualMachine",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "list only resources belonging to the domain specified",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "updateDomain,createDomain,listDomains,listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "lists affinity groups by name",
+                    "length": 255,
+                    "name": "name",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "createAffinityGroup",
+            "response": [
+                {
+                    "description": "virtual machine IDs associated with this affinity group",
+                    "name": "virtualmachineIds",
+                    "type": "list"
+                },
+                {
+                    "description": "the domain ID of the affinity group",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain name of the affinity group",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the affinity group",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the type of the affinity group",
+                    "name": "type",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the affinity group",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the account owning the affinity group",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the affinity group",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the project ID of the affinity group",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the description of the affinity group",
+                    "name": "description",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Register a public key in a keypair under a certain name",
+            "isasync": false,
+            "name": "registerSSHKeyPair",
+            "params": [
+                {
+                    "description": "an optional project for the ssh key",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "listProjectAccounts,suspendProject,activateProject,updateProject,createProject,listProjects",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "an optional domainId for the ssh key. If the account parameter is used, domainId must also be used.",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "updateDomain,createDomain,listDomains,listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "Public key material of the keypair",
+                    "length": 5120,
+                    "name": "publickey",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "Name of the keypair",
+                    "length": 255,
+                    "name": "name",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "an optional account for the ssh key. Must be used with domainId.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "listSSHKeyPairs",
+            "response": [
+                {
+                    "description": "Name of the keypair",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain id of the keypair owner",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain name of the keypair owner",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the owner of the keypair",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "Fingerprint of the public key",
+                    "name": "fingerprint",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Destroys a l2tp/ipsec remote access vpn",
+            "isasync": true,
+            "name": "deleteRemoteAccessVpn",
+            "params": [
+                {
+                    "description": "public ip address id of the vpn server",
+                    "length": 255,
+                    "name": "publicipid",
+                    "related": "associateIpAddress,restartNetwork,updateIpAddress,associateIpAddress,listPublicIpAddresses,listPublicIpAddresses",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                },
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Updates network ACL list",
+            "isasync": true,
+            "name": "updateNetworkACLList",
+            "params": [
+                {
+                    "description": "the ID of the network ACL",
+                    "length": 255,
+                    "name": "id",
+                    "related": "createNetworkACLList,listNetworkACLLists",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "an optional field, in case you want to set a custom id to the resource. Allowed to Root Admins only",
+                    "length": 255,
+                    "name": "customid",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "string"
+                },
+                {
+                    "description": "an optional field, whether to the display the list to the end user or not",
+                    "length": 255,
+                    "name": "fordisplay",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "boolean"
+                }
+            ],
+            "response": [
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                },
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                }
+            ],
+            "since": "4.4"
+        },
+        {
+            "description": " delete a nicira nvp device",
+            "isasync": true,
+            "name": "deleteNiciraNvpDevice",
+            "params": [
+                {
+                    "description": "Nicira device ID",
+                    "length": 255,
+                    "name": "nvpdeviceid",
+                    "related": "listNiciraNvpDevices,addNiciraNvpDevice",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                },
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Restore a VM to original template/ISO or new template/ISO",
+            "isasync": true,
+            "name": "restoreVirtualMachine",
+            "params": [
+                {
+                    "description": "Virtual Machine ID",
+                    "length": 255,
+                    "name": "virtualmachineid",
+                    "related": "updateVMAffinityGroup,rebootVirtualMachine,changeServiceForVirtualMachine,detachIso,resetSSHKeyForVirtualMachine,resetSSHKeyForVirtualMachine,migrateVirtualMachineWithVolume,restoreVirtualMachine,attachIso,removeNicFromVirtualMachine,updateVirtualMachine,recoverVirtualMachine,migrateVirtualMachine,resetPasswordForVirtualMachine,revertToVMSnapshot,assignVirtualMachine,updateVMAffinityGroup,listVirtualMachines,rebootVirtualMachine,restoreVirtualMachine,destroyVirtualMachine,stopVirtualMachine,deployVirtualMachine,detachIso,deployVirtualMachine,updateDefaultNicForVirtualMachine,updateVirtualMachine,revertToVMSnapshot,addNicToVirtualMachine,tmDestroyVirtualMachine,resetPasswordForVirtualMachine,startVirtualMachine,updateDefaultNicForVirtualMachine,startVirtualMachine,updateVmNicIp,attachIso,listVirtualMachines,addNicToVirtualMachine,stopVirtualMachine,destroyVirtualMachine,removeNicFromVirtualMachine,changeServiceForVirtualMachine",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "an optional template Id to restore vm from the new template. This can be an ISO id in case of restore vm deployed using ISO",
+                    "length": 255,
+                    "name": "templateid",
+                    "related": "copyTemplate,registerTemplate,listIsos,copyTemplate,listTemplates,registerTemplate,listTemplates,createTemplate,registerIso,registerIso,prepareTemplate,updateIso,listIsos,updateTemplate,createTemplate,copyIso",
+                    "required": false,
+                    "type": "uuid"
+                }
+            ],
+            "related": "updateVMAffinityGroup,rebootVirtualMachine,changeServiceForVirtualMachine,detachIso,resetSSHKeyForVirtualMachine,resetSSHKeyForVirtualMachine,migrateVirtualMachineWithVolume,attachIso,removeNicFromVirtualMachine,updateVirtualMachine,recoverVirtualMachine,migrateVirtualMachine,resetPasswordForVirtualMachine,revertToVMSnapshot,assignVirtualMachine,updateVMAffinityGroup,listVirtualMachines,rebootVirtualMachine,restoreVirtualMachine,destroyVirtualMachine,stopVirtualMachine,deployVirtualMachine,detachIso,deployVirtualMachine,updateDefaultNicForVirtualMachine,updateVirtualMachine,revertToVMSnapshot,addNicToVirtualMachine,tmDestroyVirtualMachine,resetPasswordForVirtualMachine,startVirtualMachine,updateDefaultNicForVirtualMachine,startVirtualMachine,updateVmNicIp,attachIso,listVirtualMachines,addNicToVirtualMachine,stopVirtualMachine,destroyVirtualMachine,removeNicFromVirtualMachine,changeServiceForVirtualMachine",
+            "response": [
+                {
+                    "description": "instance name of the user vm; this parameter is returned to the ROOT admin only",
+                    "name": "instancename",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the virtual machine",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "Os type ID of the virtual machine",
+                    "name": "guestosid",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of the virtual machine",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the availablility zone for the virtual machine",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "user generated name. The name of the virtual machine is returned if no displayname exists.",
+                    "name": "displayname",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the disk offering of the virtual machine",
+                    "name": "diskofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "true if vm contains XS/VMWare tools inorder to support dynamic scaling of VM cpu/memory.",
+                    "name": "isdynamicallyscalable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the memory used by the vm",
+                    "name": "memorykbs",
+                    "type": "long"
+                },
+                {
+                    "description": "the speed of each cpu",
+                    "name": "cpuspeed",
+                    "type": "integer"
+                },
+                {
+                    "description": "the read (io) of disk on the vm",
+                    "name": "diskioread",
+                    "type": "long"
+                },
+                {
+                    "description": "the write (io) of disk on the vm",
+                    "name": "diskiowrite",
+                    "type": "long"
+                },
+                {
+                    "description": "device type of the root volume",
+                    "name": "rootdevicetype",
+                    "type": "string"
+                },
+                {
+                    "description": "list of security groups associated with the virtual machine",
+                    "name": "securitygroup",
+                    "response": [
+                        {
+                            "description": "the account owning the security group",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name of the group",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain ID of the security group",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of egress rules associated with the security group",
+                            "name": "egressrule",
+                            "response": [
+                                {
+                                    "description": "the list of resource tags associated with the rule",
+                                    "name": "tags",
+                                    "response": [
+                                        {
+                                            "description": "tag value",
+                                            "name": "value",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "id of the resource",
+                                            "name": "resourceid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the domain associated with the tag",
+                                            "name": "domain",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "resource type",
+                                            "name": "resourcetype",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project name where tag belongs to",
+                                            "name": "project",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project id the tag belongs to",
+                                            "name": "projectid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag key name",
+                                            "name": "key",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "customer associated with the tag",
+                                            "name": "customer",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the ID of the domain associated with the tag",
+                                            "name": "domainid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the account associated with the tag",
+                                            "name": "account",
+                                            "type": "string"
+                                        }
+                                    ],
+                                    "type": "set"
+                                },
+                                {
+                                    "description": "the ending IP of the security group rule ",
+                                    "name": "endport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the id of the security group rule",
+                                    "name": "ruleid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the starting IP of the security group rule",
+                                    "name": "startport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "security group name",
+                                    "name": "securitygroupname",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the CIDR notation for the base IP address of the security group rule",
+                                    "name": "cidr",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the code for the ICMP message response",
+                                    "name": "icmpcode",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "account owning the security group rule",
+                                    "name": "account",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the protocol of the security group rule",
+                                    "name": "protocol",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the type of the ICMP message response",
+                                    "name": "icmptype",
+                                    "type": "integer"
+                                }
+                            ],
+                            "type": "set"
+                        },
+                        {
+                            "description": "the name of the security group",
+                            "name": "name",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the description of the security group",
+                            "name": "description",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of resource tags associated with the rule",
+                            "name": "tags",
+                            "response": [
+                                {
+                                    "description": "the project name where tag belongs to",
+                                    "name": "project",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the domain associated with the tag",
+                                    "name": "domain",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "customer associated with the tag",
+                                    "name": "customer",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "tag value",
+                                    "name": "value",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the ID of the domain associated with the tag",
+                                    "name": "domainid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the project id the tag belongs to",
+                                    "name": "projectid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "id of the resource",
+                                    "name": "resourceid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the account associated with the tag",
+                                    "name": "account",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "resource type",
+                                    "name": "resourcetype",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "tag key name",
+                                    "name": "key",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "set"
+                        },
+                        {
+                            "description": "the project id of the group",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of virtualmachine ids associated with this securitygroup",
+                            "name": "virtualmachineids",
+                            "type": "set"
+                        },
+                        {
+                            "description": "the number of virtualmachines associated with this securitygroup",
+                            "name": "virtualmachinecount",
+                            "type": "integer"
+                        },
+                        {
+                            "description": "the domain name of the security group",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of ingress rules associated with the security group",
+                            "name": "ingressrule",
+                            "response": [
+                                {
+                                    "description": "the id of the security group rule",
+                                    "name": "ruleid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the protocol of the security group rule",
+                                    "name": "protocol",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the type of the ICMP message response",
+                                    "name": "icmptype",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the starting IP of the security group rule",
+                                    "name": "startport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the ending IP of the security group rule ",
+                                    "name": "endport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "security group name",
+                                    "name": "securitygroupname",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the list of resource tags associated with the rule",
+                                    "name": "tags",
+                                    "response": [
+                                        {
+                                            "description": "the domain associated with the tag",
+                                            "name": "domain",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "customer associated with the tag",
+                                            "name": "customer",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag value",
+                                            "name": "value",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "id of the resource",
+                                            "name": "resourceid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project name where tag belongs to",
+                                            "name": "project",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the account associated with the tag",
+                                            "name": "account",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the ID of the domain associated with the tag",
+                                            "name": "domainid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project id the tag belongs to",
+                                            "name": "projectid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "resource type",
+                                            "name": "resourcetype",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag key name",
+                                            "name": "key",
+                                            "type": "string"
+                                        }
+                                    ],
+                                    "type": "set"
+                                },
+                                {
+                                    "description": "the CIDR notation for the base IP address of the security group rule",
+                                    "name": "cidr",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "account owning the security group rule",
+                                    "name": "account",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the code for the ICMP message response",
+                                    "name": "icmpcode",
+                                    "type": "integer"
+                                }
+                            ],
+                            "type": "set"
+                        },
+                        {
+                            "description": "the ID of the security group",
+                            "name": "id",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "the outgoing network traffic on the host",
+                    "name": "networkkbswrite",
+                    "type": "long"
+                },
+                {
+                    "description": "the group ID of the virtual machine",
+                    "name": "groupid",
+                    "type": "string"
+                },
+                {
+                    "description": "true if high-availability is enabled, false otherwise",
+                    "name": "haenable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the hypervisor on which the template runs",
+                    "name": "hypervisor",
+                    "type": "string"
+                },
+                {
+                    "description": "ssh key-pair",
+                    "name": "keypair",
+                    "type": "string"
+                },
+                {
+                    "description": "the user's name who deployed the virtual machine",
+                    "name": "username",
+                    "type": "string"
+                },
+                {
+                    "description": "the number of cpu this virtual machine is running with",
+                    "name": "cpunumber",
+                    "type": "integer"
+                },
+                {
+                    "description": " an alternate display text of the template for the virtual machine",
+                    "name": "templatedisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the ISO attached to the virtual machine",
+                    "name": "isoid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the template for the virtual machine. A -1 is returned if the virtual machine was created from an ISO file.",
+                    "name": "templateid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the service offering of the virtual machine",
+                    "name": "serviceofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "the read (bytes) of disk on the vm",
+                    "name": "diskkbsread",
+                    "type": "long"
+                },
+                {
+                    "description": "Vm details in key/value pairs.",
+                    "name": "details",
+                    "type": "map"
+                },
+                {
+                    "description": "the project id of the vm",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the password (if exists) of the virtual machine",
+                    "name": "password",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of nics associated with vm",
+                    "name": "nic",
+                    "response": [
+                        {
+                            "description": "Id of the NSX Logical Switch (if NSX based), null otherwise",
+                            "name": "nsxlogicalswitch",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the corresponding network",
+                            "name": "networkid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the gateway of the nic",
+                            "name": "gateway",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if nic is default, false otherwise",
+                            "name": "isdefault",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "the ip address of the nic",
+                            "name": "ipaddress",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the vm to which the nic belongs",
+                            "name": "virtualmachineid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the cidr of IPv6 network",
+                            "name": "ip6cidr",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the netmask of the nic",
+                            "name": "netmask",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the IPv6 address of network",
+                            "name": "ip6address",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the name of the corresponding network",
+                            "name": "networkname",
+                            "type": "string"
+                        },
+                        {
+                            "description": "device id for the network when plugged into the virtual machine",
+                            "name": "deviceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the nic",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the NSX Logical Switch Port (if NSX based), null otherwise",
+                            "name": "nsxlogicalswitchport",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if nic is default, false otherwise",
+                            "name": "macaddress",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the broadcast uri of the nic",
+                            "name": "broadcasturi",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the type of the nic",
+                            "name": "type",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the gateway of IPv6 network",
+                            "name": "ip6gateway",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the Secondary ipv4 addr of nic",
+                            "name": "secondaryip",
+                            "type": "list"
+                        },
+                        {
+                            "description": "the isolation uri of the nic",
+                            "name": "isolationuri",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the traffic type of the nic",
+                            "name": "traffictype",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "public IP address id associated with vm via Static nat rule",
+                    "name": "publicip",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the disk offering of the virtual machine",
+                    "name": "diskofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "OS type id of the vm",
+                    "name": "ostypeid",
+                    "type": "long"
+                },
+                {
+                    "description": "State of the Service from LB rule",
+                    "name": "servicestate",
+                    "type": "string"
+                },
+                {
+                    "description": "the target memory in vm",
+                    "name": "memorytargetkbs",
+                    "type": "long"
+                },
+                {
+                    "description": "the write (bytes) of disk on the vm",
+                    "name": "diskkbswrite",
+                    "type": "long"
+                },
+                {
+                    "description": "public IP address id associated with vm via Static nat rule",
+                    "name": "publicipid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the template for the virtual machine",
+                    "name": "templatename",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the availability zone for the virtual machine",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the domain in which the virtual machine exists",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the amount of the vm's CPU currently used",
+                    "name": "cpuused",
+                    "type": "string"
+                },
+                {
+                    "description": "an alternate display text of the ISO attached to the virtual machine",
+                    "name": "isodisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "an optional field whether to the display the vm to the end user or not.",
+                    "name": "displayvm",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the ID of the virtual machine",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the ISO attached to the virtual machine",
+                    "name": "isoname",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the service offering of the virtual machine",
+                    "name": "serviceofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "list of affinity groups associated with the virtual machine",
+                    "name": "affinitygroup",
+                    "response": [
+                        {
+                            "description": "the domain name of the affinity group",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the affinity group",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the type of the affinity group",
+                            "name": "type",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain ID of the affinity group",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account owning the affinity group",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the name of the affinity group",
+                            "name": "name",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the description of the affinity group",
+                            "name": "description",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name of the affinity group",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "virtual machine IDs associated with this affinity group",
+                            "name": "virtualmachineIds",
+                            "type": "list"
+                        },
+                        {
+                            "description": "the project ID of the affinity group",
+                            "name": "projectid",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "the project name of the vm",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the internal memory thats free in vm",
+                    "name": "memoryintfreekbs",
+                    "type": "long"
+                },
+                {
+                    "description": "the ID of the host for the virtual machine",
+                    "name": "hostid",
+                    "type": "string"
+                },
+                {
+                    "description": "true if the password rest feature is enabled, false otherwise",
+                    "name": "passwordenabled",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the incoming network traffic on the vm",
+                    "name": "networkkbsread",
+                    "type": "long"
+                },
+                {
+                    "description": "the user's ID who deployed the virtual machine",
+                    "name": "userid",
+                    "type": "string"
+                },
+                {
+                    "description": "device ID of the root volume",
+                    "name": "rootdeviceid",
+                    "type": "long"
+                },
+                {
+                    "description": "the name of the host for the virtual machine",
+                    "name": "hostname",
+                    "type": "string"
+                },
+                {
+
+                },
+                {
+                    "description": "the date when this virtual machine was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the virtual network for the service offering",
+                    "name": "forvirtualnetwork",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the ID of the domain in which the virtual machine exists",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the account associated with the virtual machine",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the memory allocated for the virtual machine",
+                    "name": "memory",
+                    "type": "integer"
+                },
+                {
+                    "description": "the group name of the virtual machine",
+                    "name": "group",
+                    "type": "string"
+                },
+                {
+                    "description": "the vgpu type used by the virtual machine",
+                    "name": "vgpu",
+                    "type": "string"
+                }
+            ],
+            "since": "3.0.0"
+        },
+        {
+            "description": "Delete one or more events.",
+            "isasync": false,
+            "name": "deleteEvents",
+            "params": [
+                {
+                    "description": "delete by event type",
+                    "length": 255,
+                    "name": "type",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "start date range to delete events (including) this date (use format \"yyyy-MM-dd\" or the new format \"yyyy-MM-ddThh:mm:ss\")",
+                    "length": 255,
+                    "name": "startdate",
+                    "required": false,
+                    "type": "date"
+                },
+                {
+                    "description": "end date range to delete events (including) this date (use format \"yyyy-MM-dd\" or the new format \"yyyy-MM-ddThh:mm:ss\")",
+                    "length": 255,
+                    "name": "enddate",
+                    "required": false,
+                    "type": "date"
+                },
+                {
+                    "description": "the IDs of the events",
+                    "length": 255,
+                    "name": "ids",
+                    "related": "listEvents",
+                    "required": false,
+                    "type": "list"
+                }
+            ],
+            "response": [
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "List ucs blades",
+            "isasync": false,
+            "name": "listUcsBlades",
+            "params": [
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "ucs manager id",
+                    "length": 255,
+                    "name": "ucsmanagerid",
+                    "related": "addUcsManager,listUcsManagers",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "associateUcsProfileToBlade",
+            "response": [
+                {
+                    "description": "ucs blade id",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "ucs blade dn",
+                    "name": "bladedn",
+                    "type": "string"
+                },
+                {
+                    "description": "cloudstack host id this blade associates to",
+                    "name": "hostid",
+                    "type": "string"
+                },
+                {
+                    "description": "associated ucs profile dn",
+                    "name": "profiledn",
+                    "type": "string"
+                },
+                {
+                    "description": "ucs manager id",
+                    "name": "ucsmanagerid",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Notify provision has been done on a host. This api is for baremetal virtual router service, not for end user",
+            "isasync": true,
+            "name": "notifyBaremetalProvisionDone",
+            "params": [
+                {
+                    "description": "mac of the nic used for provision",
+                    "length": 255,
+                    "name": "mac",
+                    "required": true,
+                    "type": "object"
+                }
+            ],
+            "response": [
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                },
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Get Volume Snapshot Details",
+            "isasync": false,
+            "name": "getVolumeSnapshotDetails",
+            "params": [
+                {
+                    "description": "CloudStack Snapshot UUID",
+                    "length": 255,
+                    "name": "snapshotid",
+                    "required": true,
+                    "type": "string"
+                }
+            ],
+            "related": "getVolumeiScsiName",
+            "response": [
+                {
+                    "description": "Volume iSCSI Name",
+                    "name": "volumeiScsiName",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Deletes an ISO file.",
+            "isasync": true,
+            "name": "deleteIso",
+            "params": [
+                {
+                    "description": "the ID of the zone of the ISO file. If not specified, the ISO will be deleted from all the zones",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones,listZones,createZone,updateZone",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the ID of the ISO file",
+                    "length": 255,
+                    "name": "id",
+                    "related": "copyTemplate,registerTemplate,listIsos,copyTemplate,listTemplates,registerTemplate,listTemplates,createTemplate,registerIso,registerIso,prepareTemplate,updateIso,listIsos,updateTemplate,createTemplate,copyIso",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "Deletes an external firewall appliance.",
+            "isasync": false,
+            "name": "deleteExternalFirewall",
+            "params": [
+                {
+                    "description": "Id of the external firewall appliance.",
+                    "length": 255,
+                    "name": "id",
+                    "related": "addBaremetalHost,listExternalLoadBalancers,prepareHostForMaintenance,reconnectHost,addHost,updateHost,cancelHostMaintenance",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "Updates a host.",
+            "isasync": false,
+            "name": "updateHost",
+            "params": [
+                {
+                    "description": "the id of Os category to update the host with",
+                    "length": 255,
+                    "name": "oscategoryid",
+                    "related": "listOsCategories",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "Change resource state of host, valid values are [Enable, Disable]. Operation may failed if host in states not allowing Enable/Disable",
+                    "length": 255,
+                    "name": "allocationstate",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the host to update",
+                    "length": 255,
+                    "name": "id",
+                    "related": "addBaremetalHost,listExternalLoadBalancers,prepareHostForMaintenance,reconnectHost,addHost,updateHost,cancelHostMaintenance",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list of tags to be added to the host",
+                    "length": 255,
+                    "name": "hosttags",
+                    "required": false,
+                    "type": "list"
+                },
+                {
+                    "description": "the new uri for the secondary storage: nfs://host/path",
+                    "length": 255,
+                    "name": "url",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "addBaremetalHost,listExternalLoadBalancers,prepareHostForMaintenance,reconnectHost,addHost,cancelHostMaintenance",
+            "response": [
+                {
+                    "description": "the Zone name of the host",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the cluster type of the cluster that host belongs to",
+                    "name": "clustertype",
+                    "type": "string"
+                },
+                {
+                    "description": "the amount of the host's CPU currently allocated",
+                    "name": "cpuallocated",
+                    "type": "string"
+                },
+                {
+                    "description": "the CPU number of the host",
+                    "name": "cpunumber",
+                    "type": "integer"
+                },
+                {
+                    "description": "the cluster name of the host",
+                    "name": "clustername",
+                    "type": "string"
+                },
+                {
+                    "description": "the memory total of the host",
+                    "name": "memorytotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total disk size of the host",
+                    "name": "disksizetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the CPU speed of the host",
+                    "name": "cpuspeed",
+                    "type": "long"
+                },
+                {
+                    "description": "GPU cards present in the host",
+                    "name": "gpugroup",
+                    "response": [
+                        {
+                            "description": "GPU cards present in the host",
+                            "name": "gpugroupname",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of enabled vGPUs",
+                            "name": "vgpu",
+                            "response": [
+                                {
+                                    "description": "Maximum Y resolution per display",
+                                    "name": "maxresolutiony",
+                                    "type": "long"
+                                },
+                                {
+                                    "description": "Maximum vgpu can be created with this vgpu type on the given gpu group",
+                                    "name": "maxcapacity",
+                                    "type": "long"
+                                },
+                                {
+                                    "description": "Maximum displays per user",
+                                    "name": "maxheads",
+                                    "type": "long"
+                                },
+                                {
+                                    "description": "Model Name of vGPU",
+                                    "name": "vgputype",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "Remaining capacity in terms of no. of more VMs that can be deployped with this vGPU type",
+                                    "name": "remainingcapacity",
+                                    "type": "long"
+                                },
+                                {
+                                    "description": "Video RAM for this vGPU type",
+                                    "name": "videoram",
+                                    "type": "long"
+                                },
+                                {
+                                    "description": "Maximum X resolution per display",
+                                    "name": "maxresolutionx",
+                                    "type": "long"
+                                },
+                                {
+                                    "description": "Maximum no. of vgpu per gpu card (pgpu)",
+                                    "name": "maxvgpuperpgpu",
+                                    "type": "long"
+                                }
+                            ],
+                            "type": "list"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "the outgoing network traffic on the host",
+                    "name": "networkkbswrite",
+                    "type": "long"
+                },
+                {
+                    "description": "true if local storage is active, false otherwise",
+                    "name": "islocalstorageactive",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the resource state of the host",
+                    "name": "resourcestate",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the host",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "events available for the host",
+                    "name": "events",
+                    "type": "string"
+                },
+                {
+                    "description": "the amount of the host's CPU currently used",
+                    "name": "cpuused",
+                    "type": "string"
+                },
+                {
+                    "description": "the host out-of-band management information",
+                    "name": "outofbandmanagement",
+                    "type": "outofbandmanagementresponse"
+                },
+                {
+                    "description": "the incoming network traffic on the host",
+                    "name": "networkkbsread",
+                    "type": "long"
+                },
+                {
+                    "description": "the host's currently allocated disk size",
+                    "name": "disksizeallocated",
+                    "type": "long"
+                },
+                {
+                    "description": "the host type",
+                    "name": "type",
+                    "type": "type"
+                },
+                {
+                    "description": "the management server ID of the host",
+                    "name": "managementserverid",
+                    "type": "long"
+                },
+                {
+                    "description": "the IP address of the host",
+                    "name": "ipaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the number of CPU sockets on the host",
+                    "name": "cpusockets",
+                    "type": "integer"
+                },
+                {
+                    "description": "the cluster ID of the host",
+                    "name": "clusterid",
+                    "type": "string"
+                },
+                {
+                    "description": "the date and time the host was last pinged",
+                    "name": "lastpinged",
+                    "type": "date"
+                },
+                {
+                    "description": "Host details in key/value pairs.",
+                    "name": "details",
+                    "type": "map"
+                },
+                {
+                    "description": "true if the host is Ha host (dedicated to vms started by HA process; false otherwise",
+                    "name": "hahost",
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if this host has enough CPU and RAM capacity to migrate a VM to it, false otherwise",
+                    "name": "hasenoughcapacity",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the date and time the host was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the state of the host",
+                    "name": "state",
+                    "type": "status"
+                },
+                {
+                    "description": "the OS category name of the host",
+                    "name": "oscategoryname",
+                    "type": "string"
+                },
+                {
+                    "description": "the amount of the host's memory currently allocated",
+                    "name": "memoryallocated",
+                    "type": "long"
+                },
+                {
+                    "description": "true if the host is disconnected. False otherwise.",
+                    "name": "disconnected",
+                    "type": "date"
+                },
+                {
+                    "description": "the host version",
+                    "name": "version",
+                    "type": "string"
+                },
+                {
+                    "description": "the amount of the host's CPU after applying the cpu.overprovisioning.factor ",
+                    "name": "cpuwithoverprovisioning",
+                    "type": "string"
+                },
+                {
+                    "description": "the OS category ID of the host",
+                    "name": "oscategoryid",
+                    "type": "string"
+                },
+                {
+                    "description": "the Pod name of the host",
+                    "name": "podname",
+                    "type": "string"
+                },
+                {
+                    "description": "the Pod ID of the host",
+                    "name": "podid",
+                    "type": "string"
+                },
+                {
+                    "description": "capabilities of the host",
+                    "name": "capabilities",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the host",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the amount of the host's memory currently used",
+                    "name": "memoryused",
+                    "type": "long"
+                },
+                {
+                    "description": "the date and time the host was removed",
+                    "name": "removed",
+                    "type": "date"
+                },
+                {
+                    "description": "the host hypervisor",
+                    "name": "hypervisor",
+                    "type": "hypervisortype"
+                },
+                {
+                    "description": "comma-separated list of tags for the host",
+                    "name": "hosttags",
+                    "type": "string"
+                },
+                {
+                    "description": "true if this host is suitable(has enough capacity and satisfies all conditions like hosttags, max guests vm limit etc) to migrate a VM to it , false otherwise",
+                    "name": "suitableformigration",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the Zone ID of the host",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the cpu average load on the host",
+                    "name": "averageload",
+                    "type": "long"
+                },
+                {
+                    "description": "the hypervisor version",
+                    "name": "hypervisorversion",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Creates a egress firewall rule for a given network ",
+            "isasync": true,
+            "name": "createEgressFirewallRule",
+            "params": [
+                {
+                    "description": "an optional field, whether to the display the rule to the end user or not",
+                    "length": 255,
+                    "name": "fordisplay",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the protocol for the firewall rule. Valid values are TCP/UDP/ICMP.",
+                    "length": 255,
+                    "name": "protocol",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "type of firewallrule: system/user",
+                    "length": 255,
+                    "name": "type",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "type of the icmp message being sent",
+                    "length": 255,
+                    "name": "icmptype",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "the ending port of firewall rule",
+                    "length": 255,
+                    "name": "endport",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "the cidr list to forward traffic from",
+                    "length": 255,
+                    "name": "cidrlist",
+                    "required": false,
+                    "type": "list"
+                },
+                {
+                    "description": "error code for this icmp message",
+                    "length": 255,
+                    "name": "icmpcode",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "the network id of the port forwarding rule",
+                    "length": 255,
+                    "name": "networkid",
+                    "related": "createNetwork,updateNetwork,listSrxFirewallNetworks,updateNetwork,listBrocadeVcsDeviceNetworks,listNiciraNvpDeviceNetworks,createNetwork,listNetworks,listNetscalerLoadBalancerNetworks,listF5LoadBalancerNetworks,listPaloAltoFirewallNetworks",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the starting port of firewall rule",
+                    "length": 255,
+                    "name": "startport",
+                    "required": false,
+                    "type": "integer"
+                }
+            ],
+            "related": "listFirewallRules,createFirewallRule,updateEgressFirewallRule,listEgressFirewallRules",
+            "response": [
+                {
+                    "description": "the starting port of firewall rule's port range",
+                    "name": "startport",
+                    "type": "integer"
+                },
+                {
+                    "description": "the state of the rule",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the cidr list to forward traffic from",
+                    "name": "cidrlist",
+                    "type": "string"
+                },
+                {
+                    "description": "the public ip address id for the firewall rule",
+                    "name": "ipaddressid",
+                    "type": "string"
+                },
+                {
+                    "description": "is rule for display to the regular user",
+                    "name": "fordisplay",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the list of resource tags associated with the rule",
+                    "name": "tags",
+                    "response": [
+                        {
+                            "description": "the domain associated with the tag",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "customer associated with the tag",
+                            "name": "customer",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project id the tag belongs to",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag value",
+                            "name": "value",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the domain associated with the tag",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag key name",
+                            "name": "key",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name where tag belongs to",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account associated with the tag",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "resource type",
+                            "name": "resourcetype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "id of the resource",
+                            "name": "resourceid",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "type of the icmp message being sent",
+                    "name": "icmptype",
+                    "type": "integer"
+                },
+                {
+                    "description": "the protocol of the firewall rule",
+                    "name": "protocol",
+                    "type": "string"
+                },
+                {
+                    "description": "the public ip address for the firewall rule",
+                    "name": "ipaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the firewall rule",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "error code for this icmp message",
+                    "name": "icmpcode",
+                    "type": "integer"
+                },
+                {
+                    "description": "the network id of the firewall rule",
+                    "name": "networkid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ending port of firewall rule's port range",
+                    "name": "endport",
+                    "type": "integer"
+                }
+            ]
+        },
+        {
+            "description": "Lists VPC offerings",
+            "isasync": false,
+            "name": "listVPCOfferings",
+            "params": [
+                {
+                    "description": "list VPC offerings supporting certain services",
+                    "length": 255,
+                    "name": "supportedservices",
+                    "required": false,
+                    "type": "list"
+                },
+                {
+                    "description": "true if need to list only default VPC offerings. Default value is false",
+                    "length": 255,
+                    "name": "isdefault",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "list VPC offerings by display text",
+                    "length": 255,
+                    "name": "displaytext",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "list VPC offerings by state",
+                    "length": 255,
+                    "name": "state",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "list VPC offerings by name",
+                    "length": 255,
+                    "name": "name",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "list VPC offerings by id",
+                    "length": 255,
+                    "name": "id",
+                    "related": "listVPCOfferings,updateVPCOffering",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "updateVPCOffering",
+            "response": [
+                {
+                    "description": " indicated if the offering can support region level vpc",
+                    "name": "supportsregionLevelvpc",
+                    "type": "boolean"
+                },
+                {
+                    "description": "state of the vpc offering. Can be Disabled/Enabled",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of supported services",
+                    "name": "service",
+                    "response": [
+                        {
+                            "description": "the service provider name",
+                            "name": "provider",
+                            "response": [
+                                {
+                                    "description": "uuid of the network provider",
+                                    "name": "id",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the provider name",
+                                    "name": "name",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "true if individual services can be enabled/disabled",
+                                    "name": "canenableindividualservice",
+                                    "type": "boolean"
+                                },
+                                {
+                                    "description": "services for this provider",
+                                    "name": "servicelist",
+                                    "type": "list"
+                                },
+                                {
+                                    "description": "state of the network provider",
+                                    "name": "state",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the physical network this belongs to",
+                                    "name": "physicalnetworkid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the destination physical network",
+                                    "name": "destinationphysicalnetworkid",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "list"
+                        },
+                        {
+                            "description": "the list of capabilities",
+                            "name": "capability",
+                            "response": [
+                                {
+                                    "description": "the capability value",
+                                    "name": "value",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the capability name",
+                                    "name": "name",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "can this service capability value can be choosable while creatine network offerings",
+                                    "name": "canchooseservicecapability",
+                                    "type": "boolean"
+                                }
+                            ],
+                            "type": "list"
+                        },
+                        {
+                            "description": "the service name",
+                            "name": "name",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "the name of the vpc offering",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the id of the vpc offering",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the date this vpc offering was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "true if vpc offering is default, false otherwise",
+                    "name": "isdefault",
+                    "type": "boolean"
+                },
+                {
+                    "description": " indicates if the vpc offering supports distributed router for one-hop forwarding",
+                    "name": "distributedvpcrouter",
+                    "type": "boolean"
+                },
+                {
+                    "description": "an alternate display text of the vpc offering.",
+                    "name": "displaytext",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Get the SF volume size including Hypervisor Snapshot Reserve",
+            "isasync": false,
+            "name": "getSolidFireVolumeSize",
+            "params": [
+                {
+                    "description": "Volume UUID",
+                    "length": 255,
+                    "name": "volumeid",
+                    "required": true,
+                    "type": "string"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "SolidFire Volume Size Including Hypervisor Snapshot Reserve",
+                    "name": "solidFireVolumeSize",
+                    "type": "long"
+                }
+            ]
+        },
+        {
+            "description": "Uploads a data disk.",
+            "isasync": true,
+            "name": "uploadVolume",
+            "params": [
+                {
+                    "description": "the format for the volume. Possible values include QCOW2, OVA, and VHD.",
+                    "length": 255,
+                    "name": "format",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the disk offering. This must be a custom sized offering since during uploadVolume volume size is unknown.",
+                    "length": 255,
+                    "name": "diskofferingid",
+                    "related": "updateDiskOffering,createDiskOffering,listDiskOfferings",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "an optional domainId. If the account parameter is used, domainId must also be used.",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "updateDomain,createDomain,listDomains,listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the ID of the zone the volume is to be hosted on",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones,listZones,createZone,updateZone",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the URL of where the volume is hosted. Possible URL include http:// and https://",
+                    "length": 2048,
+                    "name": "url",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "Upload volume for the project",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "listProjectAccounts,suspendProject,activateProject,updateProject,createProject,listProjects",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "Image store uuid",
+                    "length": 255,
+                    "name": "imagestoreuuid",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the volume",
+                    "length": 255,
+                    "name": "name",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the MD5 checksum value of this volume",
+                    "length": 255,
+                    "name": "checksum",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "an optional accountName. Must be used with domainId.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "detachVolume,listVolumes,updateVolume,attachVolume,resizeVolume,updateVolume,migrateVolume,createVolume,listVolumes,uploadVolume,attachVolume,detachVolume,resizeVolume,migrateVolume,createVolume",
+            "response": [
+                {
+                    "description": "the ID of the domain associated with the disk volume",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the chain info of the volume",
+                    "name": "chaininfo",
+                    "type": "string"
+                },
+                {
+                    "description": "type of the disk volume (ROOT or DATADISK)",
+                    "name": "type",
+                    "type": "string"
+                },
+                {
+                    "description": "bytes read rate of the disk volume",
+                    "name": "diskBytesReadRate",
+                    "type": "long"
+                },
+                {
+                    "description": "ID of the service offering for root disk",
+                    "name": "serviceofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "bytes write rate of the disk volume",
+                    "name": "diskBytesWriteRate",
+                    "type": "long"
+                },
+                {
+                    "description": "the ID of the template for the virtual machine. A -1 is returned if the virtual machine was created from an ISO file.",
+                    "name": "templateid",
+                    "type": "string"
+                },
+                {
+                    "description": "name of the availability zone",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "need quiesce vm or not when taking snapshot",
+                    "name": "quiescevm",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the path of the volume",
+                    "name": "path",
+                    "type": "string"
+                },
+                {
+                    "description": "ID of the disk offering",
+                    "name": "diskofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "display name of the virtual machine",
+                    "name": "vmdisplayname",
+                    "type": "string"
+                },
+                {
+                    "description": "an alternate display text of the ISO attached to the virtual machine",
+                    "name": "isodisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "an optional field whether to the display the volume to the end user or not.",
+                    "name": "displayvolume",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the date the disk volume was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "ID of the disk volume",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the status of the volume",
+                    "name": "status",
+                    "type": "string"
+                },
+                {
+                    "description": "name of the virtual machine",
+                    "name": "vmname",
+                    "type": "string"
+                },
+                {
+                    "description": "id of the primary storage hosting the disk volume; returned to admin user only",
+                    "name": "storageid",
+                    "type": "string"
+                },
+                {
+                    "description": "name of the primary storage hosting the disk volume",
+                    "name": "storage",
+                    "type": "string"
+                },
+                {
+                    "description": "ID of the snapshot from which this volume was created",
+                    "name": "snapshotid",
+                    "type": "string"
+                },
+                {
+                    "description": "the date the volume was attached to a VM instance",
+                    "name": "attached",
+                    "type": "date"
+                },
+                {
+                    "description": "the name of the ISO attached to the virtual machine",
+                    "name": "isoname",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the ISO attached to the virtual machine",
+                    "name": "isoid",
+                    "type": "string"
+                },
+                {
+                    "description": "io requests write rate of the disk volume",
+                    "name": "diskIopsWriteRate",
+                    "type": "long"
+                },
+                {
+                    "description": "io requests read rate of the disk volume",
+                    "name": "diskIopsReadRate",
+                    "type": "long"
+                },
+                {
+                    "description": "size of the disk volume",
+                    "name": "size",
+                    "type": "long"
+                },
+                {
+                    "description": "the account associated with the disk volume",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "Hypervisor the volume belongs to",
+                    "name": "hypervisor",
+                    "type": "string"
+                },
+                {
+                    "description": "name of the service offering for root disk",
+                    "name": "serviceofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "the display text of the service offering for root disk",
+                    "name": "serviceofferingdisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "name of the disk volume",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "name of the disk offering",
+                    "name": "diskofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the vpn",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the device on user vm the volume is attahed to. This tag is not returned when the volume is detached.",
+                    "name": "deviceid",
+                    "type": "long"
+                },
+                {
+                    "description": "the boolean state of whether the volume is destroyed or not",
+                    "name": "destroyed",
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if the volume is extractable, false otherwise",
+                    "name": "isextractable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the state of the disk volume",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain associated with the disk volume",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "id of the virtual machine",
+                    "name": "virtualmachineid",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the vpn",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "shared or local storage",
+                    "name": "storagetype",
+                    "type": "string"
+                },
+                {
+                    "description": "provisioning type used to create volumes.",
+                    "name": "provisioningtype",
+                    "type": "string"
+                },
+                {
+                    "description": "state of the virtual machine",
+                    "name": "vmstate",
+                    "type": "string"
+                },
+                {
+                    "description": "min iops of the disk volume",
+                    "name": "miniops",
+                    "type": "long"
+                },
+                {
+                    "description": "max iops of the disk volume",
+                    "name": "maxiops",
+                    "type": "long"
+                },
+                {
+                    "description": "ID of the availability zone",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": " an alternate display text of the template for the virtual machine",
+                    "name": "templatedisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the template for the virtual machine",
+                    "name": "templatename",
+                    "type": "string"
+                },
+                {
+                    "description": "the display text of the disk offering",
+                    "name": "diskofferingdisplaytext",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Lists security groups",
+            "isasync": false,
+            "name": "listSecurityGroups",
+            "params": [
+                {
+                    "description": "defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.",
+                    "length": 255,
+                    "name": "isrecursive",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "lists security groups by virtual machine id",
+                    "length": 255,
+                    "name": "virtualmachineid",
+                    "related": "updateVMAffinityGroup,rebootVirtualMachine,changeServiceForVirtualMachine,detachIso,resetSSHKeyForVirtualMachine,resetSSHKeyForVirtualMachine,migrateVirtualMachineWithVolume,attachIso,removeNicFromVirtualMachine,updateVirtualMachine,recoverVirtualMachine,migrateVirtualMachine,resetPasswordForVirtualMachine,revertToVMSnapshot,assignVirtualMachine,updateVMAffinityGroup,listVirtualMachines,rebootVirtualMachine,restoreVirtualMachine,destroyVirtualMachine,stopVirtualMachine,deployVirtualMachine,detachIso,deployVirtualMachine,updateDefaultNicForVirtualMachine,updateVirtualMachine,revertToVMSnapshot,addNicToVirtualMachine,tmDestroyVirtualMachine,resetPasswordForVirtualMachine,startVirtualMachine,updateDefaultNicForVirtualMachine,startVirtualMachine,updateVmNicIp,attachIso,listVirtualMachines,addNicToVirtualMachine,stopVirtualMachine,destroyVirtualMachine,removeNicFromVirtualMachine,changeServiceForVirtualMachine",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "lists security groups by name",
+                    "length": 255,
+                    "name": "securitygroupname",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "list only resources belonging to the domain specified",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "updateDomain,createDomain,listDomains,listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list resources by account. Must be used with the domainId parameter.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "List resources by tags (key/value pairs)",
+                    "length": 255,
+                    "name": "tags",
+                    "required": false,
+                    "type": "map"
+                },
+                {
+                    "description": "list objects by project",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "listProjectAccounts,suspendProject,activateProject,updateProject,createProject,listProjects",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list the security group by the id provided",
+                    "length": 255,
+                    "name": "id",
+                    "related": "createSecurityGroup,listSecurityGroups",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "If set to false, list only resources belonging to the command's caller; if set to true - list resources that the caller is authorized to see. Default value is false",
+                    "length": 255,
+                    "name": "listall",
+                    "required": false,
+                    "type": "boolean"
+                }
+            ],
+            "related": "createSecurityGroup",
+            "response": [
+                {
+                    "description": "the list of resource tags associated with the rule",
+                    "name": "tags",
+                    "response": [
+                        {
+                            "description": "the project id the tag belongs to",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "id of the resource",
+                            "name": "resourceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the domain associated with the tag",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "customer associated with the tag",
+                            "name": "customer",
+                            "type": "string"
+                        },
+                        {
+                            "description": "resource type",
+                            "name": "resourcetype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag value",
+                            "name": "value",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account associated with the tag",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name where tag belongs to",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag key name",
+                            "name": "key",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain associated with the tag",
+                            "name": "domain",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "the ID of the security group",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the group",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the account owning the security group",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of ingress rules associated with the security group",
+                    "name": "ingressrule",
+                    "response": [
+                        {
+                            "description": "the ending IP of the security group rule ",
+                            "name": "endport",
+                            "type": "integer"
+                        },
+                        {
+                            "description": "the protocol of the security group rule",
+                            "name": "protocol",
+                            "type": "string"
+                        },
+                        {
+                            "description": "security group name",
+                            "name": "securitygroupname",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of resource tags associated with the rule",
+                            "name": "tags",
+                            "response": [
+                                {
+                                    "description": "the project id the tag belongs to",
+                                    "name": "projectid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "tag key name",
+                                    "name": "key",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "customer associated with the tag",
+                                    "name": "customer",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the ID of the domain associated with the tag",
+                                    "name": "domainid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "id of the resource",
+                                    "name": "resourceid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the project name where tag belongs to",
+                                    "name": "project",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "resource type",
+                                    "name": "resourcetype",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the domain associated with the tag",
+                                    "name": "domain",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "tag value",
+                                    "name": "value",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the account associated with the tag",
+                                    "name": "account",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "set"
+                        },
+                        {
+                            "description": "the code for the ICMP message response",
+                            "name": "icmpcode",
+                            "type": "integer"
+                        },
+                        {
+                            "description": "the id of the security group rule",
+                            "name": "ruleid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "account owning the security group rule",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the type of the ICMP message response",
+                            "name": "icmptype",
+                            "type": "integer"
+                        },
+                        {
+                            "description": "the CIDR notation for the base IP address of the security group rule",
+                            "name": "cidr",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the starting IP of the security group rule",
+                            "name": "startport",
+                            "type": "integer"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "the domain name of the security group",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of virtualmachine ids associated with this securitygroup",
+                    "name": "virtualmachineids",
+                    "type": "set"
+                },
+                {
+                    "description": "the project name of the group",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of egress rules associated with the security group",
+                    "name": "egressrule",
+                    "response": [
+                        {
+                            "description": "the starting IP of the security group rule",
+                            "name": "startport",
+                            "type": "integer"
+                        },
+                        {
+                            "description": "the protocol of the security group rule",
+                            "name": "protocol",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the type of the ICMP message response",
+                            "name": "icmptype",
+                            "type": "integer"
+                        },
+                        {
+                            "description": "the CIDR notation for the base IP address of the security group rule",
+                            "name": "cidr",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the code for the ICMP message response",
+                            "name": "icmpcode",
+                            "type": "integer"
+                        },
+                        {
+                            "description": "the list of resource tags associated with the rule",
+                            "name": "tags",
+                            "response": [
+                                {
+                                    "description": "tag value",
+                                    "name": "value",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the project name where tag belongs to",
+                                    "name": "project",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "customer associated with the tag",
+                                    "name": "customer",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the domain associated with the tag",
+                                    "name": "domain",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the project id the tag belongs to",
+                                    "name": "projectid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "resource type",
+                                    "name": "resourcetype",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the account associated with the tag",
+                                    "name": "account",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "tag key name",
+                                    "name": "key",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "id of the resource",
+                                    "name": "resourceid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the ID of the domain associated with the tag",
+                                    "name": "domainid",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "set"
+                        },
+                        {
+                            "description": "security group name",
+                            "name": "securitygroupname",
+                            "type": "string"
+                        },
+                        {
+                            "description": "account owning the security group rule",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ending IP of the security group rule ",
+                            "name": "endport",
+                            "type": "integer"
+                        },
+                        {
+                            "description": "the id of the security group rule",
+                            "name": "ruleid",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "the description of the security group",
+                    "name": "description",
+                    "type": "string"
+                },
+                {
+                    "description": "the number of virtualmachines associated with this securitygroup",
+                    "name": "virtualmachinecount",
+                    "type": "integer"
+                },
+                {
+                    "description": "the name of the security group",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain ID of the security group",
+                    "name": "domainid",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Configures a host's out-of-band management interface",
+            "isasync": false,
+            "name": "configureOutOfBandManagement",
+            "params": [
+                {
+                    "description": "the host management interface port",
+                    "length": 255,
+                    "name": "port",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the host management interface user",
+                    "length": 255,
+                    "name": "username",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the host",
+                    "length": 255,
+                    "name": "hostid",
+                    "related": "addBaremetalHost,listExternalLoadBalancers,prepareHostForMaintenance,reconnectHost,addHost,cancelHostMaintenance",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the host management interface driver, for example: ipmitool",
+                    "length": 255,
+                    "name": "driver",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the host management interface IP address",
+                    "length": 255,
+                    "name": "address",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the host management interface password",
+                    "length": 255,
+                    "name": "password",
+                    "required": true,
+                    "type": "string"
+                }
+            ],
+            "related": "disableOutOfBandManagementForCluster,disableOutOfBandManagementForHost,issueOutOfBandManagementPowerAction,enableOutOfBandManagementForZone,enableOutOfBandManagementForCluster,changeOutOfBandManagementPassword,enableOutOfBandManagementForHost,disableOutOfBandManagementForZone",
+            "response": [
+                {
+                    "description": "the out-of-band management interface powerState of the host",
+                    "name": "powerstate",
+                    "type": "powerstate"
+                },
+                {
+                    "description": "the out-of-band management driver for the host",
+                    "name": "driver",
+                    "type": "string"
+                },
+                {
+                    "description": "the operation result description",
+                    "name": "description",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the host",
+                    "name": "hostid",
+                    "type": "string"
+                },
+                {
+                    "description": "the out-of-band management action (if issued)",
+                    "name": "action",
+                    "type": "string"
+                },
+                {
+                    "description": "the operation result",
+                    "name": "status",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the out-of-band management interface port",
+                    "name": "port",
+                    "type": "string"
+                },
+                {
+                    "description": "the out-of-band management interface password",
+                    "name": "password",
+                    "type": "string"
+                },
+                {
+                    "description": "true if out-of-band management is enabled for the host",
+                    "name": "enabled",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the out-of-band management interface address",
+                    "name": "address",
+                    "type": "string"
+                },
+                {
+                    "description": "the out-of-band management interface username",
+                    "name": "username",
+                    "type": "string"
+                }
+            ],
+            "since": "4.9.0"
+        },
+        {
+            "description": "Lists storage tags",
+            "isasync": false,
+            "name": "listStorageTags",
+            "params": [
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the ID of the storage tag",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the storage tag",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the pool ID of the storage tag",
+                    "name": "poolid",
+                    "type": "long"
+                }
+            ]
+        },
+        {
+            "description": "List template visibility and all accounts that have permissions to view this template.",
+            "isasync": false,
+            "name": "listTemplatePermissions",
+            "params": [
+                {
+                    "description": "the template ID",
+                    "length": 255,
+                    "name": "id",
+                    "related": "listIsoPermissions,listTemplatePermissions,listTemplatePermissions,listIsoPermissions",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "listIsoPermissions,listTemplatePermissions,listIsoPermissions",
+            "response": [
+                {
+                    "description": "the ID of the domain to which the template belongs",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of projects the template is available for",
+                    "name": "projectids",
+                    "type": "list"
+                },
+                {
+                    "description": "the template ID",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of accounts the template is available for",
+                    "name": "account",
+                    "type": "list"
+                },
+                {
+                    "description": "true if this template is a public template, false otherwise",
+                    "name": "ispublic",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "Destroyes a system virtual machine.",
+            "isasync": true,
+            "name": "destroySystemVm",
+            "params": [
+                {
+                    "description": "The ID of the system virtual machine",
+                    "length": 255,
+                    "name": "id",
+                    "related": "destroySystemVm,changeServiceForSystemVm,scaleSystemVm,migrateSystemVm,listSystemVms,stopSystemVm,startSystemVm",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "changeServiceForSystemVm,scaleSystemVm,migrateSystemVm,listSystemVms,stopSystemVm,startSystemVm",
+            "response": [
+                {
+                    "description": "the first DNS for the system VM",
+                    "name": "dns1",
+                    "type": "string"
+                },
+                {
+                    "description": "the public MAC address for the system VM",
+                    "name": "publicmacaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the system VM type",
+                    "name": "systemvmtype",
+                    "type": "string"
+                },
+                {
+                    "description": "the link local IP address for the system vm",
+                    "name": "linklocalip",
+                    "type": "string"
+                },
+                {
+                    "description": "the public IP address for the system VM",
+                    "name": "publicip",
+                    "type": "string"
+                },
+                {
+                    "description": "the date and time the system VM was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the second DNS for the system VM",
+                    "name": "dns2",
+                    "type": "string"
+                },
+                {
+                    "description": "the public netmask for the system VM",
+                    "name": "publicnetmask",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the system VM",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the network domain for the system VM",
+                    "name": "networkdomain",
+                    "type": "string"
+                },
+                {
+                    "description": "the private netmask for the system VM",
+                    "name": "privatenetmask",
+                    "type": "string"
+                },
+                {
+                    "description": "the Pod ID for the system VM",
+                    "name": "podid",
+                    "type": "string"
+                },
+                {
+                    "description": "the link local netmask for the system vm",
+                    "name": "linklocalnetmask",
+                    "type": "string"
+                },
+                {
+                    "description": "the host ID for the system VM",
+                    "name": "hostid",
+                    "type": "string"
+                },
+                {
+                    "description": "the gateway for the system VM",
+                    "name": "gateway",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the system VM",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the private MAC address for the system VM",
+                    "name": "privatemacaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the template ID for the system VM",
+                    "name": "templateid",
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone ID for the system VM",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the private IP address for the system VM",
+                    "name": "privateip",
+                    "type": "string"
+                },
+                {
+                    "description": "the link local MAC address for the system vm",
+                    "name": "linklocalmacaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the hypervisor on which the template runs",
+                    "name": "hypervisor",
+                    "type": "string"
+                },
+                {
+                    "description": "the job ID associated with the system VM. This is only displayed if the router listed is part of a currently running asynchronous job.",
+                    "name": "jobid",
+                    "type": "string"
+                },
+                {
+                    "description": "the job status associated with the system VM.  This is only displayed if the router listed is part of a currently running asynchronous job.",
+                    "name": "jobstatus",
+                    "type": "integer"
+                },
+                {
+                    "description": "the number of active console sessions for the console proxy system vm",
+                    "name": "activeviewersessions",
+                    "type": "integer"
+                },
+                {
+                    "description": "the state of the system VM",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the hostname for the system VM",
+                    "name": "hostname",
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone name for the system VM",
+                    "name": "zonename",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Archive one or more events.",
+            "isasync": false,
+            "name": "archiveEvents",
+            "params": [
+                {
+                    "description": "archive by event type",
+                    "length": 255,
+                    "name": "type",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "end date range to archive events (including) this date (use format \"yyyy-MM-dd\" or the new format \"yyyy-MM-ddThh:mm:ss\")",
+                    "length": 255,
+                    "name": "enddate",
+                    "required": false,
+                    "type": "date"
+                },
+                {
+                    "description": "start date range to archive events (including) this date (use format \"yyyy-MM-dd\" or the new format \"yyyy-MM-ddThh:mm:ss\")",
+                    "length": 255,
+                    "name": "startdate",
+                    "required": false,
+                    "type": "date"
+                },
+                {
+                    "description": "the IDs of the events",
+                    "length": 255,
+                    "name": "ids",
+                    "related": "listEvents",
+                    "required": false,
+                    "type": "list"
+                }
+            ],
+            "response": [
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "Adds Swift.",
+            "isasync": false,
+            "name": "addSwift",
+            "params": [
+                {
+                    "description": "the URL for swift",
+                    "length": 255,
+                    "name": "url",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": " key for the user for swift",
+                    "length": 255,
+                    "name": "key",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the username for swift",
+                    "length": 255,
+                    "name": "username",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the account for swift",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "addSecondaryStorage,addImageStoreS3,createSecondaryStagingStore,updateCloudToUseObjectStore,listSwifts,addImageStore,listSecondaryStagingStores,listImageStores",
+            "response": [
+                {
+                    "description": "the ID of the image store",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the scope of the image store",
+                    "name": "scope",
+                    "type": "scopetype"
+                },
+                {
+                    "description": "the name of the image store",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the details of the image store",
+                    "name": "details",
+                    "type": "set"
+                },
+                {
+                    "description": "the Zone ID of the image store",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone name of the image store",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the url of the image store",
+                    "name": "url",
+                    "type": "string"
+                },
+                {
+                    "description": "the protocol of the image store",
+                    "name": "protocol",
+                    "type": "string"
+                },
+                {
+                    "description": "the provider name of the image store",
+                    "name": "providername",
+                    "type": "string"
+                }
+            ],
+            "since": "3.0.0"
+        },
+        {
+            "description": "Deletes a secondary staging store .",
+            "isasync": false,
+            "name": "deleteSecondaryStagingStore",
+            "params": [
+                {
+                    "description": "the staging store ID",
+                    "length": 255,
+                    "name": "id",
+                    "related": "addSecondaryStorage,addImageStoreS3,createSecondaryStagingStore,updateCloudToUseObjectStore,listSwifts,addImageStore,listSecondaryStagingStores,listImageStores",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                }
+            ],
+            "since": "4.2.0"
+        },
+        {
+            "description": "Adds a SRX firewall device",
+            "isasync": true,
+            "name": "addSrxFirewall",
+            "params": [
+                {
+                    "description": "URL of the SRX appliance.",
+                    "length": 255,
+                    "name": "url",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "Credentials to reach SRX firewall device",
+                    "length": 255,
+                    "name": "password",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "supports only JuniperSRXFirewall",
+                    "length": 255,
+                    "name": "networkdevicetype",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "Credentials to reach SRX firewall device",
+                    "length": 255,
+                    "name": "username",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the Physical Network ID",
+                    "length": 255,
+                    "name": "physicalnetworkid",
+                    "related": "updatePhysicalNetwork,createPhysicalNetwork,listPhysicalNetworks",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "configureSrxFirewall",
+            "response": [
+                {
+                    "description": "device id of the SRX firewall",
+                    "name": "fwdeviceid",
+                    "type": "string"
+                },
+                {
+                    "description": "device name",
+                    "name": "fwdevicename",
+                    "type": "string"
+                },
+                {
+                    "description": "device state",
+                    "name": "fwdevicestate",
+                    "type": "string"
+                },
+                {
+                    "description": "the private interface of the external firewall",
+                    "name": "privateinterface",
+                    "type": "string"
+                },
+                {
+                    "description": "the number of times to retry requests to the external firewall",
+                    "name": "numretries",
+                    "type": "string"
+                },
+                {
+                    "description": "the public security zone of the external firewall",
+                    "name": "publiczone",
+                    "type": "string"
+                },
+                {
+                    "description": "the management IP address of the external firewall",
+                    "name": "ipaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the physical network to which this SRX firewall belongs to",
+                    "name": "physicalnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "the private security zone of the external firewall",
+                    "name": "privatezone",
+                    "type": "string"
+                },
+                {
+                    "description": "the username that's used to log in to the external firewall",
+                    "name": "username",
+                    "type": "string"
+                },
+                {
+                    "description": "the usage interface of the external firewall",
+                    "name": "usageinterface",
+                    "type": "string"
+                },
+                {
+                    "description": "name of the provider",
+                    "name": "provider",
+                    "type": "string"
+                },
+                {
+                    "description": "device capacity",
+                    "name": "fwdevicecapacity",
+                    "type": "long"
+                },
+                {
+                    "description": "the zone ID of the external firewall",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the timeout (in seconds) for requests to the external firewall",
+                    "name": "timeout",
+                    "type": "string"
+                },
+                {
+                    "description": "the public interface of the external firewall",
+                    "name": "publicinterface",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Updates a load balancer",
+            "isasync": true,
+            "name": "updateLoadBalancer",
+            "params": [
+                {
+                    "description": "the ID of the load balancer",
+                    "length": 255,
+                    "name": "id",
+                    "related": "listIpForwardingRules,createIpForwardingRule,updatePortForwardingRule,createPortForwardingRule,listPortForwardingRules",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "an optional field, in case you want to set a custom id to the resource. Allowed to Root Admins only",
+                    "length": 255,
+                    "name": "customid",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "string"
+                },
+                {
+                    "description": "an optional field, whether to the display the rule to the end user or not",
+                    "length": 255,
+                    "name": "fordisplay",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "boolean"
+                }
+            ],
+            "related": "createLoadBalancer,listLoadBalancers",
+            "response": [
+                {
+                    "description": "Load Balancer network id",
+                    "name": "networkid",
+                    "type": "string"
+                },
+                {
+                    "description": "the account of the Load Balancer",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the Load Balancer",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of instances associated with the Load Balancer",
+                    "name": "loadbalancerinstance",
+                    "response": [
+                        {
+                            "description": "the ip address of the instance",
+                            "name": "ipaddress",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the state of the instance",
+                            "name": "state",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the name of the instance",
+                            "name": "name",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the instance ID",
+                            "name": "id",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "Load Balancer source ip",
+                    "name": "sourceipaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the Load Balancer",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "is rule for display to the regular user",
+                    "name": "fordisplay",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the load balancer algorithm (source, roundrobin, leastconn)",
+                    "name": "algorithm",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of resource tags associated with the Load Balancer",
+                    "name": "tags",
+                    "response": [
+                        {
+                            "description": "id of the resource",
+                            "name": "resourceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project id the tag belongs to",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the domain associated with the tag",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag value",
+                            "name": "value",
+                            "type": "string"
+                        },
+                        {
+                            "description": "customer associated with the tag",
+                            "name": "customer",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain associated with the tag",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag key name",
+                            "name": "key",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name where tag belongs to",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account associated with the tag",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "resource type",
+                            "name": "resourcetype",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "the list of rules associated with the Load Balancer",
+                    "name": "loadbalancerrule",
+                    "response": [
+                        {
+                            "description": "the state of the load balancer rule",
+                            "name": "state",
+                            "type": "string"
+                        },
+                        {
+                            "description": "instance port of the load balancer rule",
+                            "name": "instanceport",
+                            "type": "integer"
+                        },
+                        {
+                            "description": "source port of the load balancer rule",
+                            "name": "sourceport",
+                            "type": "integer"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "the Load Balancer ID",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "Load Balancer source ip network id",
+                    "name": "sourceipaddressnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "the description of the Load Balancer",
+                    "name": "description",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain ID of the Load Balancer",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the Load Balancer",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain of the Load Balancer",
+                    "name": "domain",
+                    "type": "string"
+                }
+            ],
+            "since": "4.4.0"
+        },
+        {
+            "description": "Scale the service offering for a system vm (console proxy or secondary storage). The system vm must be in a \"Stopped\" state for this command to take effect.",
+            "isasync": true,
+            "name": "scaleSystemVm",
+            "params": [
+                {
+                    "description": "name value pairs of custom parameters for cpu, memory and cpunumber. example details[i].name=value",
+                    "length": 255,
+                    "name": "details",
+                    "required": false,
+                    "type": "map"
+                },
+                {
+                    "description": "the service offering ID to apply to the system vm",
+                    "length": 255,
+                    "name": "serviceofferingid",
+                    "related": "createServiceOffering,updateServiceOffering,listServiceOfferings",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "The ID of the system vm",
+                    "length": 255,
+                    "name": "id",
+                    "related": "changeServiceForSystemVm,scaleSystemVm,migrateSystemVm,listSystemVms,stopSystemVm,startSystemVm",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "changeServiceForSystemVm,migrateSystemVm,listSystemVms,stopSystemVm,startSystemVm",
+            "response": [
+                {
+                    "description": "the system VM type",
+                    "name": "systemvmtype",
+                    "type": "string"
+                },
+                {
+                    "description": "the link local IP address for the system vm",
+                    "name": "linklocalip",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the system VM",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the second DNS for the system VM",
+                    "name": "dns2",
+                    "type": "string"
+                },
+                {
+                    "description": "the link local MAC address for the system vm",
+                    "name": "linklocalmacaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone name for the system VM",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the private MAC address for the system VM",
+                    "name": "privatemacaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone ID for the system VM",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the private IP address for the system VM",
+                    "name": "privateip",
+                    "type": "string"
+                },
+                {
+                    "description": "the job ID associated with the system VM. This is only displayed if the router listed is part of a currently running asynchronous job.",
+                    "name": "jobid",
+                    "type": "string"
+                },
+                {
+                    "description": "the hostname for the system VM",
+                    "name": "hostname",
+                    "type": "string"
+                },
+                {
+                    "description": "the Pod ID for the system VM",
+                    "name": "podid",
+                    "type": "string"
+                },
+                {
+                    "description": "the date and time the system VM was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the name of the system VM",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the hypervisor on which the template runs",
+                    "name": "hypervisor",
+                    "type": "string"
+                },
+                {
+                    "description": "the private netmask for the system VM",
+                    "name": "privatenetmask",
+                    "type": "string"
+                },
+                {
+                    "description": "the network domain for the system VM",
+                    "name": "networkdomain",
+                    "type": "string"
+                },
+                {
+                    "description": "the template ID for the system VM",
+                    "name": "templateid",
+                    "type": "string"
+                },
+                {
+                    "description": "the public netmask for the system VM",
+                    "name": "publicnetmask",
+                    "type": "string"
+                },
+                {
+                    "description": "the gateway for the system VM",
+                    "name": "gateway",
+                    "type": "string"
+                },
+                {
+                    "description": "the public MAC address for the system VM",
+                    "name": "publicmacaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the link local netmask for the system vm",
+                    "name": "linklocalnetmask",
+                    "type": "string"
+                },
+                {
+                    "description": "the number of active console sessions for the console proxy system vm",
+                    "name": "activeviewersessions",
+                    "type": "integer"
+                },
+                {
+                    "description": "the job status associated with the system VM.  This is only displayed if the router listed is part of a currently running asynchronous job.",
+                    "name": "jobstatus",
+                    "type": "integer"
+                },
+                {
+                    "description": "the first DNS for the system VM",
+                    "name": "dns1",
+                    "type": "string"
+                },
+                {
+                    "description": "the host ID for the system VM",
+                    "name": "hostid",
+                    "type": "string"
+                },
+                {
+                    "description": "the public IP address for the system VM",
+                    "name": "publicip",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of the system VM",
+                    "name": "state",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Lists snapshot policies.",
+            "isasync": false,
+            "name": "listSnapshotPolicies",
+            "params": [
+                {
+                    "description": "the ID of the disk volume",
+                    "length": 255,
+                    "name": "volumeid",
+                    "related": "detachVolume,listVolumes,updateVolume,attachVolume,resizeVolume,updateVolume,migrateVolume,createVolume,listVolumes,uploadVolume,attachVolume,detachVolume,resizeVolume,migrateVolume,createVolume",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "list resources by display flag; only ROOT admin is eligible to pass this parameter",
+                    "length": 255,
+                    "name": "fordisplay",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the ID of the snapshot policy",
+                    "length": 255,
+                    "name": "id",
+                    "related": "listSnapshotPolicies,updateSnapshotPolicy,createSnapshotPolicy",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                }
+            ],
+            "related": "updateSnapshotPolicy,createSnapshotPolicy",
+            "response": [
+                {
+                    "description": "the ID of the snapshot policy",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the interval type of the snapshot policy",
+                    "name": "intervaltype",
+                    "type": "short"
+                },
+                {
+                    "description": "the time zone of the snapshot policy",
+                    "name": "timezone",
+                    "type": "string"
+                },
+                {
+                    "description": "time the snapshot is scheduled to be taken.",
+                    "name": "schedule",
+                    "type": "string"
+                },
+                {
+                    "description": "maximum number of snapshots retained",
+                    "name": "maxsnaps",
+                    "type": "int"
+                },
+                {
+                    "description": "is this policy for display to the regular user",
+                    "name": "fordisplay",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the ID of the disk volume",
+                    "name": "volumeid",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Update site to site vpn customer gateway",
+            "isasync": true,
+            "name": "updateVpnCustomerGateway",
+            "params": [
+                {
+                    "description": "public ip address id of the customer gateway",
+                    "length": 255,
+                    "name": "gateway",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "Lifetime of phase 1 VPN connection to the customer gateway, in seconds",
+                    "length": 255,
+                    "name": "ikelifetime",
+                    "required": false,
+                    "type": "long"
+                },
+                {
+                    "description": "the account associated with the gateway. Must be used with the domainId parameter.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "IPsec Preshared-Key of the customer gateway. Cannot contain newline or double quotes.",
+                    "length": 255,
+                    "name": "ipsecpsk",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "ESP policy of the customer gateway",
+                    "length": 255,
+                    "name": "esppolicy",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "guest cidr of the customer gateway",
+                    "length": 255,
+                    "name": "cidrlist",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "If DPD is enabled for VPN connection",
+                    "length": 255,
+                    "name": "dpd",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "Lifetime of phase 2 VPN connection to the customer gateway, in seconds",
+                    "length": 255,
+                    "name": "esplifetime",
+                    "required": false,
+                    "type": "long"
+                },
+                {
+                    "description": "id of customer gateway",
+                    "length": 255,
+                    "name": "id",
+                    "related": "createVpnCustomerGateway,updateVpnCustomerGateway,listVpnCustomerGateways",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "IKE policy of the customer gateway",
+                    "length": 255,
+                    "name": "ikepolicy",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "Force encapsulation for Nat Traversal",
+                    "length": 255,
+                    "name": "forceencap",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "the domain ID associated with the gateway. If used with the account parameter returns the gateway associated with the account for the specified domain.",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "updateDomain,createDomain,listDomains,listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "name of this customer gateway",
+                    "length": 255,
+                    "name": "name",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "createVpnCustomerGateway,listVpnCustomerGateways",
+            "response": [
+                {
+                    "description": "IPsec preshared-key of customer gateway",
+                    "name": "ipsecpsk",
+                    "type": "string"
+                },
+                {
+                    "description": "public ip address id of the customer gateway",
+                    "name": "gateway",
+                    "type": "string"
+                },
+                {
+                    "description": "the owner",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "IPsec policy of customer gateway",
+                    "name": "esppolicy",
+                    "type": "string"
+                },
+                {
+                    "description": "name of the customer gateway",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain name of the owner",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the vpn gateway ID",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "guest ip of the customer gateway",
+                    "name": "ipaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "IKE policy of customer gateway",
+                    "name": "ikepolicy",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain id of the owner",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "Lifetime of IKE SA of customer gateway",
+                    "name": "ikelifetime",
+                    "type": "long"
+                },
+                {
+                    "description": "if Force NAT Encapsulation is enabled for customer gateway",
+                    "name": "forceencap",
+                    "type": "boolean"
+                },
+                {
+                    "description": "guest cidr list of the customer gateway",
+                    "name": "cidrlist",
+                    "type": "string"
+                },
+                {
+                    "description": "the date and time the host was removed",
+                    "name": "removed",
+                    "type": "date"
+                },
+                {
+                    "description": "if DPD is enabled for customer gateway",
+                    "name": "dpd",
+                    "type": "boolean"
+                },
+                {
+                    "description": "Lifetime of ESP SA of customer gateway",
+                    "name": "esplifetime",
+                    "type": "long"
+                },
+                {
+                    "description": "the project name",
+                    "name": "project",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Stops a router.",
+            "isasync": true,
+            "name": "stopRouter",
+            "params": [
+                {
+                    "description": "Force stop the VM. The caller knows the VM is stopped.",
+                    "length": 255,
+                    "name": "forced",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "the ID of the router",
+                    "length": 255,
+                    "name": "id",
+                    "related": "stopInternalLoadBalancerVM,listInternalLoadBalancerVMs,changeServiceForRouter,rebootRouter,destroyRouter,stopRouter,startInternalLoadBalancerVM,startRouter,listRouters",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "stopInternalLoadBalancerVM,listInternalLoadBalancerVMs,changeServiceForRouter,rebootRouter,destroyRouter,startInternalLoadBalancerVM,startRouter,listRouters",
+            "response": [
+                {
+                    "description": "the public IP address for the router",
+                    "name": "publicip",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the corresponding guest network",
+                    "name": "guestnetworkname",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the router",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "true if the router template requires upgrader",
+                    "name": "requiresupgrade",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the ID of the corresponding link local network",
+                    "name": "linklocalnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "the version of template",
+                    "name": "version",
+                    "type": "string"
+                },
+                {
+                    "description": "the template ID for the router",
+                    "name": "templateid",
+                    "type": "string"
+                },
+                {
+                    "description": "the version of scripts",
+                    "name": "scriptsversion",
+                    "type": "string"
+                },
+                {
+                    "description": "role of the domain router",
+                    "name": "role",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of the router",
+                    "name": "state",
+                    "type": "state"
+                },
+                {
+                    "description": "the account associated with the router",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the date and time the router was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the gateway for the router",
+                    "name": "gateway",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of VPC the router belongs to",
+                    "name": "vpcname",
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone ID for the router",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the public netmask for the router",
+                    "name": "publicnetmask",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of nics associated with the router",
+                    "name": "nic",
+                    "response": [
+                        {
+                            "description": "the broadcast uri of the nic",
+                            "name": "broadcasturi",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the vm to which the nic belongs",
+                            "name": "virtualmachineid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the NSX Logical Switch Port (if NSX based), null otherwise",
+                            "name": "nsxlogicalswitchport",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if nic is default, false otherwise",
+                            "name": "isdefault",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "true if nic is default, false otherwise",
+                            "name": "macaddress",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the cidr of IPv6 network",
+                            "name": "ip6cidr",
+                            "type": "string"
+                        },
+                        {
+                            "description": "device id for the network when plugged into the virtual machine",
+                            "name": "deviceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ip address of the nic",
+                            "name": "ipaddress",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the IPv6 address of network",
+                            "name": "ip6address",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the type of the nic",
+                            "name": "type",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the Secondary ipv4 addr of nic",
+                            "name": "secondaryip",
+                            "type": "list"
+                        },
+                        {
+                            "description": "the netmask of the nic",
+                            "name": "netmask",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the corresponding network",
+                            "name": "networkid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the gateway of IPv6 network",
+                            "name": "ip6gateway",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the nic",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the traffic type of the nic",
+                            "name": "traffictype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the NSX Logical Switch (if NSX based), null otherwise",
+                            "name": "nsxlogicalswitch",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the name of the corresponding network",
+                            "name": "networkname",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the gateway of the nic",
+                            "name": "gateway",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the isolation uri of the nic",
+                            "name": "isolationuri",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "the ID of the corresponding public network",
+                    "name": "publicnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "if this router is an redundant virtual router",
+                    "name": "isredundantrouter",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the hypervisor on which the template runs",
+                    "name": "hypervisor",
+                    "type": "string"
+                },
+                {
+                    "description": "the link local IP address for the router",
+                    "name": "linklocalip",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the address",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone name for the router",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the host ID for the router",
+                    "name": "hostid",
+                    "type": "string"
+                },
+                {
+                    "description": "the id of the router",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the first DNS for the router",
+                    "name": "dns1",
+                    "type": "string"
+                },
+                {
+                    "description": "the network domain for the router",
+                    "name": "networkdomain",
+                    "type": "string"
+                },
+                {
+                    "description": "the Pod ID for the router",
+                    "name": "podid",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain ID associated with the router",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain associated with the router",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the link local MAC address for the router",
+                    "name": "linklocalmacaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the corresponding guest network",
+                    "name": "guestnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the service offering of the virtual machine",
+                    "name": "serviceofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the ipaddress",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the first IPv6 DNS for the router",
+                    "name": "ip6dns1",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of redundant virtual router",
+                    "name": "redundantstate",
+                    "type": "string"
+                },
+                {
+                    "description": "the second IPv6 DNS for the router",
+                    "name": "ip6dns2",
+                    "type": "string"
+                },
+                {
+                    "description": "the public MAC address for the router",
+                    "name": "publicmacaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the guest netmask for the router",
+                    "name": "guestnetmask",
+                    "type": "string"
+                },
+                {
+                    "description": "the hostname for the router",
+                    "name": "hostname",
+                    "type": "string"
+                },
+                {
+                    "description": "VPC the router belongs to",
+                    "name": "vpcid",
+                    "type": "string"
+                },
+                {
+                    "description": "the link local netmask for the router",
+                    "name": "linklocalnetmask",
+                    "type": "string"
+                },
+                {
+                    "description": "the guest MAC address for the router",
+                    "name": "guestmacaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the service offering of the virtual machine",
+                    "name": "serviceofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "the guest IP address for the router",
+                    "name": "guestipaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the second DNS for the router",
+                    "name": "dns2",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "This deprecated function used to locks an account. Look for the API DisableAccount instead",
+            "isasync": false,
+            "name": "lockAccount",
+            "params": [
+                {
+                    "description": "Locks the specified account on this domain.",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "updateDomain,createDomain,listDomains,listDomainChildren,listDomains",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "Locks the specified account.",
+                    "length": 255,
+                    "name": "account",
+                    "required": true,
+                    "type": "string"
+                }
+            ],
+            "related": "disableAccount,listAccounts,markDefaultZoneForAccount,listAccounts,enableAccount,updateAccount,createAccount",
+            "response": [
+                {
+                    "description": "the total number of templates which have been created by this account",
+                    "name": "templatetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of virtual machines stopped for this account",
+                    "name": "vmstopped",
+                    "type": "integer"
+                },
+                {
+                    "description": "the total number of snapshots available for this account",
+                    "name": "snapshotavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of virtual machines that can be deployed by this account",
+                    "name": "vmlimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the role",
+                    "name": "roleid",
+                    "type": "string"
+                },
+                {
+                    "description": "the total volume available for this account",
+                    "name": "volumeavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of public ip addresses this account can acquire",
+                    "name": "iplimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of templates available to be created by this account",
+                    "name": "templateavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of projects being administrated by this account",
+                    "name": "projecttotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total volume which can be used by this account",
+                    "name": "volumelimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of virtual machines deployed by this account",
+                    "name": "vmtotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of snapshots stored by this account",
+                    "name": "snapshottotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of networks owned by account",
+                    "name": "networktotal",
+                    "type": "long"
+                },
+                {
+                    "description": "true if the account requires cleanup",
+                    "name": "iscleanuprequired",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the total number of snapshots which can be stored by this account",
+                    "name": "snapshotlimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the account",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of the account",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the total secondary storage space (in GiB) owned by account",
+                    "name": "secondarystoragetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of network traffic bytes received",
+                    "name": "receivedbytes",
+                    "type": "long"
+                },
+                {
+                    "description": "the id of the account",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of vpcs owned by account",
+                    "name": "vpctotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of cpu cores owned by account",
+                    "name": "cputotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total secondary storage space (in GiB) available to be used for this account",
+                    "name": "secondarystorageavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of public ip addresses allocated for this account",
+                    "name": "iptotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the name of the role",
+                    "name": "rolename",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of virtual machines running for this account",
+                    "name": "vmrunning",
+                    "type": "integer"
+                },
+                {
+                    "description": "the total memory (in MB) available to be created for this account",
+                    "name": "memoryavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the network domain",
+                    "name": "networkdomain",
+                    "type": "string"
+                },
+                {
+                    "description": "the total memory (in MB) the account can own",
+                    "name": "memorylimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of users associated with account",
+                    "name": "user",
+                    "response": [
+                        {
+                            "description": "the user name",
+                            "name": "username",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the user firstname",
+                            "name": "firstname",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if user is default, false otherwise",
+                            "name": "isdefault",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "the account name of the user",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the date and time the user account was created",
+                            "name": "created",
+                            "type": "date"
+                        },
+                        {
+                            "description": "the api key of the user",
+                            "name": "apikey",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the user state",
+                            "name": "state",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the role",
+                            "name": "roleid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the boolean value representing if the updating target is in caller's child domain",
+                            "name": "iscallerchilddomain",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "the account type of the user",
+                            "name": "accounttype",
+                            "type": "short"
+                        },
+                        {
+                            "description": "the secret key of the user",
+                            "name": "secretkey",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain name of the user",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the user ID",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the user email address",
+                            "name": "email",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the user lastname",
+                            "name": "lastname",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain ID of the user",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the timezone user was created in",
+                            "name": "timezone",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the name of the role",
+                            "name": "rolename",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account ID of the user",
+                            "name": "accountid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the type of the role",
+                            "name": "roletype",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "the total primary storage space (in GiB) the account can own",
+                    "name": "primarystoragelimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the default zone of the account",
+                    "name": "defaultzoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of virtual machines available for this account to acquire",
+                    "name": "vmavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of networks the account can own",
+                    "name": "networklimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total primary storage space (in GiB) owned by account",
+                    "name": "primarystoragetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of vpcs available to be created for this account",
+                    "name": "vpcavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total secondary storage space (in GiB) the account can own",
+                    "name": "secondarystoragelimit",
+                    "type": "string"
+                },
+                {
+                    "description": "id of the Domain the account belongs too",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "details for the account",
+                    "name": "accountdetails",
+                    "type": "map"
+                },
+                {
+                    "description": "account type (admin, domain-admin, user)",
+                    "name": "accounttype",
+                    "type": "short"
+                },
+                {
+                    "description": "the type of the role (Admin, ResourceAdmin, DomainAdmin, User)",
+                    "name": "roletype",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of public ip addresses available for this account to acquire",
+                    "name": "ipavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of networks available to be created for this account",
+                    "name": "networkavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of templates which can be created by this account",
+                    "name": "templatelimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of projects the account can own",
+                    "name": "projectlimit",
+                    "type": "string"
+                },
+                {
+                    "description": "true if account is default, false otherwise",
+                    "name": "isdefault",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the total number of cpu cores available to be created for this account",
+                    "name": "cpuavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total memory (in MB) owned by account",
+                    "name": "memorytotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total primary storage space (in GiB) available to be used for this account",
+                    "name": "primarystorageavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "name of the Domain the account belongs too",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of network traffic bytes sent",
+                    "name": "sentbytes",
+                    "type": "long"
+                },
+                {
+                    "description": "the total volume being used by this account",
+                    "name": "volumetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of cpu cores the account can own",
+                    "name": "cpulimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of vpcs the account can own",
+                    "name": "vpclimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of acl groups that account belongs to",
+                    "name": "groups",
+                    "type": "list"
+                },
+                {
+                    "description": "the total number of projects available for administration by this account",
+                    "name": "projectavailable",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Lists clusters.",
+            "isasync": false,
+            "name": "listClusters",
+            "params": [
+                {
+                    "description": "whether this cluster is managed by cloudstack",
+                    "length": 255,
+                    "name": "managedstate",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "lists clusters by the cluster ID",
+                    "length": 255,
+                    "name": "id",
+                    "related": "addCluster,listClusters,updateCluster",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "lists clusters by Pod ID",
+                    "length": 255,
+                    "name": "podid",
+                    "related": "listPods,updatePod",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "lists clusters by cluster type",
+                    "length": 255,
+                    "name": "clustertype",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "lists clusters by the cluster name",
+                    "length": 255,
+                    "name": "name",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "lists clusters by hypervisor type",
+                    "length": 255,
+                    "name": "hypervisor",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "flag to display the capacity of the clusters",
+                    "length": 255,
+                    "name": "showcapacities",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "lists clusters by Zone ID",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones,listZones,createZone,updateZone",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "lists clusters by allocation state",
+                    "length": 255,
+                    "name": "allocationstate",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                }
+            ],
+            "related": "addCluster,updateCluster",
+            "response": [
+                {
+                    "description": "whether this cluster is managed by cloudstack",
+                    "name": "managedstate",
+                    "type": "string"
+                },
+                {
+                    "description": "the capacity of the Cluster",
+                    "name": "capacity",
+                    "response": [
+                        {
+                            "description": "the percentage of capacity currently in use",
+                            "name": "percentused",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the Zone name",
+                            "name": "zonename",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the capacity type",
+                            "name": "type",
+                            "type": "short"
+                        },
+                        {
+                            "description": "the Cluster ID",
+                            "name": "clusterid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the Pod name",
+                            "name": "podname",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the capacity currently in use",
+                            "name": "capacityused",
+                            "type": "long"
+                        },
+                        {
+                            "description": "the Zone ID",
+                            "name": "zoneid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the total capacity available",
+                            "name": "capacitytotal",
+                            "type": "long"
+                        },
+                        {
+                            "description": "the Pod ID",
+                            "name": "podid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the Cluster name",
+                            "name": "clustername",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "the allocation state of the cluster",
+                    "name": "allocationstate",
+                    "type": "string"
+                },
+                {
+                    "description": "The cpu overcommit ratio of the cluster",
+                    "name": "cpuovercommitratio",
+                    "type": "string"
+                },
+                {
+                    "description": "the cluster name",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the Pod name of the cluster",
+                    "name": "podname",
+                    "type": "string"
+                },
+                {
+                    "description": "Ovm3 VIP to use for pooling and/or clustering",
+                    "name": "ovm3vip",
+                    "type": "string"
+                },
+                {
+                    "description": "the hypervisor type of the cluster",
+                    "name": "hypervisortype",
+                    "type": "string"
+                },
+                {
+                    "description": "the Pod ID of the cluster",
+                    "name": "podid",
+                    "type": "string"
+                },
+                {
+                    "description": "the cluster ID",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "The memory overcommit ratio of the cluster",
+                    "name": "memoryovercommitratio",
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone name of the cluster",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "Meta data associated with the zone (key/value pairs)",
+                    "name": "resourcedetails",
+                    "type": "map"
+                },
+                {
+                    "description": "the Zone ID of the cluster",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the type of the cluster",
+                    "name": "clustertype",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Deletes project invitation",
+            "isasync": true,
+            "name": "deleteProjectInvitation",
+            "params": [
+                {
+                    "description": "id of the invitation",
+                    "length": 255,
+                    "name": "id",
+                    "related": "listProjectInvitations",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                }
+            ],
+            "since": "3.0.0"
+        },
+        {
+            "description": "Lists project invitations and provides detailed information for listed invitations",
+            "isasync": false,
+            "name": "listProjectInvitations",
+            "params": [
+                {
+                    "description": "list by project id",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "listProjectAccounts,suspendProject,activateProject,updateProject,createProject,listProjects",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "If set to false, list only resources belonging to the command's caller; if set to true - list resources that the caller is authorized to see. Default value is false",
+                    "length": 255,
+                    "name": "listall",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "if true, list only active invitations - having Pending state and ones that are not timed out yet",
+                    "length": 255,
+                    "name": "activeonly",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "list invitations by state",
+                    "length": 255,
+                    "name": "state",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.",
+                    "length": 255,
+                    "name": "isrecursive",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "list resources by account. Must be used with the domainId parameter.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "list invitations by id",
+                    "length": 255,
+                    "name": "id",
+                    "related": "listProjectInvitations",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "list only resources belonging to the domain specified",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "updateDomain,createDomain,listDomains,listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the email the invitation was sent to",
+                    "name": "email",
+                    "type": "string"
+                },
+                {
+                    "description": "the account name of the project's owner",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain name where the project belongs to",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the id of the invitation",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the id of the project",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the project",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain id the project belongs to",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the invitation state",
+                    "name": "state",
+                    "type": "string"
+                }
+            ],
+            "since": "3.0.0"
+        },
+        {
+            "description": "Lists all egress firewall rules for network ID.",
+            "isasync": false,
+            "name": "listEgressFirewallRules",
+            "params": [
+                {
+                    "description": "Lists rule with the specified ID.",
+                    "length": 255,
+                    "name": "id",
+                    "related": "listIpForwardingRules,createIpForwardingRule,updatePortForwardingRule,createPortForwardingRule,listPortForwardingRules",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "If set to false, list only resources belonging to the command's caller; if set to true - list resources that the caller is authorized to see. Default value is false",
+                    "length": 255,
+                    "name": "listall",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "the ID of IP address of the firewall services",
+                    "length": 255,
+                    "name": "ipaddressid",
+                    "related": "associateIpAddress,restartNetwork,updateIpAddress,associateIpAddress,listPublicIpAddresses,listPublicIpAddresses",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "List resources by tags (key/value pairs)",
+                    "length": 255,
+                    "name": "tags",
+                    "required": false,
+                    "type": "map"
+                },
+                {
+                    "description": "defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.",
+                    "length": 255,
+                    "name": "isrecursive",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "list objects by project",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "listProjectAccounts,suspendProject,activateProject,updateProject,createProject,listProjects",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list resources by display flag; only ROOT admin is eligible to pass this parameter",
+                    "length": 255,
+                    "name": "fordisplay",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the network ID for the egress firewall services",
+                    "length": 255,
+                    "name": "networkid",
+                    "related": "createNetwork,updateNetwork,listSrxFirewallNetworks,updateNetwork,listBrocadeVcsDeviceNetworks,listNiciraNvpDeviceNetworks,createNetwork,listNetworks,listNetscalerLoadBalancerNetworks,listF5LoadBalancerNetworks,listPaloAltoFirewallNetworks",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list resources by account. Must be used with the domainId parameter.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "list only resources belonging to the domain specified",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "updateDomain,createDomain,listDomains,listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "listFirewallRules,createFirewallRule,updateEgressFirewallRule",
+            "response": [
+                {
+                    "description": "the state of the rule",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the ending port of firewall rule's port range",
+                    "name": "endport",
+                    "type": "integer"
+                },
+                {
+                    "description": "error code for this icmp message",
+                    "name": "icmpcode",
+                    "type": "integer"
+                },
+                {
+                    "description": "the protocol of the firewall rule",
+                    "name": "protocol",
+                    "type": "string"
+                },
+                {
+                    "description": "the public ip address id for the firewall rule",
+                    "name": "ipaddressid",
+                    "type": "string"
+                },
+                {
+                    "description": "the network id of the firewall rule",
+                    "name": "networkid",
+                    "type": "string"
+                },
+                {
+                    "description": "type of the icmp message being sent",
+                    "name": "icmptype",
+                    "type": "integer"
+                },
+                {
+                    "description": "is rule for display to the regular user",
+                    "name": "fordisplay",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the ID of the firewall rule",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the starting port of firewall rule's port range",
+                    "name": "startport",
+                    "type": "integer"
+                },
+                {
+                    "description": "the list of resource tags associated with the rule",
+                    "name": "tags",
+                    "response": [
+                        {
+                            "description": "the ID of the domain associated with the tag",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "customer associated with the tag",
+                            "name": "customer",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain associated with the tag",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag key name",
+                            "name": "key",
+                            "type": "string"
+                        },
+                        {
+                            "description": "id of the resource",
+                            "name": "resourceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag value",
+                            "name": "value",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name where tag belongs to",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "resource type",
+                            "name": "resourcetype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account associated with the tag",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project id the tag belongs to",
+                            "name": "projectid",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "the public ip address for the firewall rule",
+                    "name": "ipaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the cidr list to forward traffic from",
+                    "name": "cidrlist",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Deletes traffic type of a physical network",
+            "isasync": true,
+            "name": "deleteTrafficType",
+            "params": [
+                {
+                    "description": "traffic type id",
+                    "length": 255,
+                    "name": "id",
+                    "related": "updateTrafficType,addTrafficType",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                },
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                }
+            ],
+            "since": "3.0.0"
+        },
+        {
+            "description": "Updates a region",
+            "isasync": false,
+            "name": "updateRegion",
+            "params": [
+                {
+                    "description": "updates region with this end point",
+                    "length": 255,
+                    "name": "endpoint",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "updates region with this name",
+                    "length": 255,
+                    "name": "name",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "Id of region to update",
+                    "length": 255,
+                    "name": "id",
+                    "required": true,
+                    "type": "integer"
+                }
+            ],
+            "related": "addRegion,listRegions",
+            "response": [
+                {
+                    "description": "the end point of the region",
+                    "name": "endpoint",
+                    "type": "string"
+                },
+                {
+                    "description": "true if security groups support is enabled, false otherwise",
+                    "name": "portableipserviceenabled",
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if GSLB service is enabled in the region, false otherwise",
+                    "name": "gslbserviceenabled",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the name of the region",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the region",
+                    "name": "id",
+                    "type": "integer"
+                }
+            ]
+        },
+        {
+            "description": "Lists clusters metrics",
+            "isasync": false,
+            "name": "listClustersMetrics",
+            "params": [
+                {
+                    "description": "lists clusters by the cluster ID",
+                    "length": 255,
+                    "name": "id",
+                    "related": "addCluster,updateCluster",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "flag to display the capacity of the clusters",
+                    "length": 255,
+                    "name": "showcapacities",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "whether this cluster is managed by cloudstack",
+                    "length": 255,
+                    "name": "managedstate",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "lists clusters by Pod ID",
+                    "length": 255,
+                    "name": "podid",
+                    "related": "listPods,updatePod",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "lists clusters by cluster type",
+                    "length": 255,
+                    "name": "clustertype",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "lists clusters by hypervisor type",
+                    "length": 255,
+                    "name": "hypervisor",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "lists clusters by Zone ID",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones,listZones,createZone,updateZone",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "lists clusters by allocation state",
+                    "length": 255,
+                    "name": "allocationstate",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "lists clusters by the cluster name",
+                    "length": 255,
+                    "name": "name",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the total cpu allocated in Ghz",
+                    "name": "cpuallocated",
+                    "type": "string"
+                },
+                {
+                    "description": "running / total hosts in the cluster",
+                    "name": "hosts",
+                    "type": "string"
+                },
+                {
+                    "description": "cpu usage disable threshold exceeded",
+                    "name": "cpudisablethreshold",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the maximum cpu deviation",
+                    "name": "cpumaxdeviation",
+                    "type": "string"
+                },
+                {
+                    "description": "the total cpu used in Ghz",
+                    "name": "cpuused",
+                    "type": "string"
+                },
+                {
+                    "description": "memory usage disable threshold exceeded",
+                    "name": "memorydisablethreshold",
+                    "type": "boolean"
+                },
+                {
+                    "description": "state of the cluster",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "cpu allocated disable threshold exceeded",
+                    "name": "cpuallocateddisablethreshold",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the maximum memory deviation",
+                    "name": "memorymaxdeviation",
+                    "type": "string"
+                },
+                {
+                    "description": "memory allocated notification threshold exceeded",
+                    "name": "memoryallocatedthreshold",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the total cpu allocated in GiB",
+                    "name": "memoryallocated",
+                    "type": "string"
+                },
+                {
+                    "description": "the total cpu capacity in GiB",
+                    "name": "memorytotal",
+                    "type": "string"
+                },
+                {
+                    "description": "cpu usage notification threshold exceeded",
+                    "name": "cputhreshold",
+                    "type": "boolean"
+                },
+                {
+                    "description": "cpu allocated notification threshold exceeded",
+                    "name": "cpuallocatedthreshold",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the total cpu capacity in Ghz",
+                    "name": "cputotal",
+                    "type": "string"
+                },
+                {
+                    "description": "memory usage notification threshold exceeded",
+                    "name": "memorythreshold",
+                    "type": "boolean"
+                },
+                {
+                    "description": "memory allocated disable threshold exceeded",
+                    "name": "memoryallocateddisablethreshold",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the total cpu used in GiB",
+                    "name": "memoryused",
+                    "type": "string"
+                }
+            ],
+            "since": "4.9.3"
+        },
+        {
+            "description": "Lists all LDAP configurations",
+            "isasync": false,
+            "name": "listLdapConfigurations",
+            "params": [
+                {
+                    "description": "Port",
+                    "length": 255,
+                    "name": "port",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "Hostname",
+                    "length": 255,
+                    "name": "hostname",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                }
+            ],
+            "related": "addLdapConfiguration,deleteLdapConfiguration",
+            "response": [
+                {
+                    "description": "hostname",
+                    "name": "hostname",
+                    "type": "string"
+                },
+                {
+                    "description": "port",
+                    "name": "port",
+                    "type": "int"
+                }
+            ],
+            "since": "4.2.0"
+        },
+        {
+            "description": "Lists secondary staging stores.",
+            "isasync": false,
+            "name": "listSecondaryStagingStores",
+            "params": [
+                {
+                    "description": "the name of the staging store",
+                    "length": 255,
+                    "name": "name",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "the ID of the staging store",
+                    "length": 255,
+                    "name": "id",
+                    "related": "addSecondaryStorage,addImageStoreS3,createSecondaryStagingStore,updateCloudToUseObjectStore,listSwifts,addImageStore,listSecondaryStagingStores,listImageStores",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the staging store protocol",
+                    "length": 255,
+                    "name": "protocol",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "the Zone ID for the staging store",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones,listZones,createZone,updateZone",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the staging store provider",
+                    "length": 255,
+                    "name": "provider",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "addSecondaryStorage,addImageStoreS3,createSecondaryStagingStore,updateCloudToUseObjectStore,listSwifts,addImageStore,listImageStores",
+            "response": [
+                {
+                    "description": "the protocol of the image store",
+                    "name": "protocol",
+                    "type": "string"
+                },
+                {
+                    "description": "the provider name of the image store",
+                    "name": "providername",
+                    "type": "string"
+                },
+                {
+                    "description": "the scope of the image store",
+                    "name": "scope",
+                    "type": "scopetype"
+                },
+                {
+                    "description": "the url of the image store",
+                    "name": "url",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the image store",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the details of the image store",
+                    "name": "details",
+                    "type": "set"
+                },
+                {
+                    "description": "the ID of the image store",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone ID of the image store",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone name of the image store",
+                    "name": "zonename",
+                    "type": "string"
+                }
+            ],
+            "since": "4.2.0"
+        },
+        {
+            "description": "Creates a l2tp/ipsec remote access vpn",
+            "isasync": true,
+            "name": "createRemoteAccessVpn",
+            "params": [
+                {
+                    "description": "an optional account for the VPN. Must be used with domainId.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "public ip address id of the vpn server",
+                    "length": 255,
+                    "name": "publicipid",
+                    "related": "associateIpAddress,restartNetwork,updateIpAddress,associateIpAddress,listPublicIpAddresses,listPublicIpAddresses",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the range of ip addresses to allocate to vpn clients. The first ip in the range will be taken by the vpn server",
+                    "length": 255,
+                    "name": "iprange",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "an optional field, whether to the display the vpn to the end user or not",
+                    "length": 255,
+                    "name": "fordisplay",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "boolean"
+                },
+                {
+                    "description": "an optional domainId for the VPN. If the account parameter is used, domainId must also be used.",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "updateDomain,createDomain,listDomains,listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "if true, firewall rule for source/end public port is automatically created; if false - firewall rule has to be created explicitely. Has value true by default",
+                    "length": 255,
+                    "name": "openfirewall",
+                    "required": false,
+                    "type": "boolean"
+                }
+            ],
+            "related": "updateRemoteAccessVpn,listRemoteAccessVpns",
+            "response": [
+                {
+                    "description": "the public ip address of the vpn server",
+                    "name": "publicipid",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the vpn",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ipsec preshared key",
+                    "name": "presharedkey",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain id of the account of the remote access vpn",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain name of the account of the remote access vpn",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "is vpn for display to the regular user",
+                    "name": "fordisplay",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the id of the remote access vpn",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the public ip address of the vpn server",
+                    "name": "publicip",
+                    "type": "string"
+                },
+                {
+                    "description": "the range of ips to allocate to the clients",
+                    "name": "iprange",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the vpn",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the account of the remote access vpn",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of the rule",
+                    "name": "state",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Changes the service offering for a virtual machine. The virtual machine must be in a \"Stopped\" state for this command to take effect.",
+            "isasync": false,
+            "name": "changeServiceForVirtualMachine",
+            "params": [
+                {
+                    "description": "the service offering ID to apply to the virtual machine",
+                    "length": 255,
+                    "name": "serviceofferingid",
+                    "related": "createServiceOffering,updateServiceOffering,listServiceOfferings",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "The ID of the virtual machine",
+                    "length": 255,
+                    "name": "id",
+                    "related": "updateVMAffinityGroup,rebootVirtualMachine,changeServiceForVirtualMachine,detachIso,resetSSHKeyForVirtualMachine,resetSSHKeyForVirtualMachine,migrateVirtualMachineWithVolume,attachIso,removeNicFromVirtualMachine,updateVirtualMachine,recoverVirtualMachine,migrateVirtualMachine,resetPasswordForVirtualMachine,revertToVMSnapshot,assignVirtualMachine,updateVMAffinityGroup,listVirtualMachines,rebootVirtualMachine,restoreVirtualMachine,destroyVirtualMachine,stopVirtualMachine,deployVirtualMachine,detachIso,deployVirtualMachine,updateDefaultNicForVirtualMachine,updateVirtualMachine,revertToVMSnapshot,addNicToVirtualMachine,tmDestroyVirtualMachine,resetPasswordForVirtualMachine,startVirtualMachine,updateDefaultNicForVirtualMachine,startVirtualMachine,updateVmNicIp,attachIso,listVirtualMachines,addNicToVirtualMachine,stopVirtualMachine,destroyVirtualMachine,removeNicFromVirtualMachine,changeServiceForVirtualMachine",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "name value pairs of custom parameters for cpu, memory and cpunumber. example details[i].name=value",
+                    "length": 255,
+                    "name": "details",
+                    "required": false,
+                    "type": "map"
+                }
+            ],
+            "related": "updateVMAffinityGroup,rebootVirtualMachine,detachIso,resetSSHKeyForVirtualMachine,resetSSHKeyForVirtualMachine,migrateVirtualMachineWithVolume,attachIso,removeNicFromVirtualMachine,updateVirtualMachine,recoverVirtualMachine,migrateVirtualMachine,resetPasswordForVirtualMachine,revertToVMSnapshot,assignVirtualMachine,updateVMAffinityGroup,listVirtualMachines,rebootVirtualMachine,restoreVirtualMachine,destroyVirtualMachine,stopVirtualMachine,deployVirtualMachine,detachIso,deployVirtualMachine,updateDefaultNicForVirtualMachine,updateVirtualMachine,revertToVMSnapshot,addNicToVirtualMachine,tmDestroyVirtualMachine,resetPasswordForVirtualMachine,startVirtualMachine,updateDefaultNicForVirtualMachine,startVirtualMachine,updateVmNicIp,attachIso,listVirtualMachines,addNicToVirtualMachine,stopVirtualMachine,destroyVirtualMachine,removeNicFromVirtualMachine,changeServiceForVirtualMachine",
+            "response": [
+                {
+                    "description": "OS type id of the vm",
+                    "name": "ostypeid",
+                    "type": "long"
+                },
+                {
+                    "description": "the name of the service offering of the virtual machine",
+                    "name": "serviceofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "the read (bytes) of disk on the vm",
+                    "name": "diskkbsread",
+                    "type": "long"
+                },
+                {
+                    "description": "the ID of the virtual machine",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the hypervisor on which the template runs",
+                    "name": "hypervisor",
+                    "type": "string"
+                },
+                {
+
+                },
+                {
+                    "description": "the name of the domain in which the virtual machine exists",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the number of cpu this virtual machine is running with",
+                    "name": "cpunumber",
+                    "type": "integer"
+                },
+                {
+                    "description": "the incoming network traffic on the vm",
+                    "name": "networkkbsread",
+                    "type": "long"
+                },
+                {
+                    "description": "the name of the virtual machine",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the password (if exists) of the virtual machine",
+                    "name": "password",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of nics associated with vm",
+                    "name": "nic",
+                    "response": [
+                        {
+                            "description": "the type of the nic",
+                            "name": "type",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if nic is default, false otherwise",
+                            "name": "isdefault",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "the ID of the corresponding network",
+                            "name": "networkid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the isolation uri of the nic",
+                            "name": "isolationuri",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ip address of the nic",
+                            "name": "ipaddress",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the IPv6 address of network",
+                            "name": "ip6address",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the NSX Logical Switch Port (if NSX based), null otherwise",
+                            "name": "nsxlogicalswitchport",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the cidr of IPv6 network",
+                            "name": "ip6cidr",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the nic",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the gateway of the nic",
+                            "name": "gateway",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the traffic type of the nic",
+                            "name": "traffictype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "device id for the network when plugged into the virtual machine",
+                            "name": "deviceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the vm to which the nic belongs",
+                            "name": "virtualmachineid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the gateway of IPv6 network",
+                            "name": "ip6gateway",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the Secondary ipv4 addr of nic",
+                            "name": "secondaryip",
+                            "type": "list"
+                        },
+                        {
+                            "description": "the name of the corresponding network",
+                            "name": "networkname",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the broadcast uri of the nic",
+                            "name": "broadcasturi",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the NSX Logical Switch (if NSX based), null otherwise",
+                            "name": "nsxlogicalswitch",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the netmask of the nic",
+                            "name": "netmask",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if nic is default, false otherwise",
+                            "name": "macaddress",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "the memory allocated for the virtual machine",
+                    "name": "memory",
+                    "type": "integer"
+                },
+                {
+                    "description": "an optional field whether to the display the vm to the end user or not.",
+                    "name": "displayvm",
+                    "type": "boolean"
+                },
+                {
+                    "description": " an alternate display text of the template for the virtual machine",
+                    "name": "templatedisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "the write (bytes) of disk on the vm",
+                    "name": "diskkbswrite",
+                    "type": "long"
+                },
+                {
+                    "description": "the date when this virtual machine was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "Vm details in key/value pairs.",
+                    "name": "details",
+                    "type": "map"
+                },
+                {
+                    "description": "the virtual network for the service offering",
+                    "name": "forvirtualnetwork",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the target memory in vm",
+                    "name": "memorytargetkbs",
+                    "type": "long"
+                },
+                {
+                    "description": "the name of the disk offering of the virtual machine",
+                    "name": "diskofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the disk offering of the virtual machine",
+                    "name": "diskofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the host for the virtual machine",
+                    "name": "hostid",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of the virtual machine",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the template for the virtual machine",
+                    "name": "templatename",
+                    "type": "string"
+                },
+                {
+                    "description": "the internal memory thats free in vm",
+                    "name": "memoryintfreekbs",
+                    "type": "long"
+                },
+                {
+                    "description": "true if the password rest feature is enabled, false otherwise",
+                    "name": "passwordenabled",
+                    "type": "boolean"
+                },
+                {
+                    "description": "device ID of the root volume",
+                    "name": "rootdeviceid",
+                    "type": "long"
+                },
+                {
+                    "description": "the ID of the domain in which the virtual machine exists",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "public IP address id associated with vm via Static nat rule",
+                    "name": "publicipid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the availability zone for the virtual machine",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "an alternate display text of the ISO attached to the virtual machine",
+                    "name": "isodisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "the amount of the vm's CPU currently used",
+                    "name": "cpuused",
+                    "type": "string"
+                },
+                {
+                    "description": "the write (io) of disk on the vm",
+                    "name": "diskiowrite",
+                    "type": "long"
+                },
+                {
+                    "description": "true if vm contains XS/VMWare tools inorder to support dynamic scaling of VM cpu/memory.",
+                    "name": "isdynamicallyscalable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the group name of the virtual machine",
+                    "name": "group",
+                    "type": "string"
+                },
+                {
+                    "description": "the read (io) of disk on the vm",
+                    "name": "diskioread",
+                    "type": "long"
+                },
+                {
+                    "description": "the group ID of the virtual machine",
+                    "name": "groupid",
+                    "type": "string"
+                },
+                {
+                    "description": "ssh key-pair",
+                    "name": "keypair",
+                    "type": "string"
+                },
+                {
+                    "description": "list of affinity groups associated with the virtual machine",
+                    "name": "affinitygroup",
+                    "response": [
+                        {
+                            "description": "the account owning the affinity group",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the type of the affinity group",
+                            "name": "type",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the affinity group",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the description of the affinity group",
+                            "name": "description",
+                            "type": "string"
+                        },
+                        {
+                            "description": "virtual machine IDs associated with this affinity group",
+                            "name": "virtualmachineIds",
+                            "type": "list"
+                        },
+                        {
+                            "description": "the domain ID of the affinity group",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name of the affinity group",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the name of the affinity group",
+                            "name": "name",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain name of the affinity group",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project ID of the affinity group",
+                            "name": "projectid",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "State of the Service from LB rule",
+                    "name": "servicestate",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the ISO attached to the virtual machine",
+                    "name": "isoid",
+                    "type": "string"
+                },
+                {
+                    "description": "the account associated with the virtual machine",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the availablility zone for the virtual machine",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the template for the virtual machine. A -1 is returned if the virtual machine was created from an ISO file.",
+                    "name": "templateid",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the vm",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the vm",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the outgoing network traffic on the host",
+                    "name": "networkkbswrite",
+                    "type": "long"
+                },
+                {
+                    "description": "the vgpu type used by the virtual machine",
+                    "name": "vgpu",
+                    "type": "string"
+                },
+                {
+                    "description": "public IP address id associated with vm via Static nat rule",
+                    "name": "publicip",
+                    "type": "string"
+                },
+                {
+                    "description": "instance name of the user vm; this parameter is returned to the ROOT admin only",
+                    "name": "instancename",
+                    "type": "string"
+                },
+                {
+                    "description": "the user's name who deployed the virtual machine",
+                    "name": "username",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the ISO attached to the virtual machine",
+                    "name": "isoname",
+                    "type": "string"
+                },
+                {
+                    "description": "Os type ID of the virtual machine",
+                    "name": "guestosid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the host for the virtual machine",
+                    "name": "hostname",
+                    "type": "string"
+                },
+                {
+                    "description": "device type of the root volume",
+                    "name": "rootdevicetype",
+                    "type": "string"
+                },
+                {
+                    "description": "user generated name. The name of the virtual machine is returned if no displayname exists.",
+                    "name": "displayname",
+                    "type": "string"
+                },
+                {
+                    "description": "the memory used by the vm",
+                    "name": "memorykbs",
+                    "type": "long"
+                },
+                {
+                    "description": "the speed of each cpu",
+                    "name": "cpuspeed",
+                    "type": "integer"
+                },
+                {
+                    "description": "the ID of the service offering of the virtual machine",
+                    "name": "serviceofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "the user's ID who deployed the virtual machine",
+                    "name": "userid",
+                    "type": "string"
+                },
+                {
+                    "description": "list of security groups associated with the virtual machine",
+                    "name": "securitygroup",
+                    "response": [
+                        {
+                            "description": "the project id of the group",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain ID of the security group",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of resource tags associated with the rule",
+                            "name": "tags",
+                            "response": [
+                                {
+                                    "description": "the domain associated with the tag",
+                                    "name": "domain",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "customer associated with the tag",
+                                    "name": "customer",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "tag value",
+                                    "name": "value",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the project id the tag belongs to",
+                                    "name": "projectid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "id of the resource",
+                                    "name": "resourceid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "tag key name",
+                                    "name": "key",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "resource type",
+                                    "name": "resourcetype",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the account associated with the tag",
+                                    "name": "account",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the project name where tag belongs to",
+                                    "name": "project",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the ID of the domain associated with the tag",
+                                    "name": "domainid",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "set"
+                        },
+                        {
+                            "description": "the description of the security group",
+                            "name": "description",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of ingress rules associated with the security group",
+                            "name": "ingressrule",
+                            "response": [
+                                {
+                                    "description": "the ending IP of the security group rule ",
+                                    "name": "endport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the list of resource tags associated with the rule",
+                                    "name": "tags",
+                                    "response": [
+                                        {
+                                            "description": "the ID of the domain associated with the tag",
+                                            "name": "domainid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "resource type",
+                                            "name": "resourcetype",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "customer associated with the tag",
+                                            "name": "customer",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag value",
+                                            "name": "value",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the account associated with the tag",
+                                            "name": "account",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag key name",
+                                            "name": "key",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project name where tag belongs to",
+                                            "name": "project",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the domain associated with the tag",
+                                            "name": "domain",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project id the tag belongs to",
+                                            "name": "projectid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "id of the resource",
+                                            "name": "resourceid",
+                                            "type": "string"
+                                        }
+                                    ],
+                                    "type": "set"
+                                },
+                                {
+                                    "description": "the starting IP of the security group rule",
+                                    "name": "startport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the id of the security group rule",
+                                    "name": "ruleid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the protocol of the security group rule",
+                                    "name": "protocol",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the code for the ICMP message response",
+                                    "name": "icmpcode",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the CIDR notation for the base IP address of the security group rule",
+                                    "name": "cidr",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the type of the ICMP message response",
+                                    "name": "icmptype",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "security group name",
+                                    "name": "securitygroupname",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "account owning the security group rule",
+                                    "name": "account",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "set"
+                        },
+                        {
+                            "description": "the account owning the security group",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of egress rules associated with the security group",
+                            "name": "egressrule",
+                            "response": [
+                                {
+                                    "description": "the id of the security group rule",
+                                    "name": "ruleid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the starting IP of the security group rule",
+                                    "name": "startport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the protocol of the security group rule",
+                                    "name": "protocol",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the list of resource tags associated with the rule",
+                                    "name": "tags",
+                                    "response": [
+                                        {
+                                            "description": "the ID of the domain associated with the tag",
+                                            "name": "domainid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag value",
+                                            "name": "value",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "resource type",
+                                            "name": "resourcetype",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "id of the resource",
+                                            "name": "resourceid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "customer associated with the tag",
+                                            "name": "customer",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project name where tag belongs to",
+                                            "name": "project",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the account associated with the tag",
+                                            "name": "account",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project id the tag belongs to",
+                                            "name": "projectid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the domain associated with the tag",
+                                            "name": "domain",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag key name",
+                                            "name": "key",
+                                            "type": "string"
+                                        }
+                                    ],
+                                    "type": "set"
+                                },
+                                {
+                                    "description": "the code for the ICMP message response",
+                                    "name": "icmpcode",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "security group name",
+                                    "name": "securitygroupname",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the CIDR notation for the base IP address of the security group rule",
+                                    "name": "cidr",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the ending IP of the security group rule ",
+                                    "name": "endport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "account owning the security group rule",
+                                    "name": "account",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the type of the ICMP message response",
+                                    "name": "icmptype",
+                                    "type": "integer"
+                                }
+                            ],
+                            "type": "set"
+                        },
+                        {
+                            "description": "the project name of the group",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of virtualmachine ids associated with this securitygroup",
+                            "name": "virtualmachineids",
+                            "type": "set"
+                        },
+                        {
+                            "description": "the name of the security group",
+                            "name": "name",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the number of virtualmachines associated with this securitygroup",
+                            "name": "virtualmachinecount",
+                            "type": "integer"
+                        },
+                        {
+                            "description": "the ID of the security group",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain name of the security group",
+                            "name": "domain",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "true if high-availability is enabled, false otherwise",
+                    "name": "haenable",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "Starts a router.",
+            "isasync": true,
+            "name": "startRouter",
+            "params": [
+                {
+                    "description": "the ID of the router",
+                    "length": 255,
+                    "name": "id",
+                    "related": "stopInternalLoadBalancerVM,listInternalLoadBalancerVMs,changeServiceForRouter,rebootRouter,destroyRouter,startInternalLoadBalancerVM,startRouter,listRouters",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "stopInternalLoadBalancerVM,listInternalLoadBalancerVMs,changeServiceForRouter,rebootRouter,destroyRouter,startInternalLoadBalancerVM,listRouters",
+            "response": [
+                {
+                    "description": "the hypervisor on which the template runs",
+                    "name": "hypervisor",
+                    "type": "string"
+                },
+                {
+                    "description": "the link local netmask for the router",
+                    "name": "linklocalnetmask",
+                    "type": "string"
+                },
+                {
+                    "description": "the guest MAC address for the router",
+                    "name": "guestmacaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the corresponding guest network",
+                    "name": "guestnetworkname",
+                    "type": "string"
+                },
+                {
+                    "description": "the account associated with the router",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of VPC the router belongs to",
+                    "name": "vpcname",
+                    "type": "string"
+                },
+                {
+                    "description": "true if the router template requires upgrader",
+                    "name": "requiresupgrade",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the ID of the corresponding link local network",
+                    "name": "linklocalnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "VPC the router belongs to",
+                    "name": "vpcid",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of nics associated with the router",
+                    "name": "nic",
+                    "response": [
+                        {
+                            "description": "the broadcast uri of the nic",
+                            "name": "broadcasturi",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the traffic type of the nic",
+                            "name": "traffictype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "device id for the network when plugged into the virtual machine",
+                            "name": "deviceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the gateway of the nic",
+                            "name": "gateway",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the NSX Logical Switch (if NSX based), null otherwise",
+                            "name": "nsxlogicalswitch",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the Secondary ipv4 addr of nic",
+                            "name": "secondaryip",
+                            "type": "list"
+                        },
+                        {
+                            "description": "the type of the nic",
+                            "name": "type",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the vm to which the nic belongs",
+                            "name": "virtualmachineid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ip address of the nic",
+                            "name": "ipaddress",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the nic",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the gateway of IPv6 network",
+                            "name": "ip6gateway",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the isolation uri of the nic",
+                            "name": "isolationuri",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the NSX Logical Switch Port (if NSX based), null otherwise",
+                            "name": "nsxlogicalswitchport",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the corresponding network",
+                            "name": "networkid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if nic is default, false otherwise",
+                            "name": "isdefault",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "the netmask of the nic",
+                            "name": "netmask",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the IPv6 address of network",
+                            "name": "ip6address",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if nic is default, false otherwise",
+                            "name": "macaddress",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the name of the corresponding network",
+                            "name": "networkname",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the cidr of IPv6 network",
+                            "name": "ip6cidr",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "the ID of the corresponding public network",
+                    "name": "publicnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the service offering of the virtual machine",
+                    "name": "serviceofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "the Pod ID for the router",
+                    "name": "podid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the router",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the version of scripts",
+                    "name": "scriptsversion",
+                    "type": "string"
+                },
+                {
+                    "description": "the public IP address for the router",
+                    "name": "publicip",
+                    "type": "string"
+                },
+                {
+                    "description": "the second DNS for the router",
+                    "name": "dns2",
+                    "type": "string"
+                },
+                {
+                    "description": "the first IPv6 DNS for the router",
+                    "name": "ip6dns1",
+                    "type": "string"
+                },
+                {
+                    "description": "the template ID for the router",
+                    "name": "templateid",
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone ID for the router",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the id of the router",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the second IPv6 DNS for the router",
+                    "name": "ip6dns2",
+                    "type": "string"
+                },
+                {
+                    "description": "the link local IP address for the router",
+                    "name": "linklocalip",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the address",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the gateway for the router",
+                    "name": "gateway",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the service offering of the virtual machine",
+                    "name": "serviceofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "if this router is an redundant virtual router",
+                    "name": "isredundantrouter",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the version of template",
+                    "name": "version",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the corresponding guest network",
+                    "name": "guestnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "the network domain for the router",
+                    "name": "networkdomain",
+                    "type": "string"
+                },
+                {
+                    "description": "the hostname for the router",
+                    "name": "hostname",
+                    "type": "string"
+                },
+                {
+                    "description": "the guest netmask for the router",
+                    "name": "guestnetmask",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain associated with the router",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the ipaddress",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the link local MAC address for the router",
+                    "name": "linklocalmacaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain ID associated with the router",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the host ID for the router",
+                    "name": "hostid",
+                    "type": "string"
+                },
+                {
+                    "description": "the public MAC address for the router",
+                    "name": "publicmacaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "role of the domain router",
+                    "name": "role",
+                    "type": "string"
+                },
+                {
+                    "description": "the guest IP address for the router",
+                    "name": "guestipaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the first DNS for the router",
+                    "name": "dns1",
+                    "type": "string"
+                },
+                {
+                    "description": "the date and time the router was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the state of the router",
+                    "name": "state",
+                    "type": "state"
+                },
+                {
+                    "description": "the public netmask for the router",
+                    "name": "publicnetmask",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of redundant virtual router",
+                    "name": "redundantstate",
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone name for the router",
+                    "name": "zonename",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Lists all available OS mappings for given hypervisor",
+            "isasync": false,
+            "name": "listGuestOsMapping",
+            "params": [
+                {
+                    "description": "list Guest OS mapping by hypervisor",
+                    "length": 255,
+                    "name": "hypervisor",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "list mapping by Guest OS Type UUID",
+                    "length": 255,
+                    "name": "ostypeid",
+                    "related": "addGuestOs,listOsTypes",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "list mapping by its UUID",
+                    "length": 255,
+                    "name": "id",
+                    "related": "listGuestOsMapping,updateGuestOsMapping,addGuestOsMapping",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "list Guest OS mapping by hypervisor version. Must be used with hypervisor parameter",
+                    "length": 255,
+                    "name": "hypervisorversion",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "updateGuestOsMapping,addGuestOsMapping",
+            "response": [
+                {
+                    "description": "version of the hypervisor for mapping",
+                    "name": "hypervisorversion",
+                    "type": "string"
+                },
+                {
+                    "description": "hypervisor specific name for the Guest OS",
+                    "name": "osnameforhypervisor",
+                    "type": "string"
+                },
+                {
+                    "description": "the hypervisor",
+                    "name": "hypervisor",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the Guest OS mapping",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "is the mapping user defined",
+                    "name": "isuserdefined",
+                    "type": "string"
+                },
+                {
+                    "description": "standard display name for the Guest OS",
+                    "name": "osdisplayname",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the Guest OS type",
+                    "name": "ostypeid",
+                    "type": "string"
+                }
+            ],
+            "since": "4.4.0"
+        },
+        {
+            "description": "List all public, private, and privileged templates.",
+            "isasync": false,
+            "name": "listTemplates",
+            "params": [
+                {
+                    "description": "list only resources belonging to the domain specified",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "updateDomain,createDomain,listDomains,listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the template name",
+                    "length": 255,
+                    "name": "name",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "the template ID",
+                    "length": 255,
+                    "name": "id",
+                    "related": "copyTemplate,registerTemplate,listIsos,copyTemplate,listTemplates,registerTemplate,listTemplates,createTemplate,registerIso,registerIso,prepareTemplate,updateIso,listIsos,updateTemplate,createTemplate,copyIso",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "List resources by tags (key/value pairs)",
+                    "length": 255,
+                    "name": "tags",
+                    "required": false,
+                    "type": "map"
+                },
+                {
+                    "description": "show removed templates as well",
+                    "length": 255,
+                    "name": "showremoved",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "list objects by project",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "listProjectAccounts,suspendProject,activateProject,updateProject,createProject,listProjects",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the IDs of the templates, mutually exclusive with id",
+                    "length": 255,
+                    "name": "ids",
+                    "related": "copyTemplate,registerTemplate,listIsos,copyTemplate,listTemplates,registerTemplate,listTemplates,createTemplate,registerIso,registerIso,prepareTemplate,updateIso,listIsos,updateTemplate,createTemplate,copyIso",
+                    "required": false,
+                    "since": "4.9",
+                    "type": "list"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "list resources by account. Must be used with the domainId parameter.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "If set to false, list only resources belonging to the command's caller; if set to true - list resources that the caller is authorized to see. Default value is false",
+                    "length": 255,
+                    "name": "listall",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "list templates by zoneId",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones,listZones,createZone,updateZone",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.",
+                    "length": 255,
+                    "name": "isrecursive",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "the hypervisor for which to restrict the search",
+                    "length": 255,
+                    "name": "hypervisor",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "possible values are \"featured\", \"self\", \"selfexecutable\",\"sharedexecutable\",\"executable\", and \"community\". * featured : templates that have been marked as featured and public. * self : templates that have been registered or created by the calling user. * selfexecutable : same as self, but only returns templates that can be used to deploy a new VM. * sharedexecutable : templates ready to be deployed that have been granted to the calling user by another user. * executable : templates that are owned by the calling user, or public templates, that can be used to deploy a VM. * community : templates that have been marked as public but not featured. * all : all templates (only usable by admins).",
+                    "length": 255,
+                    "name": "templatefilter",
+                    "required": true,
+                    "type": "string"
+                }
+            ],
+            "related": "copyTemplate,registerTemplate,listIsos,copyTemplate,registerTemplate,listTemplates,createTemplate,registerIso,registerIso,prepareTemplate,updateIso,listIsos,updateTemplate,createTemplate,copyIso",
+            "response": [
+                {
+                    "description": "the ID of the domain to which the template belongs",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the template",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the tag of this template",
+                    "name": "templatetag",
+                    "type": "string"
+                },
+                {
+                    "description": "the date this template was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the template name",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "true if this template is a public template, false otherwise",
+                    "name": "ispublic",
+                    "type": "boolean"
+                },
+                {
+                    "description": "checksum of the template",
+                    "name": "checksum",
+                    "type": "string"
+                },
+                {
+                    "description": "the date this template was removed",
+                    "name": "removed",
+                    "type": "date"
+                },
+                {
+                    "description": "the hypervisor on which the template runs",
+                    "name": "hypervisor",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the secondary storage host for the template",
+                    "name": "hostname",
+                    "type": "string"
+                },
+                {
+                    "description": "the template ID of the parent template if present",
+                    "name": "sourcetemplateid",
+                    "type": "string"
+                },
+                {
+                    "description": "additional key/value details tied with template",
+                    "name": "details",
+                    "type": "map"
+                },
+                {
+                    "description": "true if the reset password feature is enabled, false otherwise",
+                    "name": "passwordenabled",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the size of the template",
+                    "name": "size",
+                    "type": "long"
+                },
+                {
+                    "description": "true if template is sshkey enabled, false otherwise",
+                    "name": "sshkeyenabled",
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if template contains XS/VMWare tools inorder to support dynamic scaling of VM cpu/memory",
+                    "name": "isdynamicallyscalable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the name of the zone for this template",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the template display text",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "the format of the template.",
+                    "name": "format",
+                    "type": "imageformat"
+                },
+                {
+                    "description": "the type of the template",
+                    "name": "templatetype",
+                    "type": "string"
+                },
+                {
+                    "description": "the account id to which the template belongs",
+                    "name": "accountid",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the template",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "true if the ISO is bootable, false otherwise",
+                    "name": "bootable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if the template is managed across all Zones, false otherwise",
+                    "name": "crossZones",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the name of the OS type for this template.",
+                    "name": "ostypename",
+                    "type": "string"
+                },
+                {
+                    "description": "the account name to which the template belongs",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the template ID",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the domain to which the template belongs",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the zone for this template",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the secondary storage host for the template",
+                    "name": "hostid",
+                    "type": "string"
+                },
+                {
+                    "description": "the status of the template",
+                    "name": "status",
+                    "type": "string"
+                },
+                {
+                    "description": "true if this template is a featured template, false otherwise",
+                    "name": "isfeatured",
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if the template is extractable, false otherwise",
+                    "name": "isextractable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if the template is ready to be deployed from, false otherwise.",
+                    "name": "isready",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the ID of the OS type for this template.",
+                    "name": "ostypeid",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Removes stratosphere ssp server",
+            "isasync": false,
+            "name": "deleteStratosphereSsp",
+            "params": [
+                {
+                    "description": "the host ID of ssp server",
+                    "length": 255,
+                    "name": "hostid",
+                    "related": "addBaremetalHost,listExternalLoadBalancers,prepareHostForMaintenance,reconnectHost,addHost,cancelHostMaintenance",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "Creates an autoscale policy for a provision or deprovision action, the action is taken when the all the conditions evaluates to true for the specified duration. The policy is in effect once it is attached to a autscale vm group.",
+            "isasync": true,
+            "name": "createAutoScalePolicy",
+            "params": [
+                {
+                    "description": "the duration for which the conditions have to be true before action is taken",
+                    "length": 255,
+                    "name": "duration",
+                    "required": true,
+                    "type": "integer"
+                },
+                {
+                    "description": "the list of IDs of the conditions that are being evaluated on every interval",
+                    "length": 255,
+                    "name": "conditionids",
+                    "related": "createCondition,listConditions",
+                    "required": true,
+                    "type": "list"
+                },
+                {
+                    "description": "the action to be executed if all the conditions evaluate to true for the specified duration.",
+                    "length": 255,
+                    "name": "action",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the cool down period for which the policy should not be evaluated after the action has been taken",
+                    "length": 255,
+                    "name": "quiettime",
+                    "required": false,
+                    "type": "integer"
+                }
+            ],
+            "related": "updateAutoScalePolicy,listAutoScalePolicies",
+            "response": [
+                {
+                    "description": "the account owning the autoscale policy",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id autoscale policy",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the autoscale policy ID",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain ID of the autoscale policy",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the cool down period for which the policy should not be evaluated after the action has been taken",
+                    "name": "quiettime",
+                    "type": "integer"
+                },
+                {
+                    "description": "the list of IDs of the conditions that are being evaluated on every interval",
+                    "name": "conditions",
+                    "type": "list"
+                },
+                {
+                    "description": "the action to be executed if all the conditions evaluate to true for the specified duration.",
+                    "name": "action",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the autoscale policy",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain name of the autoscale policy",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the duration for which the conditions have to be true before action is taken",
+                    "name": "duration",
+                    "type": "integer"
+                }
+            ]
+        },
+        {
+            "description": "Lists physical networks",
+            "isasync": false,
+            "name": "listPhysicalNetworks",
+            "params": [
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "search by name",
+                    "length": 255,
+                    "name": "name",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "list physical network by id",
+                    "length": 255,
+                    "name": "id",
+                    "related": "updatePhysicalNetwork,createPhysicalNetwork,listPhysicalNetworks",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the Zone ID for the physical network",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones,listZones,createZone,updateZone",
+                    "required": false,
+                    "type": "uuid"
+                }
+            ],
+            "related": "updatePhysicalNetwork,createPhysicalNetwork",
+            "response": [
+                {
+                    "description": "the vlan of the physical network",
+                    "name": "vlan",
+                    "type": "string"
+                },
+                {
+                    "description": "zone id of the physical network",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "state of the physical network",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the speed of the physical network",
+                    "name": "networkspeed",
+                    "type": "string"
+                },
+                {
+                    "description": "isolation methods",
+                    "name": "isolationmethods",
+                    "type": "string"
+                },
+                {
+                    "description": "comma separated tag",
+                    "name": "tags",
+                    "type": "string"
+                },
+                {
+                    "description": "Broadcast domain range of the physical network",
+                    "name": "broadcastdomainrange",
+                    "type": "string"
+                },
+                {
+                    "description": "the uuid of the physical network",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain id of the physical network owner",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "name of the physical network",
+                    "name": "name",
+                    "type": "string"
+                }
+            ],
+            "since": "3.0.0"
+        },
+        {
+            "description": "Lists all firewall rules for an IP address.",
+            "isasync": false,
+            "name": "listFirewallRules",
+            "params": [
+                {
+                    "description": "list only resources belonging to the domain specified",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "updateDomain,createDomain,listDomains,listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "List resources by tags (key/value pairs)",
+                    "length": 255,
+                    "name": "tags",
+                    "required": false,
+                    "type": "map"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "list resources by display flag; only ROOT admin is eligible to pass this parameter",
+                    "length": 255,
+                    "name": "fordisplay",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "boolean"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "If set to false, list only resources belonging to the command's caller; if set to true - list resources that the caller is authorized to see. Default value is false",
+                    "length": 255,
+                    "name": "listall",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "list objects by project",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "listProjectAccounts,suspendProject,activateProject,updateProject,createProject,listProjects",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list firewall rules for certain network",
+                    "length": 255,
+                    "name": "networkid",
+                    "related": "createNetwork,updateNetwork,listSrxFirewallNetworks,updateNetwork,listBrocadeVcsDeviceNetworks,listNiciraNvpDeviceNetworks,createNetwork,listNetworks,listNetscalerLoadBalancerNetworks,listF5LoadBalancerNetworks,listPaloAltoFirewallNetworks",
+                    "required": false,
+                    "since": "4.3",
+                    "type": "uuid"
+                },
+                {
+                    "description": "list resources by account. Must be used with the domainId parameter.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of IP address of the firewall services",
+                    "length": 255,
+                    "name": "ipaddressid",
+                    "related": "associateIpAddress,restartNetwork,updateIpAddress,associateIpAddress,listPublicIpAddresses,listPublicIpAddresses",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "Lists rule with the specified ID.",
+                    "length": 255,
+                    "name": "id",
+                    "related": "listIpForwardingRules,createIpForwardingRule,updatePortForwardingRule,createPortForwardingRule,listPortForwardingRules",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.",
+                    "length": 255,
+                    "name": "isrecursive",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                }
+            ],
+            "related": "createFirewallRule,updateEgressFirewallRule",
+            "response": [
+                {
+                    "description": "the protocol of the firewall rule",
+                    "name": "protocol",
+                    "type": "string"
+                },
+                {
+                    "description": "the public ip address id for the firewall rule",
+                    "name": "ipaddressid",
+                    "type": "string"
+                },
+                {
+                    "description": "the network id of the firewall rule",
+                    "name": "networkid",
+                    "type": "string"
+                },
+                {
+                    "description": "is rule for display to the regular user",
+                    "name": "fordisplay",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the cidr list to forward traffic from",
+                    "name": "cidrlist",
+                    "type": "string"
+                },
+                {
+                    "description": "the starting port of firewall rule's port range",
+                    "name": "startport",
+                    "type": "integer"
+                },
+                {
+                    "description": "the state of the rule",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the firewall rule",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the ending port of firewall rule's port range",
+                    "name": "endport",
+                    "type": "integer"
+                },
+                {
+                    "description": "the public ip address for the firewall rule",
+                    "name": "ipaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "error code for this icmp message",
+                    "name": "icmpcode",
+                    "type": "integer"
+                },
+                {
+                    "description": "the list of resource tags associated with the rule",
+                    "name": "tags",
+                    "response": [
+                        {
+                            "description": "customer associated with the tag",
+                            "name": "customer",
+                            "type": "string"
+                        },
+                        {
+                            "description": "resource type",
+                            "name": "resourcetype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account associated with the tag",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the domain associated with the tag",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "id of the resource",
+                            "name": "resourceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag value",
+                            "name": "value",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project id the tag belongs to",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag key name",
+                            "name": "key",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name where tag belongs to",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain associated with the tag",
+                            "name": "domain",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "type of the icmp message being sent",
+                    "name": "icmptype",
+                    "type": "integer"
+                }
+            ]
+        },
+        {
+            "description": " delete a Brocade VCS Switch",
+            "isasync": true,
+            "name": "deleteBrocadeVcsDevice",
+            "params": [
+                {
+                    "description": "Brocade Switch ID",
+                    "length": 255,
+                    "name": "vcsdeviceid",
+                    "related": "addBrocadeVcsDevice,listBrocadeVcsDevices",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "Cleanups VM reservations in the database.",
+            "isasync": true,
+            "name": "cleanVMReservations",
+            "params": [
+
+            ],
+            "response": [
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "Extracts an ISO",
+            "isasync": true,
+            "name": "extractIso",
+            "params": [
+                {
+                    "description": "the ID of the ISO file",
+                    "length": 255,
+                    "name": "id",
+                    "related": "copyTemplate,registerTemplate,listIsos,copyTemplate,registerTemplate,listTemplates,createTemplate,registerIso,registerIso,prepareTemplate,updateIso,listIsos,updateTemplate,createTemplate,copyIso",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the URL to which the ISO would be extracted",
+                    "length": 2048,
+                    "name": "url",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the mode of extraction - HTTP_DOWNLOAD or FTP_UPLOAD",
+                    "length": 255,
+                    "name": "mode",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the zone where the ISO is originally located",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones,listZones,createZone,updateZone",
+                    "required": false,
+                    "type": "uuid"
+                }
+            ],
+            "related": "extractVolume,extractTemplate",
+            "response": [
+                {
+                    "description": "if mode = upload then url of the uploaded entity. if mode = download the url from which the entity can be downloaded",
+                    "name": "url",
+                    "type": "string"
+                },
+                {
+
+                },
+                {
+                    "description": "the time and date the object was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "zone ID the object was extracted from",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the status of the extraction",
+                    "name": "status",
+                    "type": "string"
+                },
+                {
+                    "description": "the account id to which the extracted object belongs",
+                    "name": "accountid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the extracted object",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of the extracted object",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "zone name the object was extracted from",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the id of extracted object",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the percentage of the entity uploaded to the specified location",
+                    "name": "uploadpercentage",
+                    "type": "integer"
+                },
+                {
+                    "description": "",
+                    "name": "resultstring",
+                    "type": "string"
+                },
+                {
+                    "description": "the mode of extraction - upload or download",
+                    "name": "extractMode",
+                    "type": "string"
+                },
+                {
+                    "description": "type of the storage",
+                    "name": "storagetype",
+                    "type": "string"
+                },
+                {
+                    "description": "the upload id of extracted object",
+                    "name": "extractId",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "create secondary staging store.",
+            "isasync": false,
+            "name": "createSecondaryStagingStore",
+            "params": [
+                {
+                    "description": "the details for the staging store",
+                    "length": 255,
+                    "name": "details",
+                    "required": false,
+                    "type": "map"
+                },
+                {
+                    "description": "the URL for the staging store",
+                    "length": 2048,
+                    "name": "url",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the scope of the staging store: zone only for now",
+                    "length": 255,
+                    "name": "scope",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the staging store provider name",
+                    "length": 255,
+                    "name": "provider",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone ID for the staging store",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones,listZones,createZone,updateZone",
+                    "required": false,
+                    "type": "uuid"
+                }
+            ],
+            "related": "addSecondaryStorage,addImageStoreS3,updateCloudToUseObjectStore,listSwifts,addImageStore,listImageStores",
+            "response": [
+                {
+                    "description": "the Zone name of the image store",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the image store",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the details of the image store",
+                    "name": "details",
+                    "type": "set"
+                },
+                {
+                    "description": "the protocol of the image store",
+                    "name": "protocol",
+                    "type": "string"
+                },
+                {
+                    "description": "the provider name of the image store",
+                    "name": "providername",
+                    "type": "string"
+                },
+                {
+                    "description": "the scope of the image store",
+                    "name": "scope",
+                    "type": "scopetype"
+                },
+                {
+                    "description": "the name of the image store",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the url of the image store",
+                    "name": "url",
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone ID of the image store",
+                    "name": "zoneid",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Creates an affinity/anti-affinity group",
+            "isasync": true,
+            "name": "createAffinityGroup",
+            "params": [
+                {
+                    "description": "optional description of the affinity group",
+                    "length": 255,
+                    "name": "description",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "Type of the affinity group from the available affinity/anti-affinity group types",
+                    "length": 255,
+                    "name": "type",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "create affinity group for project",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "listProjectAccounts,suspendProject,activateProject,updateProject,createProject,listProjects",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "domainId of the account owning the affinity group",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "updateDomain,createDomain,listDomains,listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "name of the affinity group",
+                    "length": 255,
+                    "name": "name",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "an account for the affinity group. Must be used with domainId.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the ID of the affinity group",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain ID of the affinity group",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "virtual machine IDs associated with this affinity group",
+                    "name": "virtualmachineIds",
+                    "type": "list"
+                },
+                {
+                    "description": "the project ID of the affinity group",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the affinity group",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the affinity group",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the account owning the affinity group",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the description of the affinity group",
+                    "name": "description",
+                    "type": "string"
+                },
+                {
+                    "description": "the type of the affinity group",
+                    "name": "type",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain name of the affinity group",
+                    "name": "domain",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Remove a VMware datacenter from a zone.",
+            "isasync": false,
+            "name": "removeVmwareDc",
+            "params": [
+                {
+                    "description": "The id of Zone from which VMware datacenter has to be removed.",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones,listZones,createZone,updateZone",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                },
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Lists all available Internal Load Balancer elements.",
+            "isasync": false,
+            "name": "listInternalLoadBalancerElements",
+            "params": [
+                {
+                    "description": "list internal load balancer elements by id",
+                    "length": 255,
+                    "name": "id",
+                    "related": "listInternalLoadBalancerElements,configureInternalLoadBalancerElement,createInternalLoadBalancerElement",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list internal load balancer elements by enabled state",
+                    "length": 255,
+                    "name": "enabled",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "list internal load balancer elements by network service provider id",
+                    "length": 255,
+                    "name": "nspid",
+                    "related": "updateNetworkServiceProvider,addNetworkServiceProvider,listNetworkServiceProviders,listTrafficTypes",
+                    "required": false,
+                    "type": "uuid"
+                }
+            ],
+            "related": "configureInternalLoadBalancerElement,createInternalLoadBalancerElement",
+            "response": [
+                {
+                    "description": "the id of the internal load balancer element",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the physical network service provider id of the element",
+                    "name": "nspid",
+                    "type": "string"
+                },
+                {
+                    "description": "Enabled/Disabled the element",
+                    "name": "enabled",
+                    "type": "boolean"
+                }
+            ],
+            "since": "4.2.0"
+        },
+        {
+            "description": "Updates load balancer health check policy",
+            "isasync": true,
+            "name": "updateLBHealthCheckPolicy",
+            "params": [
+                {
+                    "description": "ID of load balancer health check policy",
+                    "length": 255,
+                    "name": "id",
+                    "related": "listLBHealthCheckPolicies,updateLBHealthCheckPolicy,createLBHealthCheckPolicy",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "an optional field, in case you want to set a custom id to the resource. Allowed to Root Admins only",
+                    "length": 255,
+                    "name": "customid",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "string"
+                },
+                {
+                    "description": "an optional field, whether to the display the policy to the end user or not",
+                    "length": 255,
+                    "name": "fordisplay",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "boolean"
+                }
+            ],
+            "related": "listLBHealthCheckPolicies,createLBHealthCheckPolicy",
+            "response": [
+                {
+                    "description": "the id of the zone the HealthCheck policy belongs to",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of healthcheckpolicies",
+                    "name": "healthcheckpolicy",
+                    "response": [
+                        {
+                            "description": "Number of consecutive health check success before declaring an instance healthy",
+                            "name": "healthcheckthresshold",
+                            "type": "int"
+                        },
+                        {
+                            "description": "Number of consecutive health check failures before declaring an instance unhealthy.",
+                            "name": "unhealthcheckthresshold",
+                            "type": "int"
+                        },
+                        {
+                            "description": "Amount of time between health checks",
+                            "name": "healthcheckinterval",
+                            "type": "int"
+                        },
+                        {
+                            "description": "the LB HealthCheck policy ID",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the pingpath  of the healthcheck policy",
+                            "name": "pingpath",
+                            "type": "string"
+                        },
+                        {
+                            "description": "is policy for display to the regular user",
+                            "name": "fordisplay",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "the state of the policy",
+                            "name": "state",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Time to wait when receiving a response from the health check",
+                            "name": "responsetime",
+                            "type": "int"
+                        },
+                        {
+                            "description": "the description of the healthcheck policy",
+                            "name": "description",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "the LB rule ID",
+                    "name": "lbruleid",
+                    "type": "string"
+                },
+                {
+                    "description": "the account of the HealthCheck policy",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain of the HealthCheck policy",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain ID of the HealthCheck policy",
+                    "name": "domainid",
+                    "type": "string"
+                }
+            ],
+            "since": "4.4"
+        },
+        {
+            "description": "Reboots a virtual machine.",
+            "isasync": true,
+            "name": "rebootVirtualMachine",
+            "params": [
+                {
+                    "description": "The ID of the virtual machine",
+                    "length": 255,
+                    "name": "id",
+                    "related": "updateVMAffinityGroup,rebootVirtualMachine,detachIso,resetSSHKeyForVirtualMachine,resetSSHKeyForVirtualMachine,migrateVirtualMachineWithVolume,attachIso,removeNicFromVirtualMachine,updateVirtualMachine,recoverVirtualMachine,migrateVirtualMachine,resetPasswordForVirtualMachine,revertToVMSnapshot,assignVirtualMachine,updateVMAffinityGroup,listVirtualMachines,rebootVirtualMachine,restoreVirtualMachine,destroyVirtualMachine,stopVirtualMachine,deployVirtualMachine,detachIso,deployVirtualMachine,updateDefaultNicForVirtualMachine,updateVirtualMachine,revertToVMSnapshot,addNicToVirtualMachine,tmDestroyVirtualMachine,resetPasswordForVirtualMachine,startVirtualMachine,updateDefaultNicForVirtualMachine,startVirtualMachine,updateVmNicIp,attachIso,listVirtualMachines,addNicToVirtualMachine,stopVirtualMachine,destroyVirtualMachine,removeNicFromVirtualMachine,changeServiceForVirtualMachine",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "updateVMAffinityGroup,detachIso,resetSSHKeyForVirtualMachine,resetSSHKeyForVirtualMachine,migrateVirtualMachineWithVolume,attachIso,removeNicFromVirtualMachine,updateVirtualMachine,recoverVirtualMachine,migrateVirtualMachine,resetPasswordForVirtualMachine,revertToVMSnapshot,assignVirtualMachine,updateVMAffinityGroup,listVirtualMachines,rebootVirtualMachine,restoreVirtualMachine,destroyVirtualMachine,stopVirtualMachine,deployVirtualMachine,detachIso,deployVirtualMachine,updateDefaultNicForVirtualMachine,updateVirtualMachine,revertToVMSnapshot,addNicToVirtualMachine,tmDestroyVirtualMachine,resetPasswordForVirtualMachine,startVirtualMachine,updateDefaultNicForVirtualMachine,startVirtualMachine,updateVmNicIp,attachIso,listVirtualMachines,addNicToVirtualMachine,stopVirtualMachine,destroyVirtualMachine,removeNicFromVirtualMachine,changeServiceForVirtualMachine",
+            "response": [
+                {
+                    "description": "the read (bytes) of disk on the vm",
+                    "name": "diskkbsread",
+                    "type": "long"
+                },
+                {
+                    "description": "the ID of the availablility zone for the virtual machine",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the domain in which the virtual machine exists",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "device type of the root volume",
+                    "name": "rootdevicetype",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the disk offering of the virtual machine",
+                    "name": "diskofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "list of affinity groups associated with the virtual machine",
+                    "name": "affinitygroup",
+                    "response": [
+                        {
+                            "description": "the domain ID of the affinity group",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the affinity group",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project ID of the affinity group",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the name of the affinity group",
+                            "name": "name",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account owning the affinity group",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the description of the affinity group",
+                            "name": "description",
+                            "type": "string"
+                        },
+                        {
+                            "description": "virtual machine IDs associated with this affinity group",
+                            "name": "virtualmachineIds",
+                            "type": "list"
+                        },
+                        {
+                            "description": "the project name of the affinity group",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain name of the affinity group",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the type of the affinity group",
+                            "name": "type",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "public IP address id associated with vm via Static nat rule",
+                    "name": "publicip",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the vm",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the amount of the vm's CPU currently used",
+                    "name": "cpuused",
+                    "type": "string"
+                },
+                {
+                    "description": "public IP address id associated with vm via Static nat rule",
+                    "name": "publicipid",
+                    "type": "string"
+                },
+                {
+                    "description": "the number of cpu this virtual machine is running with",
+                    "name": "cpunumber",
+                    "type": "integer"
+                },
+                {
+                    "description": "the write (io) of disk on the vm",
+                    "name": "diskiowrite",
+                    "type": "long"
+                },
+                {
+                    "description": "the name of the domain in which the virtual machine exists",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "instance name of the user vm; this parameter is returned to the ROOT admin only",
+                    "name": "instancename",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the virtual machine",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the service offering of the virtual machine",
+                    "name": "serviceofferingid",
+                    "type": "string"
+                },
+                {
+
+                },
+                {
+                    "description": "an optional field whether to the display the vm to the end user or not.",
+                    "name": "displayvm",
+                    "type": "boolean"
+                },
+                {
+                    "description": "OS type id of the vm",
+                    "name": "ostypeid",
+                    "type": "long"
+                },
+                {
+                    "description": "the speed of each cpu",
+                    "name": "cpuspeed",
+                    "type": "integer"
+                },
+                {
+                    "description": "the write (bytes) of disk on the vm",
+                    "name": "diskkbswrite",
+                    "type": "long"
+                },
+                {
+                    "description": "the hypervisor on which the template runs",
+                    "name": "hypervisor",
+                    "type": "string"
+                },
+                {
+                    "description": "true if high-availability is enabled, false otherwise",
+                    "name": "haenable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the ID of the host for the virtual machine",
+                    "name": "hostid",
+                    "type": "string"
+                },
+                {
+                    "description": "the account associated with the virtual machine",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "State of the Service from LB rule",
+                    "name": "servicestate",
+                    "type": "string"
+                },
+                {
+                    "description": "an alternate display text of the ISO attached to the virtual machine",
+                    "name": "isodisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": " an alternate display text of the template for the virtual machine",
+                    "name": "templatedisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of the virtual machine",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the virtual network for the service offering",
+                    "name": "forvirtualnetwork",
+                    "type": "boolean"
+                },
+                {
+                    "description": "Vm details in key/value pairs.",
+                    "name": "details",
+                    "type": "map"
+                },
+                {
+                    "description": "true if vm contains XS/VMWare tools inorder to support dynamic scaling of VM cpu/memory.",
+                    "name": "isdynamicallyscalable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the project id of the vm",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "device ID of the root volume",
+                    "name": "rootdeviceid",
+                    "type": "long"
+                },
+                {
+                    "description": "user generated name. The name of the virtual machine is returned if no displayname exists.",
+                    "name": "displayname",
+                    "type": "string"
+                },
+                {
+                    "description": "the date when this virtual machine was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the name of the template for the virtual machine",
+                    "name": "templatename",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of nics associated with vm",
+                    "name": "nic",
+                    "response": [
+                        {
+                            "description": "the traffic type of the nic",
+                            "name": "traffictype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the gateway of IPv6 network",
+                            "name": "ip6gateway",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the gateway of the nic",
+                            "name": "gateway",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ip address of the nic",
+                            "name": "ipaddress",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the Secondary ipv4 addr of nic",
+                            "name": "secondaryip",
+                            "type": "list"
+                        },
+                        {
+                            "description": "the IPv6 address of network",
+                            "name": "ip6address",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the vm to which the nic belongs",
+                            "name": "virtualmachineid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if nic is default, false otherwise",
+                            "name": "isdefault",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "the cidr of IPv6 network",
+                            "name": "ip6cidr",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the NSX Logical Switch (if NSX based), null otherwise",
+                            "name": "nsxlogicalswitch",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the nic",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the name of the corresponding network",
+                            "name": "networkname",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the isolation uri of the nic",
+                            "name": "isolationuri",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the netmask of the nic",
+                            "name": "netmask",
+                            "type": "string"
+                        },
+                        {
+                            "description": "device id for the network when plugged into the virtual machine",
+                            "name": "deviceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if nic is default, false otherwise",
+                            "name": "macaddress",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the broadcast uri of the nic",
+                            "name": "broadcasturi",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the NSX Logical Switch Port (if NSX based), null otherwise",
+                            "name": "nsxlogicalswitchport",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the type of the nic",
+                            "name": "type",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the corresponding network",
+                            "name": "networkid",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "the group ID of the virtual machine",
+                    "name": "groupid",
+                    "type": "string"
+                },
+                {
+                    "description": "the outgoing network traffic on the host",
+                    "name": "networkkbswrite",
+                    "type": "long"
+                },
+                {
+                    "description": "true if the password rest feature is enabled, false otherwise",
+                    "name": "passwordenabled",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the incoming network traffic on the vm",
+                    "name": "networkkbsread",
+                    "type": "long"
+                },
+                {
+                    "description": "the ID of the ISO attached to the virtual machine",
+                    "name": "isoid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the availability zone for the virtual machine",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the ISO attached to the virtual machine",
+                    "name": "isoname",
+                    "type": "string"
+                },
+                {
+                    "description": "Os type ID of the virtual machine",
+                    "name": "guestosid",
+                    "type": "string"
+                },
+                {
+                    "description": "the vgpu type used by the virtual machine",
+                    "name": "vgpu",
+                    "type": "string"
+                },
+                {
+                    "description": "the user's ID who deployed the virtual machine",
+                    "name": "userid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the template for the virtual machine. A -1 is returned if the virtual machine was created from an ISO file.",
+                    "name": "templateid",
+                    "type": "string"
+                },
+                {
+                    "description": "the target memory in vm",
+                    "name": "memorytargetkbs",
+                    "type": "long"
+                },
+                {
+                    "description": "the name of the host for the virtual machine",
+                    "name": "hostname",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the disk offering of the virtual machine",
+                    "name": "diskofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the service offering of the virtual machine",
+                    "name": "serviceofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "the group name of the virtual machine",
+                    "name": "group",
+                    "type": "string"
+                },
+                {
+                    "description": "the internal memory thats free in vm",
+                    "name": "memoryintfreekbs",
+                    "type": "long"
+                },
+                {
+                    "description": "the user's name who deployed the virtual machine",
+                    "name": "username",
+                    "type": "string"
+                },
+                {
+                    "description": "list of security groups associated with the virtual machine",
+                    "name": "securitygroup",
+                    "response": [
+                        {
+                            "description": "the domain ID of the security group",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of ingress rules associated with the security group",
+                            "name": "ingressrule",
+                            "response": [
+                                {
+                                    "description": "account owning the security group rule",
+                                    "name": "account",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the starting IP of the security group rule",
+                                    "name": "startport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the protocol of the security group rule",
+                                    "name": "protocol",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the type of the ICMP message response",
+                                    "name": "icmptype",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "security group name",
+                                    "name": "securitygroupname",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the list of resource tags associated with the rule",
+                                    "name": "tags",
+                                    "response": [
+                                        {
+                                            "description": "resource type",
+                                            "name": "resourcetype",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the account associated with the tag",
+                                            "name": "account",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the domain associated with the tag",
+                                            "name": "domain",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag value",
+                                            "name": "value",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project name where tag belongs to",
+                                            "name": "project",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the ID of the domain associated with the tag",
+                                            "name": "domainid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "customer associated with the tag",
+                                            "name": "customer",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag key name",
+                                            "name": "key",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project id the tag belongs to",
+                                            "name": "projectid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "id of the resource",
+                                            "name": "resourceid",
+                                            "type": "string"
+                                        }
+                                    ],
+                                    "type": "set"
+                                },
+                                {
+                                    "description": "the CIDR notation for the base IP address of the security group rule",
+                                    "name": "cidr",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the id of the security group rule",
+                                    "name": "ruleid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the code for the ICMP message response",
+                                    "name": "icmpcode",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the ending IP of the security group rule ",
+                                    "name": "endport",
+                                    "type": "integer"
+                                }
+                            ],
+                            "type": "set"
+                        },
+                        {
+                            "description": "the project id of the group",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the number of virtualmachines associated with this securitygroup",
+                            "name": "virtualmachinecount",
+                            "type": "integer"
+                        },
+                        {
+                            "description": "the name of the security group",
+                            "name": "name",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the description of the security group",
+                            "name": "description",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of resource tags associated with the rule",
+                            "name": "tags",
+                            "response": [
+                                {
+                                    "description": "the account associated with the tag",
+                                    "name": "account",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the project id the tag belongs to",
+                                    "name": "projectid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the domain associated with the tag",
+                                    "name": "domain",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "tag value",
+                                    "name": "value",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "customer associated with the tag",
+                                    "name": "customer",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "id of the resource",
+                                    "name": "resourceid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the ID of the domain associated with the tag",
+                                    "name": "domainid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the project name where tag belongs to",
+                                    "name": "project",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "tag key name",
+                                    "name": "key",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "resource type",
+                                    "name": "resourcetype",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "set"
+                        },
+                        {
+                            "description": "the project name of the group",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of egress rules associated with the security group",
+                            "name": "egressrule",
+                            "response": [
+                                {
+                                    "description": "the code for the ICMP message response",
+                                    "name": "icmpcode",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the id of the security group rule",
+                                    "name": "ruleid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the starting IP of the security group rule",
+                                    "name": "startport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the protocol of the security group rule",
+                                    "name": "protocol",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the type of the ICMP message response",
+                                    "name": "icmptype",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "account owning the security group rule",
+                                    "name": "account",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the ending IP of the security group rule ",
+                                    "name": "endport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "security group name",
+                                    "name": "securitygroupname",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the CIDR notation for the base IP address of the security group rule",
+                                    "name": "cidr",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the list of resource tags associated with the rule",
+                                    "name": "tags",
+                                    "response": [
+                                        {
+                                            "description": "resource type",
+                                            "name": "resourcetype",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the domain associated with the tag",
+                                            "name": "domain",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag key name",
+                                            "name": "key",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "id of the resource",
+                                            "name": "resourceid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "customer associated with the tag",
+                                            "name": "customer",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project name where tag belongs to",
+                                            "name": "project",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the ID of the domain associated with the tag",
+                                            "name": "domainid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag value",
+                                            "name": "value",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the account associated with the tag",
+                                            "name": "account",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project id the tag belongs to",
+                                            "name": "projectid",
+                                            "type": "string"
+                                        }
+                                    ],
+                                    "type": "set"
+                                }
+                            ],
+                            "type": "set"
+                        },
+                        {
+                            "description": "the account owning the security group",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain name of the security group",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the security group",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of virtualmachine ids associated with this securitygroup",
+                            "name": "virtualmachineids",
+                            "type": "set"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "ssh key-pair",
+                    "name": "keypair",
+                    "type": "string"
+                },
+                {
+                    "description": "the memory allocated for the virtual machine",
+                    "name": "memory",
+                    "type": "integer"
+                },
+                {
+                    "description": "the read (io) of disk on the vm",
+                    "name": "diskioread",
+                    "type": "long"
+                },
+                {
+                    "description": "the name of the virtual machine",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the password (if exists) of the virtual machine",
+                    "name": "password",
+                    "type": "string"
+                },
+                {
+                    "description": "the memory used by the vm",
+                    "name": "memorykbs",
+                    "type": "long"
+                }
+            ]
+        },
+        {
+            "description": "Creates a load balancer rule",
+            "isasync": true,
+            "name": "createLoadBalancerRule",
+            "params": [
+                {
+                    "description": "if true, firewall rule for source/end public port is automatically created; if false - firewall rule has to be created explicitely. If not specified 1) defaulted to false when LB rule is being created for VPC guest network 2) in all other cases defaulted to true",
+                    "length": 255,
+                    "name": "openfirewall",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "The guest network this rule will be created for. Required when public Ip address is not associated with any Guest network yet (VPC case)",
+                    "length": 255,
+                    "name": "networkid",
+                    "related": "createNetwork,updateNetwork,listSrxFirewallNetworks,updateNetwork,listBrocadeVcsDeviceNetworks,listNiciraNvpDeviceNetworks,createNetwork,listNetworks,listNetscalerLoadBalancerNetworks,listF5LoadBalancerNetworks,listPaloAltoFirewallNetworks",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "The protocol for the LB",
+                    "length": 255,
+                    "name": "protocol",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "public IP address ID from where the network traffic will be load balanced from",
+                    "length": 255,
+                    "name": "publicipid",
+                    "related": "associateIpAddress,restartNetwork,updateIpAddress,associateIpAddress,listPublicIpAddresses,listPublicIpAddresses",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the domain ID associated with the load balancer",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "updateDomain,createDomain,listDomains,listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "zone where the load balancer is going to be created. This parameter is required when LB service provider is ElasticLoadBalancerVm",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones,listZones,createZone,updateZone",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "name of the load balancer rule",
+                    "length": 255,
+                    "name": "name",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the account associated with the load balancer. Must be used with the domainId parameter.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "an optional field, whether to the display the rule to the end user or not",
+                    "length": 255,
+                    "name": "fordisplay",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the CIDR list to forward traffic from",
+                    "length": 255,
+                    "name": "cidrlist",
+                    "required": false,
+                    "type": "list"
+                },
+                {
+                    "description": "the private port of the private IP address/virtual machine where the network traffic will be load balanced to",
+                    "length": 255,
+                    "name": "privateport",
+                    "required": true,
+                    "type": "integer"
+                },
+                {
+                    "description": "load balancer algorithm (source, roundrobin, leastconn)",
+                    "length": 255,
+                    "name": "algorithm",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the description of the load balancer rule",
+                    "length": 4096,
+                    "name": "description",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the public port from where the network traffic will be load balanced from",
+                    "length": 255,
+                    "name": "publicport",
+                    "required": true,
+                    "type": "integer"
+                }
+            ],
+            "related": "listLoadBalancerRules,updateLoadBalancerRule",
+            "response": [
+                {
+                    "description": "the description of the load balancer",
+                    "name": "description",
+                    "type": "string"
+                },
+                {
+                    "description": "the load balancer algorithm (source, roundrobin, leastconn)",
+                    "name": "algorithm",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the load balancer",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the public ip address id",
+                    "name": "publicipid",
+                    "type": "string"
+                },
+                {
+                    "description": "the id of the guest network the lb rule belongs to",
+                    "name": "networkid",
+                    "type": "string"
+                },
+                {
+                    "description": "the cidr list to forward traffic from",
+                    "name": "cidrlist",
+                    "type": "string"
+                },
+                {
+                    "description": "the protocol of the loadbalanacer rule",
+                    "name": "protocol",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of the rule",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the load balancer rule ID",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "is rule for display to the regular user",
+                    "name": "fordisplay",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the private port",
+                    "name": "privateport",
+                    "type": "string"
+                },
+                {
+                    "description": "the public ip address",
+                    "name": "publicip",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain of the load balancer rule",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the id of the zone the rule belongs to",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the load balancer",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain ID of the load balancer rule",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the load balancer",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the public port",
+                    "name": "publicport",
+                    "type": "string"
+                },
+                {
+                    "description": "the account of the load balancer rule",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of resource tags associated with load balancer",
+                    "name": "tags",
+                    "response": [
+                        {
+                            "description": "the account associated with the tag",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag value",
+                            "name": "value",
+                            "type": "string"
+                        },
+                        {
+                            "description": "resource type",
+                            "name": "resourcetype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag key name",
+                            "name": "key",
+                            "type": "string"
+                        },
+                        {
+                            "description": "customer associated with the tag",
+                            "name": "customer",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project id the tag belongs to",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "id of the resource",
+                            "name": "resourceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name where tag belongs to",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the domain associated with the tag",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain associated with the tag",
+                            "name": "domain",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                }
+            ]
+        },
+        {
+            "description": "Adds a guest OS name to hypervisor OS name mapping",
+            "isasync": true,
+            "name": "addGuestOsMapping",
+            "params": [
+                {
+                    "description": "Hypervisor type. One of : XenServer, KVM, VMWare",
+                    "length": 255,
+                    "name": "hypervisor",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "OS name specific to the hypervisor",
+                    "length": 255,
+                    "name": "osnameforhypervisor",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "Hypervisor version to create the mapping for. Use 'default' for default versions",
+                    "length": 255,
+                    "name": "hypervisorversion",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "UUID of Guest OS type. Either the UUID or Display Name must be passed",
+                    "length": 255,
+                    "name": "ostypeid",
+                    "related": "addGuestOs,listOsTypes",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "Display Name of Guest OS standard type. Either Display Name or UUID must be passed",
+                    "length": 255,
+                    "name": "osdisplayname",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "updateGuestOsMapping",
+            "response": [
+                {
+                    "description": "version of the hypervisor for mapping",
+                    "name": "hypervisorversion",
+                    "type": "string"
+                },
+                {
+                    "description": "standard display name for the Guest OS",
+                    "name": "osdisplayname",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the Guest OS type",
+                    "name": "ostypeid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the Guest OS mapping",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "hypervisor specific name for the Guest OS",
+                    "name": "osnameforhypervisor",
+                    "type": "string"
+                },
+                {
+                    "description": "the hypervisor",
+                    "name": "hypervisor",
+                    "type": "string"
+                },
+                {
+                    "description": "is the mapping user defined",
+                    "name": "isuserdefined",
+                    "type": "string"
+                }
+            ],
+            "since": "4.4.0"
+        },
+        {
+            "description": "Disables out-of-band management for a zone",
+            "isasync": true,
+            "name": "disableOutOfBandManagementForZone",
+            "params": [
+                {
+                    "description": "the ID of the zone",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones,listZones,createZone,updateZone",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "disableOutOfBandManagementForCluster,disableOutOfBandManagementForHost,issueOutOfBandManagementPowerAction,enableOutOfBandManagementForZone,enableOutOfBandManagementForCluster,changeOutOfBandManagementPassword,enableOutOfBandManagementForHost",
+            "response": [
+                {
+                    "description": "the out-of-band management interface address",
+                    "name": "address",
+                    "type": "string"
+                },
+                {
+                    "description": "the out-of-band management interface username",
+                    "name": "username",
+                    "type": "string"
+                },
+                {
+                    "description": "the out-of-band management interface port",
+                    "name": "port",
+                    "type": "string"
+                },
+                {
+                    "description": "the out-of-band management driver for the host",
+                    "name": "driver",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the host",
+                    "name": "hostid",
+                    "type": "string"
+                },
+                {
+                    "description": "the operation result",
+                    "name": "status",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the out-of-band management interface password",
+                    "name": "password",
+                    "type": "string"
+                },
+                {
+                    "description": "the out-of-band management action (if issued)",
+                    "name": "action",
+                    "type": "string"
+                },
+                {
+                    "description": "the operation result description",
+                    "name": "description",
+                    "type": "string"
+                },
+                {
+                    "description": "the out-of-band management interface powerState of the host",
+                    "name": "powerstate",
+                    "type": "powerstate"
+                },
+                {
+                    "description": "true if out-of-band management is enabled for the host",
+                    "name": "enabled",
+                    "type": "boolean"
+                }
+            ],
+            "since": "4.9.0"
+        },
+        {
+            "description": "configures a F5 load balancer device",
+            "isasync": true,
+            "name": "configureF5LoadBalancer",
+            "params": [
+                {
+                    "description": "F5 load balancer device ID",
+                    "length": 255,
+                    "name": "lbdeviceid",
+                    "related": "listF5LoadBalancers,addF5LoadBalancer,configureF5LoadBalancer",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "capacity of the device, Capacity will be interpreted as number of networks device can handle",
+                    "length": 255,
+                    "name": "lbdevicecapacity",
+                    "required": false,
+                    "type": "long"
+                }
+            ],
+            "related": "listF5LoadBalancers,addF5LoadBalancer",
+            "response": [
+                {
+                    "description": "the management IP address of the external load balancer",
+                    "name": "ipaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "true if device is dedicated for an account",
+                    "name": "lbdevicededicated",
+                    "type": "boolean"
+                },
+                {
+                    "description": "device state",
+                    "name": "lbdevicestate",
+                    "type": "string"
+                },
+                {
+                    "description": "name of the provider",
+                    "name": "provider",
+                    "type": "string"
+                },
+                {
+                    "description": "device capacity",
+                    "name": "lbdevicecapacity",
+                    "type": "long"
+                },
+                {
+                    "description": "device name",
+                    "name": "lbdevicename",
+                    "type": "string"
+                },
+                {
+                    "description": "the physical network to which this F5 device belongs to",
+                    "name": "physicalnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "the public interface of the load balancer",
+                    "name": "publicinterface",
+                    "type": "string"
+                },
+                {
+                    "description": "device id of the F5 load balancer",
+                    "name": "lbdeviceid",
+                    "type": "string"
+                },
+                {
+                    "description": "the private interface of the load balancer",
+                    "name": "privateinterface",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Updates a network offering.",
+            "isasync": false,
+            "name": "updateNetworkOffering",
+            "params": [
+                {
+                    "description": "sort key of the network offering, integer",
+                    "length": 255,
+                    "name": "sortkey",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "the id of the network offering",
+                    "length": 255,
+                    "name": "id",
+                    "related": "createNetworkOffering,listNetworkOfferings,updateNetworkOffering",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "if true keepalive will be turned on in the loadbalancer. At the time of writing this has only an effect on haproxy; the mode http and httpclose options are unset in the haproxy conf file.",
+                    "length": 255,
+                    "name": "keepaliveenabled",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "the name of the network offering",
+                    "length": 255,
+                    "name": "name",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the display text of the network offering",
+                    "length": 255,
+                    "name": "displaytext",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the availability of network offering. Default value is Required for Guest Virtual network offering; Optional for Guest Direct network offering",
+                    "length": 255,
+                    "name": "availability",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "maximum number of concurrent connections supported by the network offering",
+                    "length": 255,
+                    "name": "maxconnections",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "update state for the network offering",
+                    "length": 255,
+                    "name": "state",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "createNetworkOffering,listNetworkOfferings",
+            "response": [
+                {
+                    "description": "true if network offering supports persistent networks, false otherwise",
+                    "name": "ispersistent",
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if network offering is ip conserve mode enabled",
+                    "name": "conservemode",
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if network offering supports network that span multiple zones",
+                    "name": "supportsstrechedl2subnet",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the id of the network offering",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "true if network offering can be used by VPC networks only",
+                    "name": "forvpc",
+                    "type": "boolean"
+                },
+                {
+                    "description": "additional key/value details tied with network offering",
+                    "name": "details",
+                    "type": "map"
+                },
+                {
+                    "description": "the tags for the network offering",
+                    "name": "tags",
+                    "type": "string"
+                },
+                {
+                    "description": "state of the network offering. Can be Disabled/Enabled/Inactive",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the service offering used by virtual router provider",
+                    "name": "serviceofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "true if network offering supports specifying ip ranges, false otherwise",
+                    "name": "specifyipranges",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the date this network offering was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "guest type of the network offering, can be Shared or Isolated",
+                    "name": "guestiptype",
+                    "type": "string"
+                },
+                {
+                    "description": "true if network offering is default, false otherwise",
+                    "name": "isdefault",
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if network offering supports vlans, false otherwise",
+                    "name": "specifyvlan",
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if guest network default egress policy is allow; false if default egress policy is deny",
+                    "name": "egressdefaultpolicy",
+                    "type": "boolean"
+                },
+                {
+                    "description": "maximum number of concurrents connections to be handled by lb",
+                    "name": "maxconnections",
+                    "type": "integer"
+                },
+                {
+                    "description": "the name of the network offering",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "data transfer rate in megabits per second allowed.",
+                    "name": "networkrate",
+                    "type": "integer"
+                },
+                {
+                    "description": "an alternate display text of the network offering.",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "the traffic type for the network offering, supported types are Public, Management, Control, Guest, Vlan or Storage.",
+                    "name": "traffictype",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of supported services",
+                    "name": "service",
+                    "response": [
+                        {
+                            "description": "the list of capabilities",
+                            "name": "capability",
+                            "response": [
+                                {
+                                    "description": "the capability value",
+                                    "name": "value",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "can this service capability value can be choosable while creatine network offerings",
+                                    "name": "canchooseservicecapability",
+                                    "type": "boolean"
+                                },
+                                {
+                                    "description": "the capability name",
+                                    "name": "name",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "list"
+                        },
+                        {
+                            "description": "the service name",
+                            "name": "name",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the service provider name",
+                            "name": "provider",
+                            "response": [
+                                {
+                                    "description": "the physical network this belongs to",
+                                    "name": "physicalnetworkid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "services for this provider",
+                                    "name": "servicelist",
+                                    "type": "list"
+                                },
+                                {
+                                    "description": "the destination physical network",
+                                    "name": "destinationphysicalnetworkid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "state of the network provider",
+                                    "name": "state",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "true if individual services can be enabled/disabled",
+                                    "name": "canenableindividualservice",
+                                    "type": "boolean"
+                                },
+                                {
+                                    "description": "uuid of the network provider",
+                                    "name": "id",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the provider name",
+                                    "name": "name",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "list"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "availability of the network offering",
+                    "name": "availability",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Updates a VPC",
+            "isasync": true,
+            "name": "updateVPC",
+            "params": [
+                {
+                    "description": "the name of the VPC",
+                    "length": 255,
+                    "name": "name",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the id of the VPC",
+                    "length": 255,
+                    "name": "id",
+                    "related": "restartVPC,updateVPC,listVPCs,createVPC,updateVPC,listVPCs,createVPC",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "an optional field, in case you want to set a custom id to the resource. Allowed to Root Admins only",
+                    "length": 255,
+                    "name": "customid",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "string"
+                },
+                {
+                    "description": "the display text of the VPC",
+                    "length": 255,
+                    "name": "displaytext",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "an optional field, whether to the display the vpc to the end user or not",
+                    "length": 255,
+                    "name": "fordisplay",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "boolean"
+                }
+            ],
+            "related": "restartVPC,listVPCs,createVPC,updateVPC,listVPCs,createVPC",
+            "response": [
+                {
+                    "description": "state of the VPC. Can be Inactive/Enabled",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain id of the VPC owner",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain name of the owner",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the date this VPC was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the project id of the VPC",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of resource tags associated with the project",
+                    "name": "tags",
+                    "response": [
+                        {
+                            "description": "customer associated with the tag",
+                            "name": "customer",
+                            "type": "string"
+                        },
+                        {
+                            "description": "resource type",
+                            "name": "resourcetype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account associated with the tag",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project id the tag belongs to",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name where tag belongs to",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag key name",
+                            "name": "key",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag value",
+                            "name": "value",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain associated with the tag",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "id of the resource",
+                            "name": "resourceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the domain associated with the tag",
+                            "name": "domainid",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "if this VPC has redundant router",
+                    "name": "redundantvpcrouter",
+                    "type": "boolean"
+                },
+                {
+                    "description": "is vpc for display to the regular user",
+                    "name": "fordisplay",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the name of the zone the VPC belongs to",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of supported services",
+                    "name": "service",
+                    "response": [
+                        {
+                            "description": "the service name",
+                            "name": "name",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of capabilities",
+                            "name": "capability",
+                            "response": [
+                                {
+                                    "description": "can this service capability value can be choosable while creatine network offerings",
+                                    "name": "canchooseservicecapability",
+                                    "type": "boolean"
+                                },
+                                {
+                                    "description": "the capability name",
+                                    "name": "name",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the capability value",
+                                    "name": "value",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "list"
+                        },
+                        {
+                            "description": "the service provider name",
+                            "name": "provider",
+                            "response": [
+                                {
+                                    "description": "the provider name",
+                                    "name": "name",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the destination physical network",
+                                    "name": "destinationphysicalnetworkid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "true if individual services can be enabled/disabled",
+                                    "name": "canenableindividualservice",
+                                    "type": "boolean"
+                                },
+                                {
+                                    "description": "uuid of the network provider",
+                                    "name": "id",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the physical network this belongs to",
+                                    "name": "physicalnetworkid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "services for this provider",
+                                    "name": "servicelist",
+                                    "type": "list"
+                                },
+                                {
+                                    "description": "state of the network provider",
+                                    "name": "state",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "list"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "the network domain of the VPC",
+                    "name": "networkdomain",
+                    "type": "string"
+                },
+                {
+                    "description": "vpc offering id the VPC is created from",
+                    "name": "vpcofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "the cidr the VPC",
+                    "name": "cidr",
+                    "type": "string"
+                },
+                {
+                    "description": "true VPC requires restart",
+                    "name": "restartrequired",
+                    "type": "boolean"
+                },
+                {
+                    "description": "an alternate display text of the VPC.",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "the owner of the VPC",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of networks belongign to the VPC",
+                    "name": "network",
+                    "response": [
+                        {
+                            "description": "the cidr of IPv6 network",
+                            "name": "ip6cidr",
+                            "type": "string"
+                        },
+                        {
+                            "description": "broadcast uri of the network. This parameter is visible to ROOT admins only",
+                            "name": "broadcasturi",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if network supports specifying ip ranges, false otherwise",
+                            "name": "specifyipranges",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "display text of the network offering the network is created from",
+                            "name": "networkofferingdisplaytext",
+                            "type": "string"
+                        },
+                        {
+                            "description": "related to what other network configuration",
+                            "name": "related",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the network's gateway",
+                            "name": "gateway",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Cloudstack managed address space, all CloudStack managed VMs get IP address from CIDR",
+                            "name": "cidr",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the network's IP range not to be used by CloudStack guest VMs and can be used for non CloudStack purposes",
+                            "name": "reservediprange",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the network CIDR of the guest network configured with IP reservation. It is the summation of CIDR and RESERVED_IP_RANGE",
+                            "name": "networkcidr",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the first DNS for the network",
+                            "name": "dns1",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of services",
+                            "name": "service",
+                            "response": [
+                                {
+                                    "description": "the service name",
+                                    "name": "name",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the service provider name",
+                                    "name": "provider",
+                                    "response": [
+                                        {
+                                            "description": "state of the network provider",
+                                            "name": "state",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the destination physical network",
+                                            "name": "destinationphysicalnetworkid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "uuid of the network provider",
+                                            "name": "id",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the provider name",
+                                            "name": "name",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the physical network this belongs to",
+                                            "name": "physicalnetworkid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "services for this provider",
+                                            "name": "servicelist",
+                                            "type": "list"
+                                        },
+                                        {
+                                            "description": "true if individual services can be enabled/disabled",
+                                            "name": "canenableindividualservice",
+                                            "type": "boolean"
+                                        }
+                                    ],
+                                    "type": "list"
+                                },
+                                {
+                                    "description": "the list of capabilities",
+                                    "name": "capability",
+                                    "response": [
+                                        {
+                                            "description": "can this service capability value can be choosable while creatine network offerings",
+                                            "name": "canchooseservicecapability",
+                                            "type": "boolean"
+                                        },
+                                        {
+                                            "description": "the capability name",
+                                            "name": "name",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the capability value",
+                                            "name": "value",
+                                            "type": "string"
+                                        }
+                                    ],
+                                    "type": "list"
+                                }
+                            ],
+                            "type": "list"
+                        },
+                        {
+                            "description": "zone id of the network",
+                            "name": "zoneid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "network offering id the network is created from",
+                            "name": "networkofferingid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if network offering is ip conserve mode enabled",
+                            "name": "networkofferingconservemode",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "the name of the zone the network belongs to",
+                            "name": "zonename",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the second DNS for the network",
+                            "name": "dns2",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if network can span multiple zones",
+                            "name": "strechedl2subnet",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "list networks that are persistent",
+                            "name": "ispersistent",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "The vlan of the network. This parameter is visible to ROOT admins only",
+                            "name": "vlan",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the owner of the network",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the physical network id",
+                            "name": "physicalnetworkid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "If a network is enabled for 'streched l2 subnet' then represents zones on which network currently spans",
+                            "name": "zonesnetworkspans",
+                            "type": "set"
+                        },
+                        {
+                            "description": "name of the network offering the network is created from",
+                            "name": "networkofferingname",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the gateway of IPv6 network",
+                            "name": "ip6gateway",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the name of the network",
+                            "name": "name",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the network domain",
+                            "name": "networkdomain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of resource tags associated with network",
+                            "name": "tags",
+                            "response": [
+                                {
+                                    "description": "id of the resource",
+                                    "name": "resourceid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "tag value",
+                                    "name": "value",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "resource type",
+                                    "name": "resourcetype",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the project id the tag belongs to",
+                                    "name": "projectid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the domain associated with the tag",
+                                    "name": "domain",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "customer associated with the tag",
+                                    "name": "customer",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the account associated with the tag",
+                                    "name": "account",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "tag key name",
+                                    "name": "key",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the project name where tag belongs to",
+                                    "name": "project",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the ID of the domain associated with the tag",
+                                    "name": "domainid",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "list"
+                        },
+                        {
+                            "description": "true if users from subdomains can access the domain level network",
+                            "name": "subdomainaccess",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "true if network is system, false otherwise",
+                            "name": "issystem",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "true network requires restart",
+                            "name": "restartrequired",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "the id of the network",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "an optional field, whether to the display the network to the end user or not.",
+                            "name": "displaynetwork",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "the traffic type of the network",
+                            "name": "traffictype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the network's netmask",
+                            "name": "netmask",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain id of the network owner",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Broadcast domain type of the network",
+                            "name": "broadcastdomaintype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project id of the ipaddress",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name of the address",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "acl type - access type to the network",
+                            "name": "acltype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "VPC the network belongs to",
+                            "name": "vpcid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the displaytext of the network",
+                            "name": "displaytext",
+                            "type": "string"
+                        },
+                        {
+                            "description": "availability of the network offering the network is created from",
+                            "name": "networkofferingavailability",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain name of the network owner",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if network is default, false otherwise",
+                            "name": "isdefault",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "list networks available for vm deployment",
+                            "name": "canusefordeploy",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "the type of the network",
+                            "name": "type",
+                            "type": "string"
+                        },
+                        {
+                            "description": "state of the network",
+                            "name": "state",
+                            "type": "string"
+                        },
+                        {
+                            "description": "ACL Id associated with the VPC network",
+                            "name": "aclid",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "the id of the VPC",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the VPC",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "is VPC uses distributed router for one hop forwarding and host based network ACL's",
+                    "name": "distributedvpcrouter",
+                    "type": "boolean"
+                },
+                {
+                    "description": "zone id of the vpc",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the VPC",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "true if VPC is region level",
+                    "name": "regionlevelvpc",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "Changes out-of-band management interface password on the host and updates the interface configuration in CloudStack if the operation succeeds, else reverts the old password",
+            "isasync": true,
+            "name": "changeOutOfBandManagementPassword",
+            "params": [
+                {
+                    "description": "the new host management interface password of maximum length 16, if none is provided a random password would be used",
+                    "length": 255,
+                    "name": "password",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the host",
+                    "length": 255,
+                    "name": "hostid",
+                    "related": "addBaremetalHost,listExternalLoadBalancers,prepareHostForMaintenance,reconnectHost,addHost,cancelHostMaintenance",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "disableOutOfBandManagementForCluster,disableOutOfBandManagementForHost,issueOutOfBandManagementPowerAction,enableOutOfBandManagementForZone,enableOutOfBandManagementForCluster,enableOutOfBandManagementForHost",
+            "response": [
+                {
+                    "description": "the operation result",
+                    "name": "status",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the ID of the host",
+                    "name": "hostid",
+                    "type": "string"
+                },
+                {
+                    "description": "the out-of-band management driver for the host",
+                    "name": "driver",
+                    "type": "string"
+                },
+                {
+                    "description": "the operation result description",
+                    "name": "description",
+                    "type": "string"
+                },
+                {
+                    "description": "true if out-of-band management is enabled for the host",
+                    "name": "enabled",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the out-of-band management interface username",
+                    "name": "username",
+                    "type": "string"
+                },
+                {
+                    "description": "the out-of-band management interface port",
+                    "name": "port",
+                    "type": "string"
+                },
+                {
+                    "description": "the out-of-band management action (if issued)",
+                    "name": "action",
+                    "type": "string"
+                },
+                {
+                    "description": "the out-of-band management interface powerState of the host",
+                    "name": "powerstate",
+                    "type": "powerstate"
+                },
+                {
+                    "description": "the out-of-band management interface address",
+                    "name": "address",
+                    "type": "string"
+                },
+                {
+                    "description": "the out-of-band management interface password",
+                    "name": "password",
+                    "type": "string"
+                }
+            ],
+            "since": "4.9.0"
+        },
+        {
+            "description": "Deletes an egress firewall rule",
+            "isasync": true,
+            "name": "deleteEgressFirewallRule",
+            "params": [
+                {
+                    "description": "the ID of the firewall rule",
+                    "length": 255,
+                    "name": "id",
+                    "related": "listIpForwardingRules,createIpForwardingRule,updatePortForwardingRule,createPortForwardingRule,listPortForwardingRules",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "Stops a system VM.",
+            "isasync": true,
+            "name": "stopSystemVm",
+            "params": [
+                {
+                    "description": "The ID of the system virtual machine",
+                    "length": 255,
+                    "name": "id",
+                    "related": "changeServiceForSystemVm,migrateSystemVm,listSystemVms,stopSystemVm,startSystemVm",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "Force stop the VM.  The caller knows the VM is stopped.",
+                    "length": 255,
+                    "name": "forced",
+                    "required": false,
+                    "type": "boolean"
+                }
+            ],
+            "related": "changeServiceForSystemVm,migrateSystemVm,listSystemVms,startSystemVm",
+            "response": [
+                {
+                    "description": "the name of the system VM",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the job ID associated with the system VM. This is only displayed if the router listed is part of a currently running asynchronous job.",
+                    "name": "jobid",
+                    "type": "string"
+                },
+                {
+                    "description": "the link local netmask for the system vm",
+                    "name": "linklocalnetmask",
+                    "type": "string"
+                },
+                {
+                    "description": "the host ID for the system VM",
+                    "name": "hostid",
+                    "type": "string"
+                },
+                {
+                    "description": "the job status associated with the system VM.  This is only displayed if the router listed is part of a currently running asynchronous job.",
+                    "name": "jobstatus",
+                    "type": "integer"
+                },
+                {
+                    "description": "the gateway for the system VM",
+                    "name": "gateway",
+                    "type": "string"
+                },
+                {
+                    "description": "the link local IP address for the system vm",
+                    "name": "linklocalip",
+                    "type": "string"
+                },
+                {
+                    "description": "the date and time the system VM was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the first DNS for the system VM",
+                    "name": "dns1",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the system VM",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the public MAC address for the system VM",
+                    "name": "publicmacaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the hypervisor on which the template runs",
+                    "name": "hypervisor",
+                    "type": "string"
+                },
+                {
+                    "description": "the second DNS for the system VM",
+                    "name": "dns2",
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone ID for the system VM",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the public netmask for the system VM",
+                    "name": "publicnetmask",
+                    "type": "string"
+                },
+                {
+                    "description": "the public IP address for the system VM",
+                    "name": "publicip",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of the system VM",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the private MAC address for the system VM",
+                    "name": "privatemacaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the network domain for the system VM",
+                    "name": "networkdomain",
+                    "type": "string"
+                },
+                {
+                    "description": "the Pod ID for the system VM",
+                    "name": "podid",
+                    "type": "string"
+                },
+                {
+                    "description": "the link local MAC address for the system vm",
+                    "name": "linklocalmacaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the private netmask for the system VM",
+                    "name": "privatenetmask",
+                    "type": "string"
+                },
+                {
+                    "description": "the hostname for the system VM",
+                    "name": "hostname",
+                    "type": "string"
+                },
+                {
+                    "description": "the system VM type",
+                    "name": "systemvmtype",
+                    "type": "string"
+                },
+                {
+                    "description": "the template ID for the system VM",
+                    "name": "templateid",
+                    "type": "string"
+                },
+                {
+                    "description": "the number of active console sessions for the console proxy system vm",
+                    "name": "activeviewersessions",
+                    "type": "integer"
+                },
+                {
+                    "description": "the Zone name for the system VM",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the private IP address for the system VM",
+                    "name": "privateip",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "List resource detail(s)",
+            "isasync": false,
+            "name": "listResourceDetails",
+            "params": [
+                {
+                    "description": "list by key",
+                    "length": 255,
+                    "name": "key",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "list by key, value. Needs to be passed only along with key",
+                    "length": 255,
+                    "name": "value",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "string"
+                },
+                {
+                    "description": "list by resource type",
+                    "length": 255,
+                    "name": "resourcetype",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "if set to true, only details marked with display=true, are returned. False by default",
+                    "length": 255,
+                    "name": "fordisplay",
+                    "required": false,
+                    "since": "4.3",
+                    "type": "boolean"
+                },
+                {
+                    "description": "list objects by project",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "listProjectAccounts,suspendProject,activateProject,updateProject,createProject,listProjects",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.",
+                    "length": 255,
+                    "name": "isrecursive",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "list by resource id",
+                    "length": 255,
+                    "name": "resourceid",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "list only resources belonging to the domain specified",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "updateDomain,createDomain,listDomains,listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list resources by account. Must be used with the domainId parameter.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "If set to false, list only resources belonging to the command's caller; if set to true - list resources that the caller is authorized to see. Default value is false",
+                    "length": 255,
+                    "name": "listall",
+                    "required": false,
+                    "type": "boolean"
+                }
+            ],
+            "related": "listTags",
+            "response": [
+                {
+                    "description": "the ID of the domain associated with the tag",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "id of the resource",
+                    "name": "resourceid",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain associated with the tag",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "resource type",
+                    "name": "resourcetype",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id the tag belongs to",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "tag key name",
+                    "name": "key",
+                    "type": "string"
+                },
+                {
+                    "description": "tag value",
+                    "name": "value",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name where tag belongs to",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "customer associated with the tag",
+                    "name": "customer",
+                    "type": "string"
+                },
+                {
+                    "description": "the account associated with the tag",
+                    "name": "account",
+                    "type": "string"
+                }
+            ],
+            "since": "4.2"
+        },
+        {
+            "description": "Creates a network offering.",
+            "isasync": false,
+            "name": "createNetworkOffering",
+            "params": [
+                {
+                    "description": "true if network offering supports persistent networks; defaulted to false if not specified",
+                    "length": 255,
+                    "name": "ispersistent",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "services supported by the network offering",
+                    "length": 255,
+                    "name": "supportedservices",
+                    "required": true,
+                    "type": "list"
+                },
+                {
+                    "description": "data transfer rate in megabits per second allowed",
+                    "length": 255,
+                    "name": "networkrate",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "desired service capabilities as part of network offering",
+                    "length": 255,
+                    "name": "servicecapabilitylist",
+                    "required": false,
+                    "type": "map"
+                },
+                {
+                    "description": "Network offering details in key/value pairs. Supported keys are internallbprovider/publiclbprovider with service provider as a value",
+                    "length": 255,
+                    "name": "details",
+                    "required": false,
+                    "since": "4.2.0",
+                    "type": "map"
+                },
+                {
+                    "description": "the display text of the network offering",
+                    "length": 255,
+                    "name": "displaytext",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "true if the network offering is IP conserve mode enabled",
+                    "length": 255,
+                    "name": "conservemode",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "the name of the network offering",
+                    "length": 255,
+                    "name": "name",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "provider to service mapping. If not specified, the provider for the service will be mapped to the default provider on the physical network",
+                    "length": 255,
+                    "name": "serviceproviderlist",
+                    "required": false,
+                    "type": "map"
+                },
+                {
+                    "description": "the traffic type for the network offering. Supported type in current release is GUEST only",
+                    "length": 255,
+                    "name": "traffictype",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "maximum number of concurrent connections supported by the network offering",
+                    "length": 255,
+                    "name": "maxconnections",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "true if guest network default egress policy is allow; false if default egress policy is deny",
+                    "length": 255,
+                    "name": "egressdefaultpolicy",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "the availability of network offering. Default value is Optional",
+                    "length": 255,
+                    "name": "availability",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "guest type of the network offering: Shared or Isolated",
+                    "length": 255,
+                    "name": "guestiptype",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "if true keepalive will be turned on in the loadbalancer. At the time of writing this has only an effect on haproxy; the mode http and httpclose options are unset in the haproxy conf file.",
+                    "length": 255,
+                    "name": "keepaliveenabled",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "the service offering ID used by virtual router provider",
+                    "length": 255,
+                    "name": "serviceofferingid",
+                    "related": "createServiceOffering,updateServiceOffering,listServiceOfferings",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "true if network offering supports vlans",
+                    "length": 255,
+                    "name": "specifyvlan",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "the tags for the network offering.",
+                    "length": 4096,
+                    "name": "tags",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "true if network offering supports specifying ip ranges; defaulted to false if not specified",
+                    "length": 255,
+                    "name": "specifyipranges",
+                    "required": false,
+                    "type": "boolean"
+                }
+            ],
+            "related": "listNetworkOfferings",
+            "response": [
+                {
+                    "description": "the ID of the service offering used by virtual router provider",
+                    "name": "serviceofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "an alternate display text of the network offering.",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "guest type of the network offering, can be Shared or Isolated",
+                    "name": "guestiptype",
+                    "type": "string"
+                },
+                {
+                    "description": "true if network offering can be used by VPC networks only",
+                    "name": "forvpc",
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if network offering supports persistent networks, false otherwise",
+                    "name": "ispersistent",
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if guest network default egress policy is allow; false if default egress policy is deny",
+                    "name": "egressdefaultpolicy",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the name of the network offering",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "availability of the network offering",
+                    "name": "availability",
+                    "type": "string"
+                },
+                {
+                    "description": "data transfer rate in megabits per second allowed.",
+                    "name": "networkrate",
+                    "type": "integer"
+                },
+                {
+                    "description": "the traffic type for the network offering, supported types are Public, Management, Control, Guest, Vlan or Storage.",
+                    "name": "traffictype",
+                    "type": "string"
+                },
+                {
+                    "description": "true if network offering is ip conserve mode enabled",
+                    "name": "conservemode",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the date this network offering was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "additional key/value details tied with network offering",
+                    "name": "details",
+                    "type": "map"
+                },
+                {
+                    "description": "true if network offering supports vlans, false otherwise",
+                    "name": "specifyvlan",
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if network offering supports network that span multiple zones",
+                    "name": "supportsstrechedl2subnet",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the id of the network offering",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "true if network offering is default, false otherwise",
+                    "name": "isdefault",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the tags for the network offering",
+                    "name": "tags",
+                    "type": "string"
+                },
+                {
+                    "description": "true if network offering supports specifying ip ranges, false otherwise",
+                    "name": "specifyipranges",
+                    "type": "boolean"
+                },
+                {
+                    "description": "state of the network offering. Can be Disabled/Enabled/Inactive",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "maximum number of concurrents connections to be handled by lb",
+                    "name": "maxconnections",
+                    "type": "integer"
+                },
+                {
+                    "description": "the list of supported services",
+                    "name": "service",
+                    "response": [
+                        {
+                            "description": "the list of capabilities",
+                            "name": "capability",
+                            "response": [
+                                {
+                                    "description": "can this service capability value can be choosable while creatine network offerings",
+                                    "name": "canchooseservicecapability",
+                                    "type": "boolean"
+                                },
+                                {
+                                    "description": "the capability value",
+                                    "name": "value",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the capability name",
+                                    "name": "name",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "list"
+                        },
+                        {
+                            "description": "the service provider name",
+                            "name": "provider",
+                            "response": [
+                                {
+                                    "description": "the provider name",
+                                    "name": "name",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the destination physical network",
+                                    "name": "destinationphysicalnetworkid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the physical network this belongs to",
+                                    "name": "physicalnetworkid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "state of the network provider",
+                                    "name": "state",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "true if individual services can be enabled/disabled",
+                                    "name": "canenableindividualservice",
+                                    "type": "boolean"
+                                },
+                                {
+                                    "description": "uuid of the network provider",
+                                    "name": "id",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "services for this provider",
+                                    "name": "servicelist",
+                                    "type": "list"
+                                }
+                            ],
+                            "type": "list"
+                        },
+                        {
+                            "description": "the service name",
+                            "name": "name",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                }
+            ],
+            "since": "3.0.0"
+        },
+        {
+            "description": "Dedicate an existing cluster",
+            "isasync": true,
+            "name": "dedicateCluster",
+            "params": [
+                {
+                    "description": "the ID of the containing domain",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "updateDomain,createDomain,listDomains,listDomainChildren,listDomains",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the name of the account which needs dedication. Must be used with domainId.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the Cluster",
+                    "length": 255,
+                    "name": "clusterid",
+                    "related": "addCluster,updateCluster",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "listDedicatedClusters",
+            "response": [
+                {
+                    "description": "the domain ID of the cluster",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the Dedication Affinity Group ID of the cluster",
+                    "name": "affinitygroupid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the cluster",
+                    "name": "clustername",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the cluster",
+                    "name": "clusterid",
+                    "type": "string"
+                },
+                {
+                    "description": "the Account ID of the cluster",
+                    "name": "accountid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the dedicated resource",
+                    "name": "id",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Creates an IP forwarding rule",
+            "isasync": true,
+            "name": "createIpForwardingRule",
+            "params": [
+                {
+                    "description": "the public IP address ID of the forwarding rule, already associated via associateIp",
+                    "length": 255,
+                    "name": "ipaddressid",
+                    "related": "associateIpAddress,restartNetwork,updateIpAddress,associateIpAddress,listPublicIpAddresses,listPublicIpAddresses",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "if true, firewall rule for source/end public port is automatically created; if false - firewall rule has to be created explicitly. Has value true by default",
+                    "length": 255,
+                    "name": "openfirewall",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "the start port for the rule",
+                    "length": 255,
+                    "name": "startport",
+                    "required": true,
+                    "type": "integer"
+                },
+                {
+                    "description": "the end port for the rule",
+                    "length": 255,
+                    "name": "endport",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "the CIDR list to forward traffic from",
+                    "length": 255,
+                    "name": "cidrlist",
+                    "required": false,
+                    "type": "list"
+                },
+                {
+                    "description": "the protocol for the rule. Valid values are TCP or UDP.",
+                    "length": 255,
+                    "name": "protocol",
+                    "required": true,
+                    "type": "string"
+                }
+            ],
+            "related": "listIpForwardingRules,updatePortForwardingRule,createPortForwardingRule,listPortForwardingRules",
+            "response": [
+                {
+                    "description": "the starting port of port forwarding rule's private port range",
+                    "name": "privateport",
+                    "type": "string"
+                },
+                {
+                    "description": "the VM ID for the port forwarding rule",
+                    "name": "virtualmachineid",
+                    "type": "string"
+                },
+                {
+                    "description": "the VM display name for the port forwarding rule",
+                    "name": "virtualmachinedisplayname",
+                    "type": "string"
+                },
+                {
+                    "description": "the VM name for the port forwarding rule",
+                    "name": "virtualmachinename",
+                    "type": "string"
+                },
+                {
+                    "description": "the public ip address id for the port forwarding rule",
+                    "name": "ipaddressid",
+                    "type": "string"
+                },
+                {
+                    "description": "the public ip address for the port forwarding rule",
+                    "name": "ipaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the protocol of the port forwarding rule",
+                    "name": "protocol",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of resource tags associated with the rule",
+                    "name": "tags",
+                    "response": [
+                        {
+                            "description": "the project id the tag belongs to",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account associated with the tag",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain associated with the tag",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "resource type",
+                            "name": "resourcetype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "id of the resource",
+                            "name": "resourceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag key name",
+                            "name": "key",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag value",
+                            "name": "value",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the domain associated with the tag",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name where tag belongs to",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "customer associated with the tag",
+                            "name": "customer",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "is firewall for display to the regular user",
+                    "name": "fordisplay",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the ID of the port forwarding rule",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the ending port of port forwarding rule's private port range",
+                    "name": "publicendport",
+                    "type": "string"
+                },
+                {
+                    "description": "the vm ip address for the port forwarding rule",
+                    "name": "vmguestip",
+                    "type": "string"
+                },
+                {
+                    "description": "the starting port of port forwarding rule's public port range",
+                    "name": "publicport",
+                    "type": "string"
+                },
+                {
+                    "description": "the cidr list to forward traffic from",
+                    "name": "cidrlist",
+                    "type": "string"
+                },
+                {
+                    "description": "the ending port of port forwarding rule's private port range",
+                    "name": "privateendport",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of the rule",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the id of the guest network the port forwarding rule belongs to",
+                    "name": "networkid",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Lists volume metrics",
+            "isasync": false,
+            "name": "listVolumesMetrics",
+            "params": [
+                {
+                    "description": "the name of the disk volume",
+                    "length": 255,
+                    "name": "name",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the type of disk volume",
+                    "length": 255,
+                    "name": "type",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.",
+                    "length": 255,
+                    "name": "isrecursive",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "the pod id the disk volume belongs to",
+                    "length": 255,
+                    "name": "podid",
+                    "related": "listPods,updatePod",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list volumes on specified host",
+                    "length": 255,
+                    "name": "hostid",
+                    "related": "addBaremetalHost,listExternalLoadBalancers,prepareHostForMaintenance,reconnectHost,addHost,cancelHostMaintenance",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list only resources belonging to the domain specified",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "updateDomain,createDomain,listDomains,listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list resources by display flag; only ROOT admin is eligible to pass this parameter",
+                    "length": 255,
+                    "name": "displayvolume",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "boolean"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "list resources by account. Must be used with the domainId parameter.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "list volumes by disk offering",
+                    "length": 255,
+                    "name": "diskofferingid",
+                    "related": "updateDiskOffering,createDiskOffering,listDiskOfferings",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "uuid"
+                },
+                {
+                    "description": "list objects by project",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "listProjectAccounts,suspendProject,activateProject,updateProject,createProject,listProjects",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "If set to false, list only resources belonging to the command's caller; if set to true - list resources that the caller is authorized to see. Default value is false",
+                    "length": 255,
+                    "name": "listall",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "the ID of the storage pool, available to ROOT admin only",
+                    "length": 255,
+                    "name": "storageid",
+                    "related": "createStoragePool,listStoragePools,findStoragePoolsForMigration,enableStorageMaintenance,cancelStorageMaintenance",
+                    "required": false,
+                    "since": "4.3",
+                    "type": "uuid"
+                },
+                {
+                    "description": "the pod id the disk volume belongs to",
+                    "length": 255,
+                    "name": "podid",
+                    "related": "listPods,updatePod",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "the IDs of the volumes, mutually exclusive with id",
+                    "length": 255,
+                    "name": "ids",
+                    "related": "detachVolume,listVolumes,updateVolume,attachVolume,resizeVolume,updateVolume,migrateVolume,createVolume,listVolumes,uploadVolume,attachVolume,detachVolume,resizeVolume,migrateVolume,createVolume",
+                    "required": false,
+                    "since": "4.9",
+                    "type": "list"
+                },
+                {
+                    "description": "the ID of the storage pool, available to ROOT admin only",
+                    "length": 255,
+                    "name": "storageid",
+                    "related": "createStoragePool,listStoragePools,findStoragePoolsForMigration,enableStorageMaintenance,cancelStorageMaintenance",
+                    "required": false,
+                    "since": "4.3",
+                    "type": "uuid"
+                },
+                {
+                    "description": "List resources by tags (key/value pairs)",
+                    "length": 255,
+                    "name": "tags",
+                    "required": false,
+                    "type": "map"
+                },
+                {
+                    "description": "the ID of the availability zone",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones,listZones,createZone,updateZone",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the ID of the virtual machine",
+                    "length": 255,
+                    "name": "virtualmachineid",
+                    "related": "updateVMAffinityGroup,detachIso,resetSSHKeyForVirtualMachine,resetSSHKeyForVirtualMachine,migrateVirtualMachineWithVolume,attachIso,removeNicFromVirtualMachine,updateVirtualMachine,recoverVirtualMachine,migrateVirtualMachine,resetPasswordForVirtualMachine,revertToVMSnapshot,assignVirtualMachine,updateVMAffinityGroup,listVirtualMachines,rebootVirtualMachine,restoreVirtualMachine,destroyVirtualMachine,stopVirtualMachine,deployVirtualMachine,detachIso,deployVirtualMachine,updateDefaultNicForVirtualMachine,updateVirtualMachine,revertToVMSnapshot,addNicToVirtualMachine,tmDestroyVirtualMachine,resetPasswordForVirtualMachine,startVirtualMachine,updateDefaultNicForVirtualMachine,startVirtualMachine,updateVmNicIp,attachIso,listVirtualMachines,addNicToVirtualMachine,stopVirtualMachine,destroyVirtualMachine,removeNicFromVirtualMachine,changeServiceForVirtualMachine",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the ID of the disk volume",
+                    "length": 255,
+                    "name": "id",
+                    "related": "detachVolume,listVolumes,updateVolume,attachVolume,resizeVolume,updateVolume,migrateVolume,createVolume,listVolumes,uploadVolume,attachVolume,detachVolume,resizeVolume,migrateVolume,createVolume",
+                    "required": false,
+                    "type": "uuid"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "disk size in GiB",
+                    "name": "sizegb",
+                    "type": "string"
+                }
+            ],
+            "since": "4.9.3"
+        },
+        {
+            "description": "Lists the network Interfaces of elastistor",
+            "isasync": false,
+            "name": "listElastistorInterface",
+            "params": [
+                {
+                    "description": "controller id",
+                    "length": 255,
+                    "name": "controllerid",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "listElastistorVolume",
+            "response": [
+                {
+                    "description": "graceallowed",
+                    "name": "graceallowed",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the volume",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "syncronization",
+                    "name": "sync",
+                    "type": "string"
+                },
+                {
+                    "description": "deduplication",
+                    "name": "deduplication",
+                    "type": "string"
+                },
+                {
+                    "description": "the id of the volume",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "compression",
+                    "name": "compression",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Lists SSL certificates",
+            "isasync": false,
+            "name": "listSslCerts",
+            "params": [
+                {
+                    "description": "Account ID",
+                    "length": 255,
+                    "name": "accountid",
+                    "related": "disableAccount,listAccounts,markDefaultZoneForAccount,listAccounts,enableAccount,updateAccount,createAccount",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "Load balancer rule ID",
+                    "length": 255,
+                    "name": "lbruleid",
+                    "related": "listIpForwardingRules,updatePortForwardingRule,createPortForwardingRule,listPortForwardingRules",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "Project that owns the SSL certificate",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "listProjectAccounts,suspendProject,activateProject,updateProject,createProject,listProjects",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "ID of SSL certificate",
+                    "length": 255,
+                    "name": "certid",
+                    "related": "listSslCerts,uploadSslCert",
+                    "required": false,
+                    "type": "uuid"
+                }
+            ],
+            "related": "uploadSslCert",
+            "response": [
+                {
+                    "description": "List of loabalancers this certificate is bound to",
+                    "name": "loadbalancerrulelist",
+                    "type": "list"
+                },
+                {
+                    "description": "the domain id of the network owner",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "certificate chain",
+                    "name": "certchain",
+                    "type": "string"
+                },
+                {
+                    "description": "certificate",
+                    "name": "certificate",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the certificate",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "SSL certificate ID",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain name of the network owner",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "account for the certificate",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the certificate",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "certificate fingerprint",
+                    "name": "fingerprint",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "List private gateways",
+            "isasync": false,
+            "name": "listPrivateGateways",
+            "params": [
+                {
+                    "description": "defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.",
+                    "length": 255,
+                    "name": "isrecursive",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "list private gateway by id",
+                    "length": 255,
+                    "name": "id",
+                    "related": "listPrivateGateways,createPrivateGateway",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "If set to false, list only resources belonging to the command's caller; if set to true - list resources that the caller is authorized to see. Default value is false",
+                    "length": 255,
+                    "name": "listall",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "list only resources belonging to the domain specified",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "updateDomain,createDomain,listDomains,listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list gateways by ip address",
+                    "length": 255,
+                    "name": "ipaddress",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "list gateways by vlan",
+                    "length": 255,
+                    "name": "vlan",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "list gateways by state",
+                    "length": 255,
+                    "name": "state",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "list resources by account. Must be used with the domainId parameter.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "list gateways by vpc",
+                    "length": 255,
+                    "name": "vpcid",
+                    "related": "restartVPC,listVPCs,createVPC,updateVPC,listVPCs,createVPC",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "list objects by project",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "listProjectAccounts,suspendProject,activateProject,updateProject,createProject,listProjects",
+                    "required": false,
+                    "type": "uuid"
+                }
+            ],
+            "related": "createPrivateGateway",
+            "response": [
+                {
+                    "description": "the private gateway's ip address",
+                    "name": "ipaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the physical network id",
+                    "name": "physicalnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "the account associated with the private gateway",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain associated with the private gateway",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the domain associated with the private gateway",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "zone id of the private gateway",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the network implementation uri for the private gateway",
+                    "name": "vlan",
+                    "type": "string"
+                },
+                {
+                    "description": "the id of the private gateway",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the zone the private gateway belongs to",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "Souce Nat enable status",
+                    "name": "sourcenatsupported",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the private gateway's netmask",
+                    "name": "netmask",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the private gateway",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "VPC the private gateaway belongs to",
+                    "name": "vpcid",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the private gateway",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the gateway",
+                    "name": "gateway",
+                    "type": "string"
+                },
+                {
+                    "description": "ACL Id set for private gateway",
+                    "name": "aclid",
+                    "type": "string"
+                },
+                {
+                    "description": "State of the gateway, can be Creating, Ready, Deleting",
+                    "name": "state",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Update the default Ip of a VM Nic",
+            "isasync": true,
+            "name": "updateVmNicIp",
+            "params": [
+                {
+                    "description": "the ID of the nic to which you want to assign private IP",
+                    "length": 255,
+                    "name": "nicid",
+                    "related": "listNics",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "Secondary IP Address",
+                    "length": 255,
+                    "name": "ipaddress",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "updateVMAffinityGroup,detachIso,resetSSHKeyForVirtualMachine,resetSSHKeyForVirtualMachine,migrateVirtualMachineWithVolume,attachIso,removeNicFromVirtualMachine,updateVirtualMachine,recoverVirtualMachine,migrateVirtualMachine,resetPasswordForVirtualMachine,revertToVMSnapshot,assignVirtualMachine,updateVMAffinityGroup,listVirtualMachines,rebootVirtualMachine,restoreVirtualMachine,destroyVirtualMachine,stopVirtualMachine,deployVirtualMachine,detachIso,deployVirtualMachine,updateDefaultNicForVirtualMachine,updateVirtualMachine,revertToVMSnapshot,addNicToVirtualMachine,tmDestroyVirtualMachine,resetPasswordForVirtualMachine,startVirtualMachine,updateDefaultNicForVirtualMachine,startVirtualMachine,attachIso,listVirtualMachines,addNicToVirtualMachine,stopVirtualMachine,destroyVirtualMachine,removeNicFromVirtualMachine,changeServiceForVirtualMachine",
+            "response": [
+                {
+                    "description": "the virtual network for the service offering",
+                    "name": "forvirtualnetwork",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the write (io) of disk on the vm",
+                    "name": "diskiowrite",
+                    "type": "long"
+                },
+                {
+                    "description": "ssh key-pair",
+                    "name": "keypair",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the availability zone for the virtual machine",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+
+                },
+                {
+                    "description": "the amount of the vm's CPU currently used",
+                    "name": "cpuused",
+                    "type": "string"
+                },
+                {
+                    "description": "the group name of the virtual machine",
+                    "name": "group",
+                    "type": "string"
+                },
+                {
+                    "description": "true if high-availability is enabled, false otherwise",
+                    "name": "haenable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the name of the virtual machine",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the memory allocated for the virtual machine",
+                    "name": "memory",
+                    "type": "integer"
+                },
+                {
+                    "description": "public IP address id associated with vm via Static nat rule",
+                    "name": "publicip",
+                    "type": "string"
+                },
+                {
+                    "description": "instance name of the user vm; this parameter is returned to the ROOT admin only",
+                    "name": "instancename",
+                    "type": "string"
+                },
+                {
+                    "description": "the date when this virtual machine was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the read (bytes) of disk on the vm",
+                    "name": "diskkbsread",
+                    "type": "long"
+                },
+                {
+                    "description": "the name of the service offering of the virtual machine",
+                    "name": "serviceofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the domain in which the virtual machine exists",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the vm",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the virtual machine",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the group ID of the virtual machine",
+                    "name": "groupid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the disk offering of the virtual machine",
+                    "name": "diskofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "the hypervisor on which the template runs",
+                    "name": "hypervisor",
+                    "type": "string"
+                },
+                {
+                    "description": "true if the password rest feature is enabled, false otherwise",
+                    "name": "passwordenabled",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the speed of each cpu",
+                    "name": "cpuspeed",
+                    "type": "integer"
+                },
+                {
+                    "description": "the internal memory thats free in vm",
+                    "name": "memoryintfreekbs",
+                    "type": "long"
+                },
+                {
+                    "description": "the incoming network traffic on the vm",
+                    "name": "networkkbsread",
+                    "type": "long"
+                },
+                {
+                    "description": "the target memory in vm",
+                    "name": "memorytargetkbs",
+                    "type": "long"
+                },
+                {
+                    "description": "the ID of the domain in which the virtual machine exists",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the disk offering of the virtual machine",
+                    "name": "diskofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "the vgpu type used by the virtual machine",
+                    "name": "vgpu",
+                    "type": "string"
+                },
+                {
+                    "description": "list of affinity groups associated with the virtual machine",
+                    "name": "affinitygroup",
+                    "response": [
+                        {
+                            "description": "the description of the affinity group",
+                            "name": "description",
+                            "type": "string"
+                        },
+                        {
+                            "description": "virtual machine IDs associated with this affinity group",
+                            "name": "virtualmachineIds",
+                            "type": "list"
+                        },
+                        {
+                            "description": "the domain ID of the affinity group",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project ID of the affinity group",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain name of the affinity group",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name of the affinity group",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the type of the affinity group",
+                            "name": "type",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the affinity group",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the name of the affinity group",
+                            "name": "name",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account owning the affinity group",
+                            "name": "account",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "the account associated with the virtual machine",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the memory used by the vm",
+                    "name": "memorykbs",
+                    "type": "long"
+                },
+                {
+                    "description": "the ID of the service offering of the virtual machine",
+                    "name": "serviceofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "State of the Service from LB rule",
+                    "name": "servicestate",
+                    "type": "string"
+                },
+                {
+                    "description": "OS type id of the vm",
+                    "name": "ostypeid",
+                    "type": "long"
+                },
+                {
+                    "description": "Vm details in key/value pairs.",
+                    "name": "details",
+                    "type": "map"
+                },
+                {
+                    "description": "the ID of the host for the virtual machine",
+                    "name": "hostid",
+                    "type": "string"
+                },
+                {
+                    "description": "the read (io) of disk on the vm",
+                    "name": "diskioread",
+                    "type": "long"
+                },
+                {
+                    "description": "true if vm contains XS/VMWare tools inorder to support dynamic scaling of VM cpu/memory.",
+                    "name": "isdynamicallyscalable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the number of cpu this virtual machine is running with",
+                    "name": "cpunumber",
+                    "type": "integer"
+                },
+                {
+                    "description": "the user's ID who deployed the virtual machine",
+                    "name": "userid",
+                    "type": "string"
+                },
+                {
+                    "description": "user generated name. The name of the virtual machine is returned if no displayname exists.",
+                    "name": "displayname",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the availablility zone for the virtual machine",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the host for the virtual machine",
+                    "name": "hostname",
+                    "type": "string"
+                },
+                {
+                    "description": "the write (bytes) of disk on the vm",
+                    "name": "diskkbswrite",
+                    "type": "long"
+                },
+                {
+                    "description": "device type of the root volume",
+                    "name": "rootdevicetype",
+                    "type": "string"
+                },
+                {
+                    "description": "the user's name who deployed the virtual machine",
+                    "name": "username",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of nics associated with vm",
+                    "name": "nic",
+                    "response": [
+                        {
+                            "description": "the traffic type of the nic",
+                            "name": "traffictype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the Secondary ipv4 addr of nic",
+                            "name": "secondaryip",
+                            "type": "list"
+                        },
+                        {
+                            "description": "the cidr of IPv6 network",
+                            "name": "ip6cidr",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if nic is default, false otherwise",
+                            "name": "macaddress",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the corresponding network",
+                            "name": "networkid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the type of the nic",
+                            "name": "type",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the nic",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the name of the corresponding network",
+                            "name": "networkname",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the gateway of the nic",
+                            "name": "gateway",
+                            "type": "string"
+                        },
+                        {
+                            "description": "device id for the network when plugged into the virtual machine",
+                            "name": "deviceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the broadcast uri of the nic",
+                            "name": "broadcasturi",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if nic is default, false otherwise",
+                            "name": "isdefault",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "the IPv6 address of network",
+                            "name": "ip6address",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the NSX Logical Switch (if NSX based), null otherwise",
+                            "name": "nsxlogicalswitch",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ip address of the nic",
+                            "name": "ipaddress",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the vm to which the nic belongs",
+                            "name": "virtualmachineid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the isolation uri of the nic",
+                            "name": "isolationuri",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the NSX Logical Switch Port (if NSX based), null otherwise",
+                            "name": "nsxlogicalswitchport",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the netmask of the nic",
+                            "name": "netmask",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the gateway of IPv6 network",
+                            "name": "ip6gateway",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "the name of the ISO attached to the virtual machine",
+                    "name": "isoname",
+                    "type": "string"
+                },
+                {
+                    "description": "an alternate display text of the ISO attached to the virtual machine",
+                    "name": "isodisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "Os type ID of the virtual machine",
+                    "name": "guestosid",
+                    "type": "string"
+                },
+                {
+                    "description": "the outgoing network traffic on the host",
+                    "name": "networkkbswrite",
+                    "type": "long"
+                },
+                {
+                    "description": "list of security groups associated with the virtual machine",
+                    "name": "securitygroup",
+                    "response": [
+                        {
+                            "description": "the domain name of the security group",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of egress rules associated with the security group",
+                            "name": "egressrule",
+                            "response": [
+                                {
+                                    "description": "the list of resource tags associated with the rule",
+                                    "name": "tags",
+                                    "response": [
+                                        {
+                                            "description": "id of the resource",
+                                            "name": "resourceid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the ID of the domain associated with the tag",
+                                            "name": "domainid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "resource type",
+                                            "name": "resourcetype",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the domain associated with the tag",
+                                            "name": "domain",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project id the tag belongs to",
+                                            "name": "projectid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag key name",
+                                            "name": "key",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "customer associated with the tag",
+                                            "name": "customer",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag value",
+                                            "name": "value",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project name where tag belongs to",
+                                            "name": "project",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the account associated with the tag",
+                                            "name": "account",
+                                            "type": "string"
+                                        }
+                                    ],
+                                    "type": "set"
+                                },
+                                {
+                                    "description": "the code for the ICMP message response",
+                                    "name": "icmpcode",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "security group name",
+                                    "name": "securitygroupname",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the ending IP of the security group rule ",
+                                    "name": "endport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the CIDR notation for the base IP address of the security group rule",
+                                    "name": "cidr",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the protocol of the security group rule",
+                                    "name": "protocol",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "account owning the security group rule",
+                                    "name": "account",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the id of the security group rule",
+                                    "name": "ruleid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the type of the ICMP message response",
+                                    "name": "icmptype",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the starting IP of the security group rule",
+                                    "name": "startport",
+                                    "type": "integer"
+                                }
+                            ],
+                            "type": "set"
+                        },
+                        {
+                            "description": "the ID of the security group",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project id of the group",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of virtualmachine ids associated with this securitygroup",
+                            "name": "virtualmachineids",
+                            "type": "set"
+                        },
+                        {
+                            "description": "the project name of the group",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the description of the security group",
+                            "name": "description",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account owning the security group",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain ID of the security group",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of ingress rules associated with the security group",
+                            "name": "ingressrule",
+                            "response": [
+                                {
+                                    "description": "the code for the ICMP message response",
+                                    "name": "icmpcode",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the ending IP of the security group rule ",
+                                    "name": "endport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the id of the security group rule",
+                                    "name": "ruleid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the list of resource tags associated with the rule",
+                                    "name": "tags",
+                                    "response": [
+                                        {
+                                            "description": "tag value",
+                                            "name": "value",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project id the tag belongs to",
+                                            "name": "projectid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "resource type",
+                                            "name": "resourcetype",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project name where tag belongs to",
+                                            "name": "project",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "customer associated with the tag",
+                                            "name": "customer",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the ID of the domain associated with the tag",
+                                            "name": "domainid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the account associated with the tag",
+                                            "name": "account",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the domain associated with the tag",
+                                            "name": "domain",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag key name",
+                                            "name": "key",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "id of the resource",
+                                            "name": "resourceid",
+                                            "type": "string"
+                                        }
+                                    ],
+                                    "type": "set"
+                                },
+                                {
+                                    "description": "account owning the security group rule",
+                                    "name": "account",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the protocol of the security group rule",
+                                    "name": "protocol",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the type of the ICMP message response",
+                                    "name": "icmptype",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the CIDR notation for the base IP address of the security group rule",
+                                    "name": "cidr",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "security group name",
+                                    "name": "securitygroupname",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the starting IP of the security group rule",
+                                    "name": "startport",
+                                    "type": "integer"
+                                }
+                            ],
+                            "type": "set"
+                        },
+                        {
+                            "description": "the number of virtualmachines associated with this securitygroup",
+                            "name": "virtualmachinecount",
+                            "type": "integer"
+                        },
+                        {
+                            "description": "the name of the security group",
+                            "name": "name",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of resource tags associated with the rule",
+                            "name": "tags",
+                            "response": [
+                                {
+                                    "description": "tag key name",
+                                    "name": "key",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the domain associated with the tag",
+                                    "name": "domain",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the account associated with the tag",
+                                    "name": "account",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "resource type",
+                                    "name": "resourcetype",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the ID of the domain associated with the tag",
+                                    "name": "domainid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "id of the resource",
+                                    "name": "resourceid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the project id the tag belongs to",
+                                    "name": "projectid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the project name where tag belongs to",
+                                    "name": "project",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "tag value",
+                                    "name": "value",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "customer associated with the tag",
+                                    "name": "customer",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "set"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": " an alternate display text of the template for the virtual machine",
+                    "name": "templatedisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "public IP address id associated with vm via Static nat rule",
+                    "name": "publicipid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the ISO attached to the virtual machine",
+                    "name": "isoid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the template for the virtual machine",
+                    "name": "templatename",
+                    "type": "string"
+                },
+                {
+                    "description": "an optional field whether to the display the vm to the end user or not.",
+                    "name": "displayvm",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the password (if exists) of the virtual machine",
+                    "name": "password",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of the virtual machine",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "device ID of the root volume",
+                    "name": "rootdeviceid",
+                    "type": "long"
+                },
+                {
+                    "description": "the project name of the vm",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the template for the virtual machine. A -1 is returned if the virtual machine was created from an ISO file.",
+                    "name": "templateid",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Updates load balancer stickiness policy",
+            "isasync": true,
+            "name": "updateLBStickinessPolicy",
+            "params": [
+                {
+                    "description": "an optional field, in case you want to set a custom id to the resource. Allowed to Root Admins only",
+                    "length": 255,
+                    "name": "customid",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "string"
+                },
+                {
+                    "description": "id of lb stickiness policy",
+                    "length": 255,
+                    "name": "id",
+                    "related": "listLBStickinessPolicies,createLBStickinessPolicy,updateLBStickinessPolicy",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "an optional field, whether to the display the policy to the end user or not",
+                    "length": 255,
+                    "name": "fordisplay",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "boolean"
+                }
+            ],
+            "related": "listLBStickinessPolicies,createLBStickinessPolicy",
+            "response": [
+                {
+                    "description": "the state of the policy",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the account of the Stickiness policy",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of stickinesspolicies",
+                    "name": "stickinesspolicy",
+                    "response": [
+                        {
+                            "description": "the LB Stickiness policy ID",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the description of the Stickiness policy",
+                            "name": "description",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the name of the Stickiness policy",
+                            "name": "name",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the params of the policy",
+                            "name": "params",
+                            "type": "map"
+                        },
+                        {
+                            "description": "the method name of the Stickiness policy",
+                            "name": "methodname",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the state of the policy",
+                            "name": "state",
+                            "type": "string"
+                        },
+                        {
+                            "description": "is policy for display to the regular user",
+                            "name": "fordisplay",
+                            "type": "boolean"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "the LB rule ID",
+                    "name": "lbruleid",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain of the Stickiness policy",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain ID of the Stickiness policy",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the Stickiness policy",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the description of the Stickiness policy",
+                    "name": "description",
+                    "type": "string"
+                },
+                {
+                    "description": "the id of the zone the Stickiness policy belongs to",
+                    "name": "zoneid",
+                    "type": "string"
+                }
+            ],
+            "since": "4.4"
+        },
+        {
+            "description": "Lists all Pods.",
+            "isasync": false,
+            "name": "listPods",
+            "params": [
+                {
+                    "description": "list Pods by name",
+                    "length": 255,
+                    "name": "name",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "list pods by allocation state",
+                    "length": 255,
+                    "name": "allocationstate",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "list Pods by ID",
+                    "length": 255,
+                    "name": "id",
+                    "related": "listPods,updatePod",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list Pods by Zone ID",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones,listZones,createZone,updateZone",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "flag to display the capacity of the pods",
+                    "length": 255,
+                    "name": "showcapacities",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                }
+            ],
+            "related": "updatePod",
+            "response": [
+                {
+                    "description": "the Zone name of the Pod",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the capacity of the Pod",
+                    "name": "capacity",
+                    "response": [
+                        {
+                            "description": "the Pod name",
+                            "name": "podname",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the Zone name",
+                            "name": "zonename",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the Cluster name",
+                            "name": "clustername",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the capacity type",
+                            "name": "type",
+                            "type": "short"
+                        },
+                        {
+                            "description": "the percentage of capacity currently in use",
+                            "name": "percentused",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the Zone ID",
+                            "name": "zoneid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the Cluster ID",
+                            "name": "clusterid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the capacity currently in use",
+                            "name": "capacityused",
+                            "type": "long"
+                        },
+                        {
+                            "description": "the Pod ID",
+                            "name": "podid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the total capacity available",
+                            "name": "capacitytotal",
+                            "type": "long"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "the gateway of the Pod",
+                    "name": "gateway",
+                    "type": "string"
+                },
+                {
+                    "description": "the ending IP for the Pod",
+                    "name": "endip",
+                    "type": "string"
+                },
+                {
+                    "description": "the allocation state of the Pod",
+                    "name": "allocationstate",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the Pod",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the starting IP for the Pod",
+                    "name": "startip",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the Pod",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone ID of the Pod",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the netmask of the Pod",
+                    "name": "netmask",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Starts an existing internal lb vm.",
+            "isasync": true,
+            "name": "startInternalLoadBalancerVM",
+            "params": [
+                {
+                    "description": "the ID of the internal lb vm",
+                    "length": 255,
+                    "name": "id",
+                    "related": "stopInternalLoadBalancerVM,listInternalLoadBalancerVMs,changeServiceForRouter,rebootRouter,destroyRouter,startInternalLoadBalancerVM,listRouters",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "stopInternalLoadBalancerVM,listInternalLoadBalancerVMs,changeServiceForRouter,rebootRouter,destroyRouter,listRouters",
+            "response": [
+                {
+                    "description": "true if the router template requires upgrader",
+                    "name": "requiresupgrade",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the ID of the corresponding guest network",
+                    "name": "guestnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "the hostname for the router",
+                    "name": "hostname",
+                    "type": "string"
+                },
+                {
+                    "description": "the first DNS for the router",
+                    "name": "dns1",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the corresponding guest network",
+                    "name": "guestnetworkname",
+                    "type": "string"
+                },
+                {
+                    "description": "the link local MAC address for the router",
+                    "name": "linklocalmacaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the service offering of the virtual machine",
+                    "name": "serviceofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "the gateway for the router",
+                    "name": "gateway",
+                    "type": "string"
+                },
+                {
+                    "description": "the public netmask for the router",
+                    "name": "publicnetmask",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of the router",
+                    "name": "state",
+                    "type": "state"
+                },
+                {
+                    "description": "VPC the router belongs to",
+                    "name": "vpcid",
+                    "type": "string"
+                },
+                {
+                    "description": "the version of scripts",
+                    "name": "scriptsversion",
+                    "type": "string"
+                },
+                {
+                    "description": "the date and time the router was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the name of VPC the router belongs to",
+                    "name": "vpcname",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of redundant virtual router",
+                    "name": "redundantstate",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the ipaddress",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the corresponding link local network",
+                    "name": "linklocalnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "the template ID for the router",
+                    "name": "templateid",
+                    "type": "string"
+                },
+                {
+                    "description": "role of the domain router",
+                    "name": "role",
+                    "type": "string"
+                },
+                {
+                    "description": "the link local IP address for the router",
+                    "name": "linklocalip",
+                    "type": "string"
+                },
+                {
+                    "description": "the version of template",
+                    "name": "version",
+                    "type": "string"
+                },
+                {
+                    "description": "the public MAC address for the router",
+                    "name": "publicmacaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the id of the router",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the corresponding public network",
+                    "name": "publicnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain associated with the router",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the network domain for the router",
+                    "name": "networkdomain",
+                    "type": "string"
+                },
+                {
+                    "description": "the Pod ID for the router",
+                    "name": "podid",
+                    "type": "string"
+                },
+                {
+                    "description": "the guest MAC address for the router",
+                    "name": "guestmacaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the second DNS for the router",
+                    "name": "dns2",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the address",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the guest netmask for the router",
+                    "name": "guestnetmask",
+                    "type": "string"
+                },
+                {
+                    "description": "the hypervisor on which the template runs",
+                    "name": "hypervisor",
+                    "type": "string"
+                },
+                {
+                    "description": "the public IP address for the router",
+                    "name": "publicip",
+                    "type": "string"
+                },
+                {
+                    "description": "the account associated with the router",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone name for the router",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the link local netmask for the router",
+                    "name": "linklocalnetmask",
+                    "type": "string"
+                },
+                {
+                    "description": "the second IPv6 DNS for the router",
+                    "name": "ip6dns2",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the router",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of nics associated with the router",
+                    "name": "nic",
+                    "response": [
+                        {
+                            "description": "the cidr of IPv6 network",
+                            "name": "ip6cidr",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the gateway of the nic",
+                            "name": "gateway",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the traffic type of the nic",
+                            "name": "traffictype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the NSX Logical Switch (if NSX based), null otherwise",
+                            "name": "nsxlogicalswitch",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the gateway of IPv6 network",
+                            "name": "ip6gateway",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the vm to which the nic belongs",
+                            "name": "virtualmachineid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if nic is default, false otherwise",
+                            "name": "macaddress",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the Secondary ipv4 addr of nic",
+                            "name": "secondaryip",
+                            "type": "list"
+                        },
+                        {
+                            "description": "the ip address of the nic",
+                            "name": "ipaddress",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the netmask of the nic",
+                            "name": "netmask",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the name of the corresponding network",
+                            "name": "networkname",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the isolation uri of the nic",
+                            "name": "isolationuri",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the nic",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "device id for the network when plugged into the virtual machine",
+                            "name": "deviceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the IPv6 address of network",
+                            "name": "ip6address",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the corresponding network",
+                            "name": "networkid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the broadcast uri of the nic",
+                            "name": "broadcasturi",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the type of the nic",
+                            "name": "type",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if nic is default, false otherwise",
+                            "name": "isdefault",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "Id of the NSX Logical Switch Port (if NSX based), null otherwise",
+                            "name": "nsxlogicalswitchport",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "if this router is an redundant virtual router",
+                    "name": "isredundantrouter",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the name of the service offering of the virtual machine",
+                    "name": "serviceofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone ID for the router",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the host ID for the router",
+                    "name": "hostid",
+                    "type": "string"
+                },
+                {
+                    "description": "the first IPv6 DNS for the router",
+                    "name": "ip6dns1",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain ID associated with the router",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the guest IP address for the router",
+                    "name": "guestipaddress",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Updates a disk offering.",
+            "isasync": false,
+            "name": "updateDiskOffering",
+            "params": [
+                {
+                    "description": "an optional field, whether to display the offering to the end user or not.",
+                    "length": 255,
+                    "name": "displayoffering",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "updates name of the disk offering with this value",
+                    "length": 255,
+                    "name": "name",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "ID of the disk offering",
+                    "length": 255,
+                    "name": "id",
+                    "related": "updateDiskOffering,createDiskOffering,listDiskOfferings",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "sort key of the disk offering, integer",
+                    "length": 255,
+                    "name": "sortkey",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "updates alternate display text of the disk offering with this value",
+                    "length": 4096,
+                    "name": "displaytext",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "createDiskOffering,listDiskOfferings",
+            "response": [
+                {
+                    "description": "the tags for the disk offering",
+                    "name": "tags",
+                    "type": "string"
+                },
+                {
+                    "description": "the min iops of the disk offering",
+                    "name": "miniops",
+                    "type": "long"
+                },
+                {
+                    "description": "true if disk offering uses custom iops, false otherwise",
+                    "name": "iscustomizediops",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the size of the disk offering in GB",
+                    "name": "disksize",
+                    "type": "long"
+                },
+                {
+                    "description": "the date this disk offering was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the max iops of the disk offering",
+                    "name": "maxiops",
+                    "type": "long"
+                },
+                {
+                    "description": "the domain ID this disk offering belongs to. Ignore this information as it is not currently applicable.",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the cache mode to use for this disk offering. none, writeback or writethrough",
+                    "name": "cacheMode",
+                    "type": "string"
+                },
+                {
+                    "description": "the storage type for this disk offering",
+                    "name": "storagetype",
+                    "type": "string"
+                },
+                {
+                    "description": "an alternate display text of the disk offering.",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "provisioning type used to create volumes. Valid values are thin, sparse, fat.",
+                    "name": "provisioningtype",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the disk offering",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "true if disk offering uses custom size, false otherwise",
+                    "name": "iscustomized",
+                    "type": "boolean"
+                },
+                {
+                    "description": "bytes read rate of the disk offering",
+                    "name": "diskBytesReadRate",
+                    "type": "long"
+                },
+                {
+                    "description": "unique ID of the disk offering",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain name this disk offering belongs to. Ignore this information as it is not currently applicable.",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "Hypervisor snapshot reserve space as a percent of a volume (for managed storage using Xen or VMware)",
+                    "name": "hypervisorsnapshotreserve",
+                    "type": "integer"
+                },
+                {
+                    "description": "io requests read rate of the disk offering",
+                    "name": "diskIopsReadRate",
+                    "type": "long"
+                },
+                {
+                    "description": "io requests write rate of the disk offering",
+                    "name": "diskIopsWriteRate",
+                    "type": "long"
+                },
+                {
+                    "description": "bytes write rate of the disk offering",
+                    "name": "diskBytesWriteRate",
+                    "type": "long"
+                },
+                {
+                    "description": "whether to display the offering to the end user or not.",
+                    "name": "displayoffering",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": " delete a SRX firewall device",
+            "isasync": true,
+            "name": "deleteSrxFirewall",
+            "params": [
+                {
+                    "description": "srx firewall device ID",
+                    "length": 255,
+                    "name": "fwdeviceid",
+                    "related": "configureSrxFirewall",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "Adds account to a project",
+            "isasync": true,
+            "name": "addAccountToProject",
+            "params": [
+                {
+                    "description": "ID of the project to add the account to",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "listProjectAccounts,suspendProject,activateProject,updateProject,createProject,listProjects",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "email to which invitation to the project is going to be sent",
+                    "length": 255,
+                    "name": "email",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "name of the account to be added to the project",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "response": [
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                },
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                }
+            ],
+            "since": "3.0.0"
+        },
+        {
+            "description": "Lists all available snapshots for the account.",
+            "isasync": false,
+            "name": "listSnapshots",
+            "params": [
+                {
+                    "description": "valid values are HOURLY, DAILY, WEEKLY, and MONTHLY.",
+                    "length": 255,
+                    "name": "intervaltype",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.",
+                    "length": 255,
+                    "name": "isrecursive",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "lists snapshot by snapshot ID",
+                    "length": 255,
+                    "name": "id",
+                    "related": "listSnapshots,createSnapshot,revertSnapshot",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "If set to false, list only resources belonging to the command's caller; if set to true - list resources that the caller is authorized to see. Default value is false",
+                    "length": 255,
+                    "name": "listall",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "list resources by account. Must be used with the domainId parameter.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "list objects by project",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "listProjectAccounts,suspendProject,activateProject,updateProject,createProject,listProjects",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "List resources by tags (key/value pairs)",
+                    "length": 255,
+                    "name": "tags",
+                    "required": false,
+                    "type": "map"
+                },
+                {
+                    "description": "lists snapshot by snapshot name",
+                    "length": 255,
+                    "name": "name",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "list only resources belonging to the domain specified",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "updateDomain,createDomain,listDomains,listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "the ID of the disk volume",
+                    "length": 255,
+                    "name": "volumeid",
+                    "related": "detachVolume,listVolumes,updateVolume,attachVolume,resizeVolume,updateVolume,migrateVolume,createVolume,listVolumes,uploadVolume,attachVolume,detachVolume,resizeVolume,migrateVolume,createVolume",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the IDs of the snapshots, mutually exclusive with id",
+                    "length": 255,
+                    "name": "ids",
+                    "related": "listSnapshots,createSnapshot,revertSnapshot",
+                    "required": false,
+                    "since": "4.9",
+                    "type": "list"
+                },
+                {
+                    "description": "valid values are MANUAL or RECURRING.",
+                    "length": 255,
+                    "name": "snapshottype",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "list snapshots by zone id",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones,listZones,createZone,updateZone",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "createSnapshot,revertSnapshot",
+            "response": [
+                {
+                    "description": "ID of the snapshot",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "valid types are hourly, daily, weekly, monthy, template, and none.",
+                    "name": "intervaltype",
+                    "type": "string"
+                },
+                {
+                    "description": "the type of the snapshot",
+                    "name": "snapshottype",
+                    "type": "string"
+                },
+                {
+                    "description": "name of the disk volume",
+                    "name": "volumename",
+                    "type": "string"
+                },
+                {
+                    "description": "id of the availability zone",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "name of the snapshot",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain name of the snapshot's account",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the snapshot",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "physical size of backedup snapshot on image store",
+                    "name": "physicalsize",
+                    "type": "long"
+                },
+                {
+                    "description": "  the date the snapshot was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the state of the snapshot. BackedUp means that snapshot is ready to be used; Creating - the snapshot is being allocated on the primary storage; BackingUp - the snapshot is being backed up on secondary storage",
+                    "name": "state",
+                    "type": "state"
+                },
+                {
+                    "description": "the domain ID of the snapshot's account",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the snapshot",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of resource tags associated with snapshot",
+                    "name": "tags",
+                    "response": [
+                        {
+                            "description": "resource type",
+                            "name": "resourcetype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account associated with the tag",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "customer associated with the tag",
+                            "name": "customer",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain associated with the tag",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag key name",
+                            "name": "key",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag value",
+                            "name": "value",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the domain associated with the tag",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "id of the resource",
+                            "name": "resourceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project id the tag belongs to",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name where tag belongs to",
+                            "name": "project",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "type of the disk volume",
+                    "name": "volumetype",
+                    "type": "string"
+                },
+                {
+                    "description": "the account associated with the snapshot",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "ID of the disk volume",
+                    "name": "volumeid",
+                    "type": "string"
+                },
+                {
+                    "description": "indicates whether the underlying storage supports reverting the volume to this snapshot",
+                    "name": "revertable",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "Reset site to site vpn connection",
+            "isasync": true,
+            "name": "resetVpnConnection",
+            "params": [
+                {
+                    "description": "an optional domainId for connection. If the account parameter is used, domainId must also be used.",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "updateDomain,createDomain,listDomains,listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "an optional account for connection. Must be used with domainId.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "id of vpn connection",
+                    "length": 255,
+                    "name": "id",
+                    "related": "createVpnConnection,resetVpnConnection,listVpnConnections,updateVpnConnection",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "createVpnConnection,listVpnConnections,updateVpnConnection",
+            "response": [
+                {
+                    "description": "IKE policy of the customer gateway",
+                    "name": "ikepolicy",
+                    "type": "string"
+                },
+                {
+                    "description": "public ip address id of the customer gateway",
+                    "name": "gateway",
+                    "type": "string"
+                },
+                {
+                    "description": "the date and time the host was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "State of vpn connection",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the date and time the host was removed",
+                    "name": "removed",
+                    "type": "date"
+                },
+                {
+                    "description": "ESP policy of the customer gateway",
+                    "name": "esppolicy",
+                    "type": "string"
+                },
+                {
+                    "description": "Lifetime of ESP SA of customer gateway",
+                    "name": "esplifetime",
+                    "type": "long"
+                },
+                {
+                    "description": "State of vpn connection",
+                    "name": "passive",
+                    "type": "boolean"
+                },
+                {
+                    "description": "Lifetime of IKE SA of customer gateway",
+                    "name": "ikelifetime",
+                    "type": "long"
+                },
+                {
+                    "description": "the customer gateway ID",
+                    "name": "s2scustomergatewayid",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain id of the owner",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "is connection for display to the regular user",
+                    "name": "fordisplay",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the vpn gateway ID",
+                    "name": "s2svpngatewayid",
+                    "type": "string"
+                },
+                {
+                    "description": "if DPD is enabled for customer gateway",
+                    "name": "dpd",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the connection ID",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain name of the owner",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "if Force NAT Encapsulation is enabled for customer gateway",
+                    "name": "forceencap",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the project id",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "guest cidr list of the customer gateway",
+                    "name": "cidrlist",
+                    "type": "string"
+                },
+                {
+                    "description": "IPsec Preshared-Key of the customer gateway",
+                    "name": "ipsecpsk",
+                    "type": "string"
+                },
+                {
+                    "description": "the owner",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the public IP address",
+                    "name": "publicip",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Deletes a keypair by name",
+            "isasync": false,
+            "name": "deleteSSHKeyPair",
+            "params": [
+                {
+                    "description": "the account associated with the keypair. Must be used with the domainId parameter.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the domain ID associated with the keypair",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "updateDomain,createDomain,listDomains,listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the project associated with keypair",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "listProjectAccounts,suspendProject,activateProject,updateProject,createProject,listProjects",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "Name of the keypair",
+                    "length": 255,
+                    "name": "name",
+                    "required": true,
+                    "type": "string"
+                }
+            ],
+            "response": [
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                },
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Creates and automatically starts a virtual machine based on a service offering, disk offering, and template.",
+            "isasync": true,
+            "name": "createAutoScaleVmGroup",
+            "params": [
+                {
+                    "description": "the ID of the load balancer rule",
+                    "length": 255,
+                    "name": "lbruleid",
+                    "related": "listIpForwardingRules,updatePortForwardingRule,createPortForwardingRule,listPortForwardingRules",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the maximum number of members in the vmgroup, The number of instances in the vm group will be equal to or less than this number.",
+                    "length": 255,
+                    "name": "maxmembers",
+                    "required": true,
+                    "type": "integer"
+                },
+                {
+                    "description": "list of scaleup autoscale policies",
+                    "length": 255,
+                    "name": "scaleuppolicyids",
+                    "related": "updateAutoScalePolicy,listAutoScalePolicies",
+                    "required": true,
+                    "type": "list"
+                },
+                {
+                    "description": "list of scaledown autoscale policies",
+                    "length": 255,
+                    "name": "scaledownpolicyids",
+                    "related": "updateAutoScalePolicy,listAutoScalePolicies",
+                    "required": true,
+                    "type": "list"
+                },
+                {
+                    "description": "an optional field, whether to the display the group to the end user or not",
+                    "length": 255,
+                    "name": "fordisplay",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the frequency at which the conditions have to be evaluated",
+                    "length": 255,
+                    "name": "interval",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "the autoscale profile that contains information about the vms in the vm group.",
+                    "length": 255,
+                    "name": "vmprofileid",
+                    "related": "updateAutoScaleVmProfile,listAutoScaleVmProfiles,createAutoScaleVmProfile",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the minimum number of members in the vmgroup, the number of instances in the vm group will be equal to or more than this number.",
+                    "length": 255,
+                    "name": "minmembers",
+                    "required": true,
+                    "type": "integer"
+                }
+            ],
+            "related": "enableAutoScaleVmGroup,disableAutoScaleVmGroup,updateAutoScaleVmGroup,listAutoScaleVmGroups",
+            "response": [
+                {
+                    "description": "list of scaleup autoscale policies",
+                    "name": "scaleuppolicies",
+                    "type": "list"
+                },
+                {
+                    "description": "the domain name of the vm profile",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the minimum number of members in the vmgroup, the number of instances in the vm group will be equal to or more than this number.",
+                    "name": "minmembers",
+                    "type": "int"
+                },
+                {
+                    "description": "the maximum number of members in the vmgroup, The number of instances in the vm group will be equal to or less than this number.",
+                    "name": "maxmembers",
+                    "type": "int"
+                },
+                {
+                    "description": "the frequency at which the conditions have to be evaluated",
+                    "name": "interval",
+                    "type": "int"
+                },
+                {
+                    "description": "list of scaledown autoscale policies",
+                    "name": "scaledownpolicies",
+                    "type": "list"
+                },
+                {
+                    "description": "the autoscale profile that contains information about the vms in the vm group.",
+                    "name": "vmprofileid",
+                    "type": "string"
+                },
+                {
+                    "description": "the current state of the AutoScale Vm Group",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain ID of the vm profile",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the account owning the instance group",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the vm profile",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the autoscale vm group ID",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the load balancer rule ID",
+                    "name": "lbruleid",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id vm profile",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "is group for display to the regular user",
+                    "name": "fordisplay",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "Searches LDAP based on the username attribute",
+            "isasync": false,
+            "name": "searchLdap",
+            "params": [
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "query to search using",
+                    "length": 255,
+                    "name": "query",
+                    "related": "searchLdap,listLdapUsers",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                }
+            ],
+            "related": "listLdapUsers",
+            "response": [
+                {
+                    "description": "The user's domain",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "The user's username",
+                    "name": "username",
+                    "type": "string"
+                },
+                {
+                    "description": "The user's firstname",
+                    "name": "firstname",
+                    "type": "string"
+                },
+                {
+                    "description": "The user's email",
+                    "name": "email",
+                    "type": "string"
+                },
+                {
+                    "description": "The user's lastname",
+                    "name": "lastname",
+                    "type": "string"
+                },
+                {
+                    "description": "The user's principle",
+                    "name": "principal",
+                    "type": "string"
+                }
+            ],
+            "since": "4.2.0"
+        },
+        {
+            "description": "Deletes a load balancer rule.",
+            "isasync": true,
+            "name": "deleteLoadBalancerRule",
+            "params": [
+                {
+                    "description": "the ID of the load balancer rule",
+                    "length": 255,
+                    "name": "id",
+                    "related": "listIpForwardingRules,updatePortForwardingRule,createPortForwardingRule,listPortForwardingRules",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "add a baremetal ping pxe server",
+            "isasync": true,
+            "name": "addBaremetalPxePingServer",
+            "params": [
+                {
+                    "description": "Tftp root directory of PXE server",
+                    "length": 255,
+                    "name": "tftpdir",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "Password of PING storage server",
+                    "length": 255,
+                    "name": "pingcifspassword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "Root directory on PING storage server",
+                    "length": 255,
+                    "name": "pingdir",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "Username of PING storage server",
+                    "length": 255,
+                    "name": "pingcifsusername",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "Pod Id",
+                    "length": 255,
+                    "name": "podid",
+                    "related": "updatePod",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "type of pxe device",
+                    "length": 255,
+                    "name": "pxeservertype",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "Credentials to reach external pxe device",
+                    "length": 255,
+                    "name": "username",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "Credentials to reach external pxe device",
+                    "length": 255,
+                    "name": "password",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the Physical Network ID",
+                    "length": 255,
+                    "name": "physicalnetworkid",
+                    "related": "updatePhysicalNetwork,createPhysicalNetwork",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "URL of the external pxe device",
+                    "length": 255,
+                    "name": "url",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "PING storage server ip",
+                    "length": 255,
+                    "name": "pingstorageserverip",
+                    "required": true,
+                    "type": "string"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "Root directory on PING storage server",
+                    "name": "pingdir",
+                    "type": "string"
+                },
+                {
+                    "description": "Tftp root directory of PXE server",
+                    "name": "tftpdir",
+                    "type": "string"
+                },
+                {
+                    "description": "PING storage server ip",
+                    "name": "pingstorageserverip",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "list portable IP ranges",
+            "isasync": false,
+            "name": "listPortableIpRanges",
+            "params": [
+                {
+                    "description": "Id of a Region",
+                    "length": 255,
+                    "name": "regionid",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "Id of the portable ip range",
+                    "length": 255,
+                    "name": "id",
+                    "related": "listPortableIpRanges,createPortableIpRange",
+                    "required": false,
+                    "type": "uuid"
+                }
+            ],
+            "related": "createPortableIpRange",
+            "response": [
+                {
+                    "description": "List of portable IP and association with zone/network/vpc details that are part of GSLB rule",
+                    "name": "portableipaddress",
+                    "response": [
+                        {
+                            "description": "Region Id in which global load balancer is created",
+                            "name": "regionid",
+                            "type": "integer"
+                        },
+                        {
+                            "description": "the physical network this belongs to",
+                            "name": "physicalnetworkid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the Network where ip belongs to",
+                            "name": "networkid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "date the portal IP address was acquired",
+                            "name": "allocated",
+                            "type": "date"
+                        },
+                        {
+                            "description": "the ID of the zone the public IP address belongs to",
+                            "name": "zoneid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain ID the portable IP address is associated with",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "State of the ip address. Can be: Allocatin, Allocated and Releasing",
+                            "name": "state",
+                            "type": "string"
+                        },
+                        {
+                            "description": "public IP address",
+                            "name": "ipaddress",
+                            "type": "string"
+                        },
+                        {
+                            "description": "VPC the ip belongs to",
+                            "name": "vpcid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account ID the portable IP address is associated with",
+                            "name": "accountid",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "portable IP range ID",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the gateway of the VLAN IP range",
+                    "name": "gateway",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID or VID of the VLAN.",
+                    "name": "vlan",
+                    "type": "string"
+                },
+                {
+                    "description": "the start ip of the portable IP range",
+                    "name": "startip",
+                    "type": "string"
+                },
+                {
+                    "description": "the end ip of the portable IP range",
+                    "name": "endip",
+                    "type": "string"
+                },
+                {
+                    "description": "Region Id in which portable ip range is provisioned",
+                    "name": "regionid",
+                    "type": "integer"
+                },
+                {
+                    "description": "the netmask of the VLAN IP range",
+                    "name": "netmask",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Returns user data associated with the VM",
+            "isasync": false,
+            "name": "getVirtualMachineUserData",
+            "params": [
+                {
+                    "description": "The ID of the virtual machine",
+                    "length": 255,
+                    "name": "virtualmachineid",
+                    "related": "updateVMAffinityGroup,detachIso,resetSSHKeyForVirtualMachine,resetSSHKeyForVirtualMachine,migrateVirtualMachineWithVolume,attachIso,removeNicFromVirtualMachine,updateVirtualMachine,recoverVirtualMachine,migrateVirtualMachine,resetPasswordForVirtualMachine,revertToVMSnapshot,assignVirtualMachine,updateVMAffinityGroup,listVirtualMachines,rebootVirtualMachine,restoreVirtualMachine,destroyVirtualMachine,stopVirtualMachine,deployVirtualMachine,detachIso,deployVirtualMachine,updateDefaultNicForVirtualMachine,updateVirtualMachine,revertToVMSnapshot,addNicToVirtualMachine,tmDestroyVirtualMachine,resetPasswordForVirtualMachine,startVirtualMachine,updateDefaultNicForVirtualMachine,startVirtualMachine,attachIso,listVirtualMachines,addNicToVirtualMachine,stopVirtualMachine,destroyVirtualMachine,removeNicFromVirtualMachine,changeServiceForVirtualMachine",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the ID of the virtual machine",
+                    "name": "virtualmachineid",
+                    "type": "string"
+                },
+                {
+                    "description": "Base 64 encoded VM user data",
+                    "name": "userdata",
+                    "type": "string"
+                }
+            ],
+            "since": "4.4"
+        },
+        {
+            "description": "Lists all configurations.",
+            "isasync": false,
+            "name": "listConfigurations",
+            "params": [
+                {
+                    "description": "the ID of the Account to update the parameter value for corresponding account",
+                    "length": 255,
+                    "name": "accountid",
+                    "related": "disableAccount,listAccounts,markDefaultZoneForAccount,listAccounts,enableAccount,updateAccount,createAccount",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "lists configurations by category",
+                    "length": 255,
+                    "name": "category",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the Storage pool to update the parameter value for corresponding storage pool",
+                    "length": 255,
+                    "name": "storageid",
+                    "related": "createStoragePool,listStoragePools,findStoragePoolsForMigration,enableStorageMaintenance,cancelStorageMaintenance",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the ID of the Cluster to update the parameter value for corresponding cluster",
+                    "length": 255,
+                    "name": "clusterid",
+                    "related": "addCluster,updateCluster",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "lists configuration by name",
+                    "length": 255,
+                    "name": "name",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the Zone to update the parameter value for corresponding zone",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones,listZones,createZone,updateZone",
+                    "required": false,
+                    "type": "uuid"
+                }
+            ],
+            "related": "updateConfiguration",
+            "response": [
+                {
+                    "description": "the description of the configuration",
+                    "name": "description",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the configuration",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the value of the configuration",
+                    "name": "value",
+                    "type": "string"
+                },
+                {
+                    "description": "the category of the configuration",
+                    "name": "category",
+                    "type": "string"
+                },
+                {
+                    "description": "the value of the configuration",
+                    "name": "id",
+                    "type": "long"
+                },
+                {
+                    "description": "scope(zone/cluster/pool/account) of the parameter that needs to be updated",
+                    "name": "scope",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Disables static rule for given IP address",
+            "isasync": true,
+            "name": "disableStaticNat",
+            "params": [
+                {
+                    "description": "the public IP address ID for which static NAT feature is being disabled",
+                    "length": 255,
+                    "name": "ipaddressid",
+                    "related": "associateIpAddress,restartNetwork,updateIpAddress,associateIpAddress,listPublicIpAddresses,listPublicIpAddresses",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "Assigns secondary IP to NIC",
+            "isasync": true,
+            "name": "addIpToNic",
+            "params": [
+                {
+                    "description": "Secondary IP Address",
+                    "length": 255,
+                    "name": "ipaddress",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the nic to which you want to assign private IP",
+                    "length": 255,
+                    "name": "nicid",
+                    "related": "listNics",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "Secondary IP address",
+                    "name": "ipaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the secondary private IP addr",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the network",
+                    "name": "networkid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the nic",
+                    "name": "nicid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the vm",
+                    "name": "virtualmachineid",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Delete a Ucs manager",
+            "isasync": false,
+            "name": "deleteUcsManager",
+            "params": [
+                {
+                    "description": "ucs manager id",
+                    "length": 255,
+                    "name": "ucsmanagerid",
+                    "related": "addUcsManager,listUcsManagers",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "Deletes a vm group",
+            "isasync": false,
+            "name": "deleteInstanceGroup",
+            "params": [
+                {
+                    "description": "the ID of the instance group",
+                    "length": 255,
+                    "name": "id",
+                    "related": "createInstanceGroup,listInstanceGroups,updateInstanceGroup",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                },
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Deletes a host.",
+            "isasync": false,
+            "name": "deleteHost",
+            "params": [
+                {
+                    "description": "the host ID",
+                    "length": 255,
+                    "name": "id",
+                    "related": "addBaremetalHost,listExternalLoadBalancers,prepareHostForMaintenance,reconnectHost,addHost,cancelHostMaintenance",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "Force destroy local storage on this host. All VMs created on this local storage will be destroyed",
+                    "length": 255,
+                    "name": "forcedestroylocalstorage",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "Force delete the host. All HA enabled vms running on the host will be put to HA; HA disabled ones will be stopped",
+                    "length": 255,
+                    "name": "forced",
+                    "required": false,
+                    "type": "boolean"
+                }
+            ],
+            "response": [
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                },
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Lists capabilities",
+            "isasync": false,
+            "name": "listCapabilities",
+            "params": [
+
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "version of the cloud stack",
+                    "name": "cloudstackversion",
+                    "type": "string"
+                },
+                {
+                    "description": "Max allowed number of api requests within the specified interval",
+                    "name": "apilimitmax",
+                    "type": "integer"
+                },
+                {
+                    "description": "true if user and domain admins can set templates to be shared, false otherwise",
+                    "name": "userpublictemplateenabled",
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if region wide secondary is enabled, false otherwise",
+                    "name": "regionsecondaryenabled",
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if the user can recover and expunge virtualmachines, false otherwise",
+                    "name": "allowuserexpungerecovervm",
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if security groups support is enabled, false otherwise",
+                    "name": "securitygroupsenabled",
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if regular user is allowed to create projects",
+                    "name": "allowusercreateprojects",
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if dynamic role-based api checker is enabled, false otherwise",
+                    "name": "dynamicrolesenabled",
+                    "type": "boolean"
+                },
+                {
+                    "description": "maximum size that can be specified when create disk from disk offering with custom size",
+                    "name": "customdiskofferingmaxsize",
+                    "type": "long"
+                },
+                {
+                    "description": "true if snapshot is supported for KVM host, false otherwise",
+                    "name": "kvmsnapshotenabled",
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if region supports elastic load balancer on basic zones",
+                    "name": "supportELB",
+                    "type": "string"
+                },
+                {
+                    "description": "If invitation confirmation is required when add account to project",
+                    "name": "projectinviterequired",
+                    "type": "boolean"
+                },
+                {
+                    "description": "minimum size that can be specified when create disk from disk offering with custom size",
+                    "name": "customdiskofferingminsize",
+                    "type": "long"
+                },
+                {
+                    "description": "true if the user is allowed to view destroyed virtualmachines, false otherwise",
+                    "name": "allowuserviewdestroyedvm",
+                    "type": "boolean"
+                },
+                {
+                    "description": "time interval (in seconds) to reset api count",
+                    "name": "apilimitinterval",
+                    "type": "integer"
+                }
+            ]
+        },
+        {
+            "description": "Release dedication of zone",
+            "isasync": true,
+            "name": "releaseDedicatedZone",
+            "params": [
+                {
+                    "description": "the ID of the Zone",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones,listZones,createZone,updateZone",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                },
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Updates traffic type of a physical network",
+            "isasync": true,
+            "name": "updateTrafficType",
+            "params": [
+                {
+                    "description": "The network name label of the physical device dedicated to this traffic on a KVM host",
+                    "length": 255,
+                    "name": "kvmnetworklabel",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "The network name of the physical device dedicated to this traffic on an OVM3 host",
+                    "length": 255,
+                    "name": "ovm3networklabel",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "traffic type id",
+                    "length": 255,
+                    "name": "id",
+                    "related": "updateTrafficType,addTrafficType",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "The network name label of the physical device dedicated to this traffic on a XenServer host",
+                    "length": 255,
+                    "name": "xennetworklabel",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "The network name label of the physical device dedicated to this traffic on a VMware host",
+                    "length": 255,
+                    "name": "vmwarenetworklabel",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "The network name label of the physical device dedicated to this traffic on a Hyperv host",
+                    "length": 255,
+                    "name": "hypervnetworklabel",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "addTrafficType",
+            "response": [
+                {
+                    "description": "the physical network this belongs to",
+                    "name": "physicalnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "The network name of the physical device dedicated to this traffic on an OVM3 host",
+                    "name": "ovm3networklabel",
+                    "type": "string"
+                },
+                {
+                    "description": "The network name label of the physical device dedicated to this traffic on a XenServer host",
+                    "name": "xennetworklabel",
+                    "type": "string"
+                },
+                {
+                    "description": "the trafficType to be added to the physical network",
+                    "name": "traffictype",
+                    "type": "string"
+                },
+                {
+                    "description": "The network name label of the physical device dedicated to this traffic on a HyperV host",
+                    "name": "hypervnetworklabel",
+                    "type": "string"
+                },
+                {
+                    "description": "The network name label of the physical device dedicated to this traffic on a VMware host",
+                    "name": "vmwarenetworklabel",
+                    "type": "string"
+                },
+                {
+                    "description": "id of the network provider",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "The network name label of the physical device dedicated to this traffic on a KVM host",
+                    "name": "kvmnetworklabel",
+                    "type": "string"
+                }
+            ],
+            "since": "3.0.0"
+        },
+        {
+            "description": "List Conditions for the specific user",
+            "isasync": false,
+            "name": "listConditions",
+            "params": [
+                {
+                    "description": "defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.",
+                    "length": 255,
+                    "name": "isrecursive",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "If set to false, list only resources belonging to the command's caller; if set to true - list resources that the caller is authorized to see. Default value is false",
+                    "length": 255,
+                    "name": "listall",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "ID of the Condition.",
+                    "length": 255,
+                    "name": "id",
+                    "related": "createCondition,listConditions",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the ID of the policy",
+                    "length": 255,
+                    "name": "policyid",
+                    "related": "updateAutoScalePolicy,listAutoScalePolicies",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "Counter-id of the condition.",
+                    "length": 255,
+                    "name": "counterid",
+                    "related": "createCounter,listCounters",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list resources by account. Must be used with the domainId parameter.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "list only resources belonging to the domain specified",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "updateDomain,createDomain,listDomains,listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                }
+            ],
+            "related": "createCondition",
+            "response": [
+                {
+                    "description": "the domain id of the Condition owner",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "zone id of counter",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "Relational Operator to be used with threshold.",
+                    "name": "relationaloperator",
+                    "type": "string"
+                },
+                {
+                    "description": "the owner of the Condition.",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the id of the Condition",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the Condition.",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "Details of the Counter.",
+                    "name": "counter",
+                    "type": "list"
+                },
+                {
+                    "description": "Threshold Value for the counter.",
+                    "name": "threshold",
+                    "type": "long"
+                },
+                {
+                    "description": "the domain name of the owner.",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the Condition",
+                    "name": "project",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Updates a network serviceProvider of a physical network",
+            "isasync": true,
+            "name": "updateNetworkServiceProvider",
+            "params": [
+                {
+                    "description": "network service provider id",
+                    "length": 255,
+                    "name": "id",
+                    "related": "updateNetworkServiceProvider,addNetworkServiceProvider,listNetworkServiceProviders,listTrafficTypes",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "Enabled/Disabled/Shutdown the physical network service provider",
+                    "length": 255,
+                    "name": "state",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the list of services to be enabled for this physical network service provider",
+                    "length": 255,
+                    "name": "servicelist",
+                    "required": false,
+                    "type": "list"
+                }
+            ],
+            "related": "addNetworkServiceProvider,listNetworkServiceProviders,listTrafficTypes",
+            "response": [
+                {
+                    "description": "true if individual services can be enabled/disabled",
+                    "name": "canenableindividualservice",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the provider name",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the destination physical network",
+                    "name": "destinationphysicalnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "state of the network provider",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "uuid of the network provider",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "services for this provider",
+                    "name": "servicelist",
+                    "type": "list"
+                },
+                {
+                    "description": "the physical network this belongs to",
+                    "name": "physicalnetworkid",
+                    "type": "string"
+                }
+            ],
+            "since": "3.0.0"
+        },
+        {
+            "description": "Lists vm groups",
+            "isasync": false,
+            "name": "listInstanceGroups",
+            "params": [
+                {
+                    "description": "list only resources belonging to the domain specified",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "updateDomain,createDomain,listDomains,listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "list instance groups by name",
+                    "length": 255,
+                    "name": "name",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "list resources by account. Must be used with the domainId parameter.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "If set to false, list only resources belonging to the command's caller; if set to true - list resources that the caller is authorized to see. Default value is false",
+                    "length": 255,
+                    "name": "listall",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.",
+                    "length": 255,
+                    "name": "isrecursive",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "list objects by project",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "listProjectAccounts,suspendProject,activateProject,updateProject,createProject,listProjects",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list instance groups by ID",
+                    "length": 255,
+                    "name": "id",
+                    "related": "createInstanceGroup,listInstanceGroups,updateInstanceGroup",
+                    "required": false,
+                    "type": "uuid"
+                }
+            ],
+            "related": "createInstanceGroup,updateInstanceGroup",
+            "response": [
+                {
+                    "description": "time and date the instance group was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the project name of the instance group",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain ID of the instance group",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the instance group",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the project ID of the instance group",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the account owning the instance group",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the instance group",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain name of the instance group",
+                    "name": "domain",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Removes a virtual machine or a list of virtual machines from a load balancer rule.",
+            "isasync": true,
+            "name": "removeFromLoadBalancerRule",
+            "params": [
+                {
+                    "description": "VM ID and IP map, vmidipmap[0].vmid=1 vmidipmap[0].ip=10.1.1.75",
+                    "length": 255,
+                    "name": "vmidipmap",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "map"
+                },
+                {
+                    "description": "the list of IDs of the virtual machines that are being removed from the load balancer rule (i.e. virtualMachineIds=1,2,3)",
+                    "length": 255,
+                    "name": "virtualmachineids",
+                    "related": "updateVMAffinityGroup,detachIso,resetSSHKeyForVirtualMachine,resetSSHKeyForVirtualMachine,migrateVirtualMachineWithVolume,attachIso,removeNicFromVirtualMachine,updateVirtualMachine,recoverVirtualMachine,migrateVirtualMachine,resetPasswordForVirtualMachine,revertToVMSnapshot,assignVirtualMachine,updateVMAffinityGroup,listVirtualMachines,rebootVirtualMachine,restoreVirtualMachine,destroyVirtualMachine,stopVirtualMachine,deployVirtualMachine,detachIso,deployVirtualMachine,updateDefaultNicForVirtualMachine,updateVirtualMachine,revertToVMSnapshot,addNicToVirtualMachine,tmDestroyVirtualMachine,resetPasswordForVirtualMachine,startVirtualMachine,updateDefaultNicForVirtualMachine,startVirtualMachine,attachIso,listVirtualMachines,addNicToVirtualMachine,stopVirtualMachine,destroyVirtualMachine,removeNicFromVirtualMachine,changeServiceForVirtualMachine",
+                    "required": false,
+                    "type": "list"
+                },
+                {
+                    "description": "The ID of the load balancer rule",
+                    "length": 255,
+                    "name": "id",
+                    "related": "listIpForwardingRules,updatePortForwardingRule,createPortForwardingRule,listPortForwardingRules",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "Adds a Nuage VSP device",
+            "isasync": true,
+            "name": "addNuageVspDevice",
+            "params": [
+                {
+                    "description": "the hostname of the Nuage VSD",
+                    "length": 255,
+                    "name": "hostname",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the port to communicate to Nuage VSD",
+                    "length": 255,
+                    "name": "port",
+                    "required": true,
+                    "type": "integer"
+                },
+                {
+                    "description": "the password of CMS user in Nuage VSD",
+                    "length": 255,
+                    "name": "password",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the version of the API to use to communicate to Nuage VSD",
+                    "length": 255,
+                    "name": "apiversion",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the physical network in to which Nuage VSP is added",
+                    "length": 255,
+                    "name": "physicalnetworkid",
+                    "related": "updatePhysicalNetwork,createPhysicalNetwork",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the user name of the CMS user in Nuage VSD",
+                    "length": 255,
+                    "name": "username",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the time to wait after failure before retrying to communicate to Nuage VSD",
+                    "length": 255,
+                    "name": "retryinterval",
+                    "required": false,
+                    "type": "long"
+                },
+                {
+                    "description": "the number of retries on failure to communicate to Nuage VSD",
+                    "length": 255,
+                    "name": "retrycount",
+                    "required": false,
+                    "type": "integer"
+                }
+            ],
+            "related": "updateNuageVspDevice,listNuageVspDevices",
+            "response": [
+                {
+                    "description": "the time to wait after failure before retrying to communicate to Nuage VSD",
+                    "name": "retryinterval",
+                    "type": "long"
+                },
+                {
+                    "description": "the hostname of the Nuage VSD",
+                    "name": "hostname",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the physical network to which this Nuage VSP belongs to",
+                    "name": "physicalnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "the CMS ID generated by the Nuage VSD",
+                    "name": "cmsid",
+                    "type": "string"
+                },
+                {
+                    "description": "the device id of the Nuage VSD",
+                    "name": "vspdeviceid",
+                    "type": "string"
+                },
+                {
+                    "description": "the service provider name corresponding to this Nuage VSP device",
+                    "name": "provider",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the Nuage VSP device",
+                    "name": "nuagedevicename",
+                    "type": "string"
+                },
+                {
+                    "description": "the version of the API to use to communicate to Nuage VSD",
+                    "name": "apiversion",
+                    "type": "string"
+                },
+                {
+                    "description": "the number of retries on failure to communicate to Nuage VSD",
+                    "name": "retrycount",
+                    "type": "int"
+                },
+                {
+                    "description": "the port to communicate to Nuage VSD",
+                    "name": "port",
+                    "type": "int"
+                }
+            ],
+            "since": "4.5"
+        },
+        {
+            "description": "Creates a static route",
+            "isasync": true,
+            "name": "createStaticRoute",
+            "params": [
+                {
+                    "description": "the gateway id we are creating static route for",
+                    "length": 255,
+                    "name": "gatewayid",
+                    "related": "createPrivateGateway",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "static route cidr",
+                    "length": 255,
+                    "name": "cidr",
+                    "required": true,
+                    "type": "string"
+                }
+            ],
+            "related": "listStaticRoutes",
+            "response": [
+                {
+                    "description": "the state of the static route",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the domain associated with the static route",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "VPC gateway the route is created for",
+                    "name": "gatewayid",
+                    "type": "string"
+                },
+                {
+                    "description": "static route CIDR",
+                    "name": "cidr",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain associated with the static route",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the account associated with the static route",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the static route",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the static route",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of resource tags associated with static route",
+                    "name": "tags",
+                    "response": [
+                        {
+                            "description": "tag key name",
+                            "name": "key",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account associated with the tag",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "customer associated with the tag",
+                            "name": "customer",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name where tag belongs to",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain associated with the tag",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag value",
+                            "name": "value",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the domain associated with the tag",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "resource type",
+                            "name": "resourcetype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "id of the resource",
+                            "name": "resourceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project id the tag belongs to",
+                            "name": "projectid",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "the ID of static route",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "VPC the static route belongs to",
+                    "name": "vpcid",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Adds traffic type to a physical network",
+            "isasync": true,
+            "name": "addTrafficType",
+            "params": [
+                {
+                    "description": "the trafficType to be added to the physical network",
+                    "length": 255,
+                    "name": "traffictype",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the Physical Network ID",
+                    "length": 255,
+                    "name": "physicalnetworkid",
+                    "related": "updatePhysicalNetwork,createPhysicalNetwork",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "The network name label of the physical device dedicated to this traffic on a VMware host",
+                    "length": 255,
+                    "name": "vmwarenetworklabel",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "The network name label of the physical device dedicated to this traffic on a XenServer host",
+                    "length": 255,
+                    "name": "xennetworklabel",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "The VLAN id to be used for Management traffic by VMware host",
+                    "length": 255,
+                    "name": "vlan",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "Used if physical network has multiple isolation types and traffic type is public. Choose which isolation method. Valid options currently 'vlan' or 'vxlan', defaults to 'vlan'.",
+                    "length": 255,
+                    "name": "isolationmethod",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "The network name of the physical device dedicated to this traffic on an OVM3 host",
+                    "length": 255,
+                    "name": "ovm3networklabel",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "The network name label of the physical device dedicated to this traffic on a KVM host",
+                    "length": 255,
+                    "name": "kvmnetworklabel",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "The network name label of the physical device dedicated to this traffic on a Hyperv host",
+                    "length": 255,
+                    "name": "hypervnetworklabel",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the trafficType to be added to the physical network",
+                    "name": "traffictype",
+                    "type": "string"
+                },
+                {
+                    "description": "The network name of the physical device dedicated to this traffic on an OVM3 host",
+                    "name": "ovm3networklabel",
+                    "type": "string"
+                },
+                {
+                    "description": "id of the network provider",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "The network name label of the physical device dedicated to this traffic on a XenServer host",
+                    "name": "xennetworklabel",
+                    "type": "string"
+                },
+                {
+                    "description": "The network name label of the physical device dedicated to this traffic on a HyperV host",
+                    "name": "hypervnetworklabel",
+                    "type": "string"
+                },
+                {
+                    "description": "the physical network this belongs to",
+                    "name": "physicalnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "The network name label of the physical device dedicated to this traffic on a VMware host",
+                    "name": "vmwarenetworklabel",
+                    "type": "string"
+                },
+                {
+                    "description": "The network name label of the physical device dedicated to this traffic on a KVM host",
+                    "name": "kvmnetworklabel",
+                    "type": "string"
+                }
+            ],
+            "since": "3.0.0"
+        },
+        {
+            "description": "Deletes a Private gateway",
+            "isasync": true,
+            "name": "deletePrivateGateway",
+            "params": [
+                {
+                    "description": "the ID of the private gateway",
+                    "length": 255,
+                    "name": "id",
+                    "related": "createPrivateGateway",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                },
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "List all virtual machine instances that are assigned to a load balancer rule.",
+            "isasync": false,
+            "name": "listLoadBalancerRuleInstances",
+            "params": [
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "true if load balancer rule VM IP information to be included; default is false",
+                    "length": 255,
+                    "name": "lbvmips",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the load balancer rule",
+                    "length": 255,
+                    "name": "id",
+                    "related": "listIpForwardingRules,updatePortForwardingRule,createPortForwardingRule,listPortForwardingRules",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "true if listing all virtual machines currently applied to the load balancer rule; default is true",
+                    "length": 255,
+                    "name": "applied",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                }
+            ],
+            "related": "listLoadBalancerRuleInstances",
+            "response": [
+                {
+                    "description": "IP addresses of the vm set of lb rule",
+                    "name": "lbvmipaddresses",
+                    "type": "list"
+                },
+                {
+                    "description": "the user vm set for lb rule",
+                    "name": "loadbalancerruleinstance",
+                    "type": "uservmresponse"
+                }
+            ]
+        },
+        {
+            "description": "Removes a condition",
+            "isasync": true,
+            "name": "deleteCondition",
+            "params": [
+                {
+                    "description": "the ID of the condition.",
+                    "length": 255,
+                    "name": "id",
+                    "related": "createCondition",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                },
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Updates a domain with a new name",
+            "isasync": false,
+            "name": "updateDomain",
+            "params": [
+                {
+                    "description": "ID of domain to update",
+                    "length": 255,
+                    "name": "id",
+                    "related": "updateDomain,createDomain,listDomains,listDomainChildren,listDomains",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "updates domain with this name",
+                    "length": 255,
+                    "name": "name",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "Network domain for the domain's networks; empty string will update domainName with NULL value",
+                    "length": 255,
+                    "name": "networkdomain",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "createDomain,listDomains,listDomainChildren,listDomains",
+            "response": [
+                {
+                    "description": "the total secondary storage space (in GiB) available to be used for this domain",
+                    "name": "secondarystorageavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of projects being administrated by this domain",
+                    "name": "projecttotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of public ip addresses allocated for this domain",
+                    "name": "iptotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total secondary storage space (in GiB) owned by domain",
+                    "name": "secondarystoragetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of virtual machines deployed by this domain",
+                    "name": "vmtotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of networks available to be created for this domain",
+                    "name": "networkavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of cpu cores available to be created for this domain",
+                    "name": "cpuavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total volume being used by this domain",
+                    "name": "volumetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the state of the domain",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of vpcs the domain can own",
+                    "name": "vpclimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of templates available to be created by this domain",
+                    "name": "templateavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of snapshots available for this domain",
+                    "name": "snapshotavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of networks the domain can own",
+                    "name": "networklimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of vpcs available to be created for this domain",
+                    "name": "vpcavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total secondary storage space (in GiB) the domain can own",
+                    "name": "secondarystoragelimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the network domain",
+                    "name": "networkdomain",
+                    "type": "string"
+                },
+                {
+                    "description": "the total volume which can be used by this domain",
+                    "name": "volumelimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total primary storage space (in GiB) available to be used for this domain",
+                    "name": "primarystorageavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain ID of the parent domain",
+                    "name": "parentdomainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of vpcs owned by domain",
+                    "name": "vpctotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of virtual machines available for this domain to acquire",
+                    "name": "vmavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of virtual machines that can be deployed by this domain",
+                    "name": "vmlimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of snapshots which can be stored by this domain",
+                    "name": "snapshotlimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total primary storage space (in GiB) the domain can own",
+                    "name": "primarystoragelimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of snapshots stored by this domain",
+                    "name": "snapshottotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of public ip addresses available for this domain to acquire",
+                    "name": "ipavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of cpu cores the domain can own",
+                    "name": "cpulimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of cpu cores owned by domain",
+                    "name": "cputotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the name of the domain",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the total memory (in MB) the domain can own",
+                    "name": "memorylimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the level of the domain",
+                    "name": "level",
+                    "type": "integer"
+                },
+                {
+                    "description": "the total number of public ip addresses this domain can acquire",
+                    "name": "iplimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total primary storage space (in GiB) owned by domain",
+                    "name": "primarystoragetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total memory (in MB) owned by domain",
+                    "name": "memorytotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the domain name of the parent domain",
+                    "name": "parentdomainname",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of templates which can be created by this domain",
+                    "name": "templatelimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total memory (in MB) available to be created for this domain",
+                    "name": "memoryavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of projects the domain can own",
+                    "name": "projectlimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total volume available for this domain",
+                    "name": "volumeavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of templates which have been created by this domain",
+                    "name": "templatetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of networks owned by domain",
+                    "name": "networktotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the ID of the domain",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the path of the domain",
+                    "name": "path",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of projects available for administration by this domain",
+                    "name": "projectavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "whether the domain has one or more sub-domains",
+                    "name": "haschild",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "Updates a physical network",
+            "isasync": true,
+            "name": "updatePhysicalNetwork",
+            "params": [
+                {
+                    "description": "the speed for the physical network[1G/10G]",
+                    "length": 255,
+                    "name": "networkspeed",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "Tag the physical network",
+                    "length": 255,
+                    "name": "tags",
+                    "required": false,
+                    "type": "list"
+                },
+                {
+                    "description": "physical network id",
+                    "length": 255,
+                    "name": "id",
+                    "related": "updatePhysicalNetwork,createPhysicalNetwork",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "Enabled/Disabled",
+                    "length": 255,
+                    "name": "state",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the VLAN for the physical network",
+                    "length": 255,
+                    "name": "vlan",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "createPhysicalNetwork",
+            "response": [
+                {
+                    "description": "the speed of the physical network",
+                    "name": "networkspeed",
+                    "type": "string"
+                },
+                {
+                    "description": "Broadcast domain range of the physical network",
+                    "name": "broadcastdomainrange",
+                    "type": "string"
+                },
+                {
+                    "description": "zone id of the physical network",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "comma separated tag",
+                    "name": "tags",
+                    "type": "string"
+                },
+                {
+                    "description": "the uuid of the physical network",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "name of the physical network",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the vlan of the physical network",
+                    "name": "vlan",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain id of the physical network owner",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "isolation methods",
+                    "name": "isolationmethods",
+                    "type": "string"
+                },
+                {
+                    "description": "state of the physical network",
+                    "name": "state",
+                    "type": "string"
+                }
+            ],
+            "since": "3.0.0"
+        },
+        {
+            "description": "Disables an AutoScale Vm Group",
+            "isasync": true,
+            "name": "disableAutoScaleVmGroup",
+            "params": [
+                {
+                    "description": "the ID of the autoscale group",
+                    "length": 255,
+                    "name": "id",
+                    "related": "enableAutoScaleVmGroup,disableAutoScaleVmGroup,updateAutoScaleVmGroup,listAutoScaleVmGroups",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "enableAutoScaleVmGroup,updateAutoScaleVmGroup,listAutoScaleVmGroups",
+            "response": [
+                {
+                    "description": "the account owning the instance group",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the autoscale profile that contains information about the vms in the vm group.",
+                    "name": "vmprofileid",
+                    "type": "string"
+                },
+                {
+                    "description": "the load balancer rule ID",
+                    "name": "lbruleid",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the vm profile",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the current state of the AutoScale Vm Group",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "is group for display to the regular user",
+                    "name": "fordisplay",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the autoscale vm group ID",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the frequency at which the conditions have to be evaluated",
+                    "name": "interval",
+                    "type": "int"
+                },
+                {
+                    "description": "the domain ID of the vm profile",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the minimum number of members in the vmgroup, the number of instances in the vm group will be equal to or more than this number.",
+                    "name": "minmembers",
+                    "type": "int"
+                },
+                {
+                    "description": "the domain name of the vm profile",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "list of scaleup autoscale policies",
+                    "name": "scaleuppolicies",
+                    "type": "list"
+                },
+                {
+                    "description": "list of scaledown autoscale policies",
+                    "name": "scaledownpolicies",
+                    "type": "list"
+                },
+                {
+                    "description": "the maximum number of members in the vmgroup, The number of instances in the vm group will be equal to or less than this number.",
+                    "name": "maxmembers",
+                    "type": "int"
+                },
+                {
+                    "description": "the project id vm profile",
+                    "name": "projectid",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Creates a snapshot policy for the account.",
+            "isasync": false,
+            "name": "createSnapshotPolicy",
+            "params": [
+                {
+                    "description": "an optional field, whether to the display the policy to the end user or not",
+                    "length": 255,
+                    "name": "fordisplay",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "boolean"
+                },
+                {
+                    "description": "valid values are HOURLY, DAILY, WEEKLY, and MONTHLY",
+                    "length": 255,
+                    "name": "intervaltype",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "time the snapshot is scheduled to be taken. Format is:* if HOURLY, MM* if DAILY, MM:HH* if WEEKLY, MM:HH:DD (1-7)* if MONTHLY, MM:HH:DD (1-28)",
+                    "length": 255,
+                    "name": "schedule",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the disk volume",
+                    "length": 255,
+                    "name": "volumeid",
+                    "related": "detachVolume,listVolumes,updateVolume,attachVolume,resizeVolume,updateVolume,migrateVolume,createVolume,listVolumes,uploadVolume,attachVolume,detachVolume,resizeVolume,migrateVolume,createVolume",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "maximum number of snapshots to retain",
+                    "length": 255,
+                    "name": "maxsnaps",
+                    "required": true,
+                    "type": "integer"
+                },
+                {
+                    "description": "Specifies a timezone for this command. For more information on the timezone parameter, see Time Zone Format.",
+                    "length": 255,
+                    "name": "timezone",
+                    "required": true,
+                    "type": "string"
+                }
+            ],
+            "related": "updateSnapshotPolicy",
+            "response": [
+                {
+                    "description": "the ID of the snapshot policy",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "is this policy for display to the regular user",
+                    "name": "fordisplay",
+                    "type": "boolean"
+                },
+                {
+                    "description": "maximum number of snapshots retained",
+                    "name": "maxsnaps",
+                    "type": "int"
+                },
+                {
+                    "description": "the ID of the disk volume",
+                    "name": "volumeid",
+                    "type": "string"
+                },
+                {
+                    "description": "time the snapshot is scheduled to be taken.",
+                    "name": "schedule",
+                    "type": "string"
+                },
+                {
+                    "description": "the interval type of the snapshot policy",
+                    "name": "intervaltype",
+                    "type": "short"
+                },
+                {
+                    "description": "the time zone of the snapshot policy",
+                    "name": "timezone",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "delete a nuage vsp device",
+            "isasync": true,
+            "name": "deleteNuageVspDevice",
+            "params": [
+                {
+                    "description": "Nuage device ID",
+                    "length": 255,
+                    "name": "vspdeviceid",
+                    "related": "updateNuageVspDevice,listNuageVspDevices",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                }
+            ],
+            "since": "4.5"
+        },
+        {
+            "description": "Adds a API permission to a role",
+            "isasync": false,
+            "name": "createRolePermission",
+            "params": [
+                {
+                    "description": "The rule permission, allow or deny. Default: deny.",
+                    "length": 255,
+                    "name": "permission",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "The API name or wildcard rule such as list*",
+                    "length": 255,
+                    "name": "rule",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "ID of the role",
+                    "length": 255,
+                    "name": "roleid",
+                    "related": "listRoles,createRole",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "The description of the role permission",
+                    "length": 255,
+                    "name": "description",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "listRolePermissions",
+            "response": [
+                {
+                    "description": "the name of the role to which the role permission belongs",
+                    "name": "rolename",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the role to which the role permission belongs",
+                    "name": "roleid",
+                    "type": "string"
+                },
+                {
+                    "description": "the api name or wildcard rule",
+                    "name": "rule",
+                    "type": "string"
+                },
+                {
+                    "description": "the permission type of the api name or wildcard rule, allow/deny",
+                    "name": "permission",
+                    "type": "string"
+                },
+                {
+                    "description": "the description of the role permission",
+                    "name": "description",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the role permission",
+                    "name": "id",
+                    "type": "string"
+                }
+            ],
+            "since": "4.9.0"
+        },
+        {
+            "description": "List system virtual machines.",
+            "isasync": false,
+            "name": "listSystemVms",
+            "params": [
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the system VM",
+                    "length": 255,
+                    "name": "id",
+                    "related": "changeServiceForSystemVm,migrateSystemVm,listSystemVms,startSystemVm",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the system VM type. Possible types are \"consoleproxy\" and \"secondarystoragevm\".",
+                    "length": 255,
+                    "name": "systemvmtype",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "the Pod ID of the system VM",
+                    "length": 255,
+                    "name": "podid",
+                    "related": "updatePod",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the state of the system VM",
+                    "length": 255,
+                    "name": "state",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone ID of the system VM",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones,listZones,createZone,updateZone",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the host ID of the system VM",
+                    "length": 255,
+                    "name": "hostid",
+                    "related": "addBaremetalHost,listExternalLoadBalancers,prepareHostForMaintenance,reconnectHost,addHost,cancelHostMaintenance",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the storage ID where vm's volumes belong to",
+                    "length": 255,
+                    "name": "storageid",
+                    "related": "createStoragePool,listStoragePools,findStoragePoolsForMigration,enableStorageMaintenance,cancelStorageMaintenance",
+                    "required": false,
+                    "since": "3.0.1",
+                    "type": "uuid"
+                },
+                {
+                    "description": "the name of the system VM",
+                    "length": 255,
+                    "name": "name",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "changeServiceForSystemVm,migrateSystemVm,startSystemVm",
+            "response": [
+                {
+                    "description": "the public netmask for the system VM",
+                    "name": "publicnetmask",
+                    "type": "string"
+                },
+                {
+                    "description": "the Pod ID for the system VM",
+                    "name": "podid",
+                    "type": "string"
+                },
+                {
+                    "description": "the hypervisor on which the template runs",
+                    "name": "hypervisor",
+                    "type": "string"
+                },
+                {
+                    "description": "the link local MAC address for the system vm",
+                    "name": "linklocalmacaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the network domain for the system VM",
+                    "name": "networkdomain",
+                    "type": "string"
+                },
+                {
+                    "description": "the public IP address for the system VM",
+                    "name": "publicip",
+                    "type": "string"
+                },
+                {
+                    "description": "the job ID associated with the system VM. This is only displayed if the router listed is part of a currently running asynchronous job.",
+                    "name": "jobid",
+                    "type": "string"
+                },
+                {
+                    "description": "the host ID for the system VM",
+                    "name": "hostid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the system VM",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the system VM type",
+                    "name": "systemvmtype",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the system VM",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the private IP address for the system VM",
+                    "name": "privateip",
+                    "type": "string"
+                },
+                {
+                    "description": "the link local IP address for the system vm",
+                    "name": "linklocalip",
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone name for the system VM",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the gateway for the system VM",
+                    "name": "gateway",
+                    "type": "string"
+                },
+                {
+                    "description": "the hostname for the system VM",
+                    "name": "hostname",
+                    "type": "string"
+                },
+                {
+                    "description": "the number of active console sessions for the console proxy system vm",
+                    "name": "activeviewersessions",
+                    "type": "integer"
+                },
+                {
+                    "description": "the private netmask for the system VM",
+                    "name": "privatenetmask",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of the system VM",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the first DNS for the system VM",
+                    "name": "dns1",
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone ID for the system VM",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the private MAC address for the system VM",
+                    "name": "privatemacaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the second DNS for the system VM",
+                    "name": "dns2",
+                    "type": "string"
+                },
+                {
+                    "description": "the job status associated with the system VM.  This is only displayed if the router listed is part of a currently running asynchronous job.",
+                    "name": "jobstatus",
+                    "type": "integer"
+                },
+                {
+                    "description": "the public MAC address for the system VM",
+                    "name": "publicmacaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the date and time the system VM was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the template ID for the system VM",
+                    "name": "templateid",
+                    "type": "string"
+                },
+                {
+                    "description": "the link local netmask for the system vm",
+                    "name": "linklocalnetmask",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Creates a project",
+            "isasync": true,
+            "name": "createProject",
+            "params": [
+                {
+                    "description": "domain ID of the account owning a project",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "createDomain,listDomains,listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "account who will be Admin for the project",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "display text of the project",
+                    "length": 255,
+                    "name": "displaytext",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "name of the project",
+                    "length": 255,
+                    "name": "name",
+                    "required": true,
+                    "type": "string"
+                }
+            ],
+            "related": "listProjectAccounts,suspendProject,activateProject,updateProject,listProjects",
+            "response": [
+                {
+                    "description": "the account name of the project's owner",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of vpcs the project can own",
+                    "name": "vpclimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total volume being used by this project",
+                    "name": "volumetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of templates which have been created by this project",
+                    "name": "templatetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of virtual machines available for this project to acquire",
+                    "name": "vmavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of virtual machines stopped for this project",
+                    "name": "vmstopped",
+                    "type": "integer"
+                },
+                {
+                    "description": "the total memory (in MB) owned by project",
+                    "name": "memorytotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total memory (in MB) available to be created for this project",
+                    "name": "memoryavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total secondary storage space (in GiB) the project can own",
+                    "name": "secondarystoragelimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of public ip addresses allocated for this project",
+                    "name": "iptotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total memory (in MB) the project can own",
+                    "name": "memorylimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of templates available to be created by this project",
+                    "name": "templateavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of virtual machines running for this project",
+                    "name": "vmrunning",
+                    "type": "integer"
+                },
+                {
+                    "description": "the total number of vpcs available to be created for this project",
+                    "name": "vpcavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of virtual machines that can be deployed by this project",
+                    "name": "vmlimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain id the project belongs to",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the total primary storage space (in GiB) owned by project",
+                    "name": "primarystoragetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total volume which can be used by this project",
+                    "name": "volumelimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of virtual machines deployed by this project",
+                    "name": "vmtotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of networks available to be created for this project",
+                    "name": "networkavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of public ip addresses this project can acquire",
+                    "name": "iplimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of the project",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the total secondary storage space (in GiB) available to be used for this project",
+                    "name": "secondarystorageavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of public ip addresses available for this project to acquire",
+                    "name": "ipavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of snapshots stored by this project",
+                    "name": "snapshottotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of snapshots available for this project",
+                    "name": "snapshotavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of cpu cores available to be created for this project",
+                    "name": "cpuavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the displaytext of the project",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of resource tags associated with vm",
+                    "name": "tags",
+                    "response": [
+                        {
+                            "description": "the project id the tag belongs to",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "resource type",
+                            "name": "resourcetype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "id of the resource",
+                            "name": "resourceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "customer associated with the tag",
+                            "name": "customer",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the domain associated with the tag",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag key name",
+                            "name": "key",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name where tag belongs to",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag value",
+                            "name": "value",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account associated with the tag",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain associated with the tag",
+                            "name": "domain",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "the total number of networks the project can own",
+                    "name": "networklimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the project",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of snapshots which can be stored by this project",
+                    "name": "snapshotlimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total primary storage space (in GiB) available to be used for this project",
+                    "name": "primarystorageavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain name where the project belongs to",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of vpcs owned by project",
+                    "name": "vpctotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total volume available for this project",
+                    "name": "volumeavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of templates which can be created by this project",
+                    "name": "templatelimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total primary storage space (in GiB) the project can own",
+                    "name": "primarystoragelimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of cpu cores the project can own",
+                    "name": "cpulimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the id of the project",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the total secondary storage space (in GiB) owned by project",
+                    "name": "secondarystoragetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of cpu cores owned by project",
+                    "name": "cputotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of networks owned by project",
+                    "name": "networktotal",
+                    "type": "long"
+                }
+            ],
+            "since": "3.0.0"
+        },
+        {
+            "description": "Assigns a certificate to a load balancer rule",
+            "isasync": true,
+            "name": "assignCertToLoadBalancer",
+            "params": [
+                {
+                    "description": "the ID of the load balancer rule",
+                    "length": 255,
+                    "name": "lbruleid",
+                    "related": "listIpForwardingRules,updatePortForwardingRule,createPortForwardingRule,listPortForwardingRules",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the ID of the certificate",
+                    "length": 255,
+                    "name": "certid",
+                    "related": "uploadSslCert",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                },
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Adds a Cisco Vnmc Controller",
+            "isasync": false,
+            "name": "addCiscoVnmcResource",
+            "params": [
+                {
+                    "description": "the Physical Network ID",
+                    "length": 255,
+                    "name": "physicalnetworkid",
+                    "related": "createPhysicalNetwork",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "Hostname or ip address of the Cisco VNMC Controller.",
+                    "length": 255,
+                    "name": "hostname",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "Credentials to access the Cisco VNMC Controller API",
+                    "length": 255,
+                    "name": "password",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "Credentials to access the Cisco VNMC Controller API",
+                    "length": 255,
+                    "name": "username",
+                    "required": true,
+                    "type": "string"
+                }
+            ],
+            "related": "listCiscoVnmcResources",
+            "response": [
+                {
+
+                },
+                {
+
+                },
+                {
+
+                },
+                {
+
+                },
+                {
+
+                }
+            ]
+        },
+        {
+            "description": "Replaces ACL associated with a network or private gateway",
+            "isasync": true,
+            "name": "replaceNetworkACLList",
+            "params": [
+                {
+                    "description": "the ID of the network ACL",
+                    "length": 255,
+                    "name": "aclid",
+                    "related": "createNetworkACLList,listNetworkACLLists",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the ID of the private gateway",
+                    "length": 255,
+                    "name": "gatewayid",
+                    "related": "createPrivateGateway",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the ID of the network",
+                    "length": 255,
+                    "name": "networkid",
+                    "related": "createNetwork,updateNetwork,listSrxFirewallNetworks,updateNetwork,listBrocadeVcsDeviceNetworks,listNiciraNvpDeviceNetworks,createNetwork,listNetworks,listNetscalerLoadBalancerNetworks,listF5LoadBalancerNetworks,listPaloAltoFirewallNetworks",
+                    "required": false,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "Detaches a disk volume from a virtual machine.",
+            "isasync": true,
+            "name": "detachVolume",
+            "params": [
+                {
+                    "description": "the ID of the disk volume",
+                    "length": 255,
+                    "name": "id",
+                    "related": "detachVolume,listVolumes,updateVolume,attachVolume,resizeVolume,updateVolume,migrateVolume,createVolume,listVolumes,uploadVolume,attachVolume,detachVolume,resizeVolume,migrateVolume,createVolume",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the ID of the virtual machine where the volume is detached from",
+                    "length": 255,
+                    "name": "virtualmachineid",
+                    "related": "updateVMAffinityGroup,detachIso,resetSSHKeyForVirtualMachine,resetSSHKeyForVirtualMachine,migrateVirtualMachineWithVolume,attachIso,removeNicFromVirtualMachine,updateVirtualMachine,recoverVirtualMachine,migrateVirtualMachine,resetPasswordForVirtualMachine,revertToVMSnapshot,assignVirtualMachine,updateVMAffinityGroup,listVirtualMachines,rebootVirtualMachine,restoreVirtualMachine,destroyVirtualMachine,stopVirtualMachine,deployVirtualMachine,detachIso,deployVirtualMachine,updateDefaultNicForVirtualMachine,updateVirtualMachine,revertToVMSnapshot,addNicToVirtualMachine,tmDestroyVirtualMachine,resetPasswordForVirtualMachine,startVirtualMachine,updateDefaultNicForVirtualMachine,startVirtualMachine,attachIso,listVirtualMachines,addNicToVirtualMachine,stopVirtualMachine,destroyVirtualMachine,removeNicFromVirtualMachine,changeServiceForVirtualMachine",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the device ID on the virtual machine where volume is detached from",
+                    "length": 255,
+                    "name": "deviceid",
+                    "required": false,
+                    "type": "long"
+                }
+            ],
+            "related": "listVolumes,updateVolume,attachVolume,resizeVolume,updateVolume,migrateVolume,createVolume,listVolumes,uploadVolume,attachVolume,detachVolume,resizeVolume,migrateVolume,createVolume",
+            "response": [
+                {
+                    "description": "name of the disk volume",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "io requests write rate of the disk volume",
+                    "name": "diskIopsWriteRate",
+                    "type": "long"
+                },
+                {
+                    "description": "the display text of the disk offering",
+                    "name": "diskofferingdisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the vpn",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "name of the disk offering",
+                    "name": "diskofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "io requests read rate of the disk volume",
+                    "name": "diskIopsReadRate",
+                    "type": "long"
+                },
+                {
+                    "description": "name of the service offering for root disk",
+                    "name": "serviceofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "display name of the virtual machine",
+                    "name": "vmdisplayname",
+                    "type": "string"
+                },
+                {
+                    "description": "ID of the snapshot from which this volume was created",
+                    "name": "snapshotid",
+                    "type": "string"
+                },
+                {
+                    "description": "id of the primary storage hosting the disk volume; returned to admin user only",
+                    "name": "storageid",
+                    "type": "string"
+                },
+                {
+                    "description": "Hypervisor the volume belongs to",
+                    "name": "hypervisor",
+                    "type": "string"
+                },
+                {
+                    "description": "the date the volume was attached to a VM instance",
+                    "name": "attached",
+                    "type": "date"
+                },
+                {
+                    "description": "ID of the service offering for root disk",
+                    "name": "serviceofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "an optional field whether to the display the volume to the end user or not.",
+                    "name": "displayvolume",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the state of the disk volume",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "ID of the availability zone",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the domain associated with the disk volume",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the ISO attached to the virtual machine",
+                    "name": "isoid",
+                    "type": "string"
+                },
+                {
+                    "description": "the display text of the service offering for root disk",
+                    "name": "serviceofferingdisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "the account associated with the disk volume",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "name of the availability zone",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain associated with the disk volume",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "ID of the disk volume",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the path of the volume",
+                    "name": "path",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the template for the virtual machine",
+                    "name": "templatename",
+                    "type": "string"
+                },
+                {
+                    "description": "name of the virtual machine",
+                    "name": "vmname",
+                    "type": "string"
+                },
+                {
+                    "description": "id of the virtual machine",
+                    "name": "virtualmachineid",
+                    "type": "string"
+                },
+                {
+                    "description": "the date the disk volume was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "min iops of the disk volume",
+                    "name": "miniops",
+                    "type": "long"
+                },
+                {
+                    "description": "name of the primary storage hosting the disk volume",
+                    "name": "storage",
+                    "type": "string"
+                },
+                {
+                    "description": "bytes read rate of the disk volume",
+                    "name": "diskBytesReadRate",
+                    "type": "long"
+                },
+                {
+                    "description": "the boolean state of whether the volume is destroyed or not",
+                    "name": "destroyed",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the project name of the vpn",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "state of the virtual machine",
+                    "name": "vmstate",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the ISO attached to the virtual machine",
+                    "name": "isoname",
+                    "type": "string"
+                },
+                {
+                    "description": " an alternate display text of the template for the virtual machine",
+                    "name": "templatedisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "true if the volume is extractable, false otherwise",
+                    "name": "isextractable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "need quiesce vm or not when taking snapshot",
+                    "name": "quiescevm",
+                    "type": "boolean"
+                },
+                {
+                    "description": "size of the disk volume",
+                    "name": "size",
+                    "type": "long"
+                },
+                {
+                    "description": "bytes write rate of the disk volume",
+                    "name": "diskBytesWriteRate",
+                    "type": "long"
+                },
+                {
+                    "description": "the status of the volume",
+                    "name": "status",
+                    "type": "string"
+                },
+                {
+                    "description": "type of the disk volume (ROOT or DATADISK)",
+                    "name": "type",
+                    "type": "string"
+                },
+                {
+                    "description": "an alternate display text of the ISO attached to the virtual machine",
+                    "name": "isodisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "max iops of the disk volume",
+                    "name": "maxiops",
+                    "type": "long"
+                },
+                {
+                    "description": "ID of the disk offering",
+                    "name": "diskofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "provisioning type used to create volumes.",
+                    "name": "provisioningtype",
+                    "type": "string"
+                },
+                {
+                    "description": "the chain info of the volume",
+                    "name": "chaininfo",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the template for the virtual machine. A -1 is returned if the virtual machine was created from an ISO file.",
+                    "name": "templateid",
+                    "type": "string"
+                },
+                {
+                    "description": "shared or local storage",
+                    "name": "storagetype",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the device on user vm the volume is attahed to. This tag is not returned when the volume is detached.",
+                    "name": "deviceid",
+                    "type": "long"
+                }
+            ]
+        },
+        {
+            "description": "Marks a default zone for this account",
+            "isasync": true,
+            "name": "markDefaultZoneForAccount",
+            "params": [
+                {
+                    "description": "Name of the account that is to be marked.",
+                    "length": 255,
+                    "name": "account",
+                    "related": "disableAccount,listAccounts,markDefaultZoneForAccount,listAccounts,enableAccount,updateAccount,createAccount",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "Marks the account that belongs to the specified domain.",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "createDomain,listDomains,listDomainChildren,listDomains",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "The Zone ID with which the account is to be marked.",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones,listZones,createZone,updateZone",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "disableAccount,listAccounts,listAccounts,enableAccount,updateAccount,createAccount",
+            "response": [
+                {
+                    "description": "the type of the role (Admin, ResourceAdmin, DomainAdmin, User)",
+                    "name": "roletype",
+                    "type": "string"
+                },
+                {
+                    "description": "the total volume available for this account",
+                    "name": "volumeavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of vpcs owned by account",
+                    "name": "vpctotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total secondary storage space (in GiB) owned by account",
+                    "name": "secondarystoragetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of cpu cores the account can own",
+                    "name": "cpulimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of networks available to be created for this account",
+                    "name": "networkavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the network domain",
+                    "name": "networkdomain",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of templates which have been created by this account",
+                    "name": "templatetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of snapshots available for this account",
+                    "name": "snapshotavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "true if the account requires cleanup",
+                    "name": "iscleanuprequired",
+                    "type": "boolean"
+                },
+                {
+                    "description": "details for the account",
+                    "name": "accountdetails",
+                    "type": "map"
+                },
+                {
+                    "description": "the default zone of the account",
+                    "name": "defaultzoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of the account",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of network traffic bytes sent",
+                    "name": "sentbytes",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of templates available to be created by this account",
+                    "name": "templateavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total memory (in MB) owned by account",
+                    "name": "memorytotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of virtual machines that can be deployed by this account",
+                    "name": "vmlimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of projects being administrated by this account",
+                    "name": "projecttotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total primary storage space (in GiB) available to be used for this account",
+                    "name": "primarystorageavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the role",
+                    "name": "roleid",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of templates which can be created by this account",
+                    "name": "templatelimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of virtual machines deployed by this account",
+                    "name": "vmtotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total memory (in MB) available to be created for this account",
+                    "name": "memoryavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "account type (admin, domain-admin, user)",
+                    "name": "accounttype",
+                    "type": "short"
+                },
+                {
+                    "description": "the total number of vpcs the account can own",
+                    "name": "vpclimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the id of the account",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the total primary storage space (in GiB) the account can own",
+                    "name": "primarystoragelimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of cpu cores available to be created for this account",
+                    "name": "cpuavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "true if account is default, false otherwise",
+                    "name": "isdefault",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the total number of snapshots which can be stored by this account",
+                    "name": "snapshotlimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of cpu cores owned by account",
+                    "name": "cputotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of network traffic bytes received",
+                    "name": "receivedbytes",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of snapshots stored by this account",
+                    "name": "snapshottotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of virtual machines stopped for this account",
+                    "name": "vmstopped",
+                    "type": "integer"
+                },
+                {
+                    "description": "the total number of virtual machines available for this account to acquire",
+                    "name": "vmavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total volume being used by this account",
+                    "name": "volumetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total primary storage space (in GiB) owned by account",
+                    "name": "primarystoragetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of networks the account can own",
+                    "name": "networklimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the account",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of virtual machines running for this account",
+                    "name": "vmrunning",
+                    "type": "integer"
+                },
+                {
+                    "description": "the list of users associated with account",
+                    "name": "user",
+                    "response": [
+                        {
+                            "description": "the user email address",
+                            "name": "email",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain ID of the user",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain name of the user",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the user lastname",
+                            "name": "lastname",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account name of the user",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the api key of the user",
+                            "name": "apikey",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the type of the role",
+                            "name": "roletype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the timezone user was created in",
+                            "name": "timezone",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the boolean value representing if the updating target is in caller's child domain",
+                            "name": "iscallerchilddomain",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "the account ID of the user",
+                            "name": "accountid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the date and time the user account was created",
+                            "name": "created",
+                            "type": "date"
+                        },
+                        {
+                            "description": "the user state",
+                            "name": "state",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account type of the user",
+                            "name": "accounttype",
+                            "type": "short"
+                        },
+                        {
+                            "description": "the secret key of the user",
+                            "name": "secretkey",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the role",
+                            "name": "roleid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the user ID",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if user is default, false otherwise",
+                            "name": "isdefault",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "the user firstname",
+                            "name": "firstname",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the user name",
+                            "name": "username",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the name of the role",
+                            "name": "rolename",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "the total number of public ip addresses allocated for this account",
+                    "name": "iptotal",
+                    "type": "long"
+                },
+                {
+                    "description": "id of the Domain the account belongs too",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "name of the Domain the account belongs too",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the total memory (in MB) the account can own",
+                    "name": "memorylimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of acl groups that account belongs to",
+                    "name": "groups",
+                    "type": "list"
+                },
+                {
+                    "description": "the total volume which can be used by this account",
+                    "name": "volumelimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total secondary storage space (in GiB) available to be used for this account",
+                    "name": "secondarystorageavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the role",
+                    "name": "rolename",
+                    "type": "string"
+                },
+                {
+                    "description": "the total secondary storage space (in GiB) the account can own",
+                    "name": "secondarystoragelimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of public ip addresses this account can acquire",
+                    "name": "iplimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of vpcs available to be created for this account",
+                    "name": "vpcavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of networks owned by account",
+                    "name": "networktotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of public ip addresses available for this account to acquire",
+                    "name": "ipavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of projects the account can own",
+                    "name": "projectlimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of projects available for administration by this account",
+                    "name": "projectavailable",
+                    "type": "string"
+                }
+            ],
+            "since": "4.0"
+        },
+        {
+            "description": "Enables out-of-band management for a zone",
+            "isasync": true,
+            "name": "enableOutOfBandManagementForZone",
+            "params": [
+                {
+                    "description": "the ID of the zone",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones,listZones,createZone,updateZone",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "disableOutOfBandManagementForCluster,disableOutOfBandManagementForHost,issueOutOfBandManagementPowerAction,enableOutOfBandManagementForCluster,enableOutOfBandManagementForHost",
+            "response": [
+                {
+                    "description": "the ID of the host",
+                    "name": "hostid",
+                    "type": "string"
+                },
+                {
+                    "description": "the out-of-band management driver for the host",
+                    "name": "driver",
+                    "type": "string"
+                },
+                {
+                    "description": "the operation result description",
+                    "name": "description",
+                    "type": "string"
+                },
+                {
+                    "description": "the out-of-band management interface port",
+                    "name": "port",
+                    "type": "string"
+                },
+                {
+                    "description": "the out-of-band management interface address",
+                    "name": "address",
+                    "type": "string"
+                },
+                {
+                    "description": "the out-of-band management interface powerState of the host",
+                    "name": "powerstate",
+                    "type": "powerstate"
+                },
+                {
+                    "description": "the out-of-band management interface password",
+                    "name": "password",
+                    "type": "string"
+                },
+                {
+                    "description": "the operation result",
+                    "name": "status",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the out-of-band management action (if issued)",
+                    "name": "action",
+                    "type": "string"
+                },
+                {
+                    "description": "true if out-of-band management is enabled for the host",
+                    "name": "enabled",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the out-of-band management interface username",
+                    "name": "username",
+                    "type": "string"
+                }
+            ],
+            "since": "4.9.0"
+        },
+        {
+            "description": "Lists all LDAP Users",
+            "isasync": false,
+            "name": "listLdapUsers",
+            "params": [
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "Determines whether all ldap users are returned or just non-cloudstack users",
+                    "length": 255,
+                    "name": "listtype",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "The user's principle",
+                    "name": "principal",
+                    "type": "string"
+                },
+                {
+                    "description": "The user's domain",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "The user's email",
+                    "name": "email",
+                    "type": "string"
+                },
+                {
+                    "description": "The user's username",
+                    "name": "username",
+                    "type": "string"
+                },
+                {
+                    "description": "The user's firstname",
+                    "name": "firstname",
+                    "type": "string"
+                },
+                {
+                    "description": "The user's lastname",
+                    "name": "lastname",
+                    "type": "string"
+                }
+            ],
+            "since": "4.2.0"
+        },
+        {
+            "description": "Changes the service offering for a system vm (console proxy or secondary storage). The system vm must be in a \"Stopped\" state for this command to take effect.",
+            "isasync": false,
+            "name": "changeServiceForSystemVm",
+            "params": [
+                {
+                    "description": "The ID of the system vm",
+                    "length": 255,
+                    "name": "id",
+                    "related": "changeServiceForSystemVm,migrateSystemVm,startSystemVm",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the service offering ID to apply to the system vm",
+                    "length": 255,
+                    "name": "serviceofferingid",
+                    "related": "createServiceOffering,updateServiceOffering,listServiceOfferings",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "name value pairs of custom parameters for cpu, memory and cpunumber. example details[i].name=value",
+                    "length": 255,
+                    "name": "details",
+                    "required": false,
+                    "type": "map"
+                }
+            ],
+            "related": "migrateSystemVm,startSystemVm",
+            "response": [
+                {
+                    "description": "the Pod ID for the system VM",
+                    "name": "podid",
+                    "type": "string"
+                },
+                {
+                    "description": "the public netmask for the system VM",
+                    "name": "publicnetmask",
+                    "type": "string"
+                },
+                {
+                    "description": "the private IP address for the system VM",
+                    "name": "privateip",
+                    "type": "string"
+                },
+                {
+                    "description": "the host ID for the system VM",
+                    "name": "hostid",
+                    "type": "string"
+                },
+                {
+                    "description": "the job ID associated with the system VM. This is only displayed if the router listed is part of a currently running asynchronous job.",
+                    "name": "jobid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the system VM",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the private MAC address for the system VM",
+                    "name": "privatemacaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the job status associated with the system VM.  This is only displayed if the router listed is part of a currently running asynchronous job.",
+                    "name": "jobstatus",
+                    "type": "integer"
+                },
+                {
+                    "description": "the private netmask for the system VM",
+                    "name": "privatenetmask",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of the system VM",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the network domain for the system VM",
+                    "name": "networkdomain",
+                    "type": "string"
+                },
+                {
+                    "description": "the system VM type",
+                    "name": "systemvmtype",
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone ID for the system VM",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the number of active console sessions for the console proxy system vm",
+                    "name": "activeviewersessions",
+                    "type": "integer"
+                },
+                {
+                    "description": "the public IP address for the system VM",
+                    "name": "publicip",
+                    "type": "string"
+                },
+                {
+                    "description": "the hostname for the system VM",
+                    "name": "hostname",
+                    "type": "string"
+                },
+                {
+                    "description": "the link local IP address for the system vm",
+                    "name": "linklocalip",
+                    "type": "string"
+                },
+                {
+                    "description": "the gateway for the system VM",
+                    "name": "gateway",
+                    "type": "string"
+                },
+                {
+                    "description": "the second DNS for the system VM",
+                    "name": "dns2",
+                    "type": "string"
+                },
+                {
+                    "description": "the public MAC address for the system VM",
+                    "name": "publicmacaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the system VM",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone name for the system VM",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the hypervisor on which the template runs",
+                    "name": "hypervisor",
+                    "type": "string"
+                },
+                {
+                    "description": "the first DNS for the system VM",
+                    "name": "dns1",
+                    "type": "string"
+                },
+                {
+                    "description": "the template ID for the system VM",
+                    "name": "templateid",
+                    "type": "string"
+                },
+                {
+                    "description": "the link local MAC address for the system vm",
+                    "name": "linklocalmacaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the link local netmask for the system vm",
+                    "name": "linklocalnetmask",
+                    "type": "string"
+                },
+                {
+                    "description": "the date and time the system VM was created",
+                    "name": "created",
+                    "type": "date"
+                }
+            ]
+        },
+        {
+            "description": "List the IP forwarding rules",
+            "isasync": false,
+            "name": "listIpForwardingRules",
+            "params": [
+                {
+                    "description": "defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.",
+                    "length": 255,
+                    "name": "isrecursive",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "list only resources belonging to the domain specified",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "createDomain,listDomains,listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "list resources by account. Must be used with the domainId parameter.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "If set to false, list only resources belonging to the command's caller; if set to true - list resources that the caller is authorized to see. Default value is false",
+                    "length": 255,
+                    "name": "listall",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "list the rule belonging to this public IP address",
+                    "length": 255,
+                    "name": "ipaddressid",
+                    "related": "associateIpAddress,restartNetwork,updateIpAddress,associateIpAddress,listPublicIpAddresses,listPublicIpAddresses",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "list objects by project",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "listProjectAccounts,suspendProject,activateProject,updateProject,listProjects",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "Lists rule with the specified ID.",
+                    "length": 255,
+                    "name": "id",
+                    "related": "listIpForwardingRules,updatePortForwardingRule,createPortForwardingRule,listPortForwardingRules",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "Lists all rules applied to the specified VM.",
+                    "length": 255,
+                    "name": "virtualmachineid",
+                    "related": "updateVMAffinityGroup,detachIso,resetSSHKeyForVirtualMachine,resetSSHKeyForVirtualMachine,migrateVirtualMachineWithVolume,attachIso,removeNicFromVirtualMachine,updateVirtualMachine,recoverVirtualMachine,migrateVirtualMachine,resetPasswordForVirtualMachine,revertToVMSnapshot,assignVirtualMachine,updateVMAffinityGroup,listVirtualMachines,rebootVirtualMachine,restoreVirtualMachine,destroyVirtualMachine,stopVirtualMachine,deployVirtualMachine,detachIso,deployVirtualMachine,updateDefaultNicForVirtualMachine,updateVirtualMachine,revertToVMSnapshot,addNicToVirtualMachine,tmDestroyVirtualMachine,resetPasswordForVirtualMachine,startVirtualMachine,updateDefaultNicForVirtualMachine,startVirtualMachine,attachIso,listVirtualMachines,addNicToVirtualMachine,stopVirtualMachine,destroyVirtualMachine,removeNicFromVirtualMachine,changeServiceForVirtualMachine",
+                    "required": false,
+                    "type": "uuid"
+                }
+            ],
+            "related": "updatePortForwardingRule,createPortForwardingRule,listPortForwardingRules",
+            "response": [
+                {
+                    "description": "the list of resource tags associated with the rule",
+                    "name": "tags",
+                    "response": [
+                        {
+                            "description": "tag key name",
+                            "name": "key",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account associated with the tag",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain associated with the tag",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "resource type",
+                            "name": "resourcetype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "id of the resource",
+                            "name": "resourceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "customer associated with the tag",
+                            "name": "customer",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name where tag belongs to",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project id the tag belongs to",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the domain associated with the tag",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag value",
+                            "name": "value",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "the cidr list to forward traffic from",
+                    "name": "cidrlist",
+                    "type": "string"
+                },
+                {
+                    "description": "is firewall for display to the regular user",
+                    "name": "fordisplay",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the VM display name for the port forwarding rule",
+                    "name": "virtualmachinedisplayname",
+                    "type": "string"
+                },
+                {
+                    "description": "the public ip address for the port forwarding rule",
+                    "name": "ipaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the protocol of the port forwarding rule",
+                    "name": "protocol",
+                    "type": "string"
+                },
+                {
+                    "description": "the VM ID for the port forwarding rule",
+                    "name": "virtualmachineid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the port forwarding rule",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the starting port of port forwarding rule's private port range",
+                    "name": "privateport",
+                    "type": "string"
+                },
+                {
+                    "description": "the ending port of port forwarding rule's private port range",
+                    "name": "privateendport",
+                    "type": "string"
+                },
+                {
+                    "description": "the id of the guest network the port forwarding rule belongs to",
+                    "name": "networkid",
+                    "type": "string"
+                },
+                {
+                    "description": "the vm ip address for the port forwarding rule",
+                    "name": "vmguestip",
+                    "type": "string"
+                },
+                {
+                    "description": "the starting port of port forwarding rule's public port range",
+                    "name": "publicport",
+                    "type": "string"
+                },
+                {
+                    "description": "the public ip address id for the port forwarding rule",
+                    "name": "ipaddressid",
+                    "type": "string"
+                },
+                {
+                    "description": "the VM name for the port forwarding rule",
+                    "name": "virtualmachinename",
+                    "type": "string"
+                },
+                {
+                    "description": "the ending port of port forwarding rule's private port range",
+                    "name": "publicendport",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of the rule",
+                    "name": "state",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Deletes a vmsnapshot.",
+            "isasync": true,
+            "name": "deleteVMSnapshot",
+            "params": [
+                {
+                    "description": "The ID of the VM snapshot",
+                    "length": 255,
+                    "name": "vmsnapshotid",
+                    "related": "createVMSnapshot,listVMSnapshot",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                }
+            ],
+            "since": "4.2.0"
+        },
+        {
+            "description": "Creates an instant snapshot of a volume.",
+            "isasync": true,
+            "name": "createSnapshot",
+            "params": [
+                {
+                    "description": "The account of the snapshot. The account parameter must be used with the domainId parameter.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "The domain ID of the snapshot. If used with the account parameter, specifies a domain for the account associated with the disk volume.",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "createDomain,listDomains,listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "The ID of the disk volume",
+                    "length": 255,
+                    "name": "volumeid",
+                    "related": "listVolumes,updateVolume,attachVolume,resizeVolume,updateVolume,migrateVolume,createVolume,listVolumes,uploadVolume,attachVolume,detachVolume,resizeVolume,migrateVolume,createVolume",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the name of the snapshot",
+                    "length": 255,
+                    "name": "name",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "quiesce vm if true",
+                    "length": 255,
+                    "name": "quiescevm",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "policy id of the snapshot, if this is null, then use MANUAL_POLICY.",
+                    "length": 255,
+                    "name": "policyid",
+                    "related": "updateSnapshotPolicy",
+                    "required": false,
+                    "type": "uuid"
+                }
+            ],
+            "related": "revertSnapshot",
+            "response": [
+                {
+                    "description": "  the date the snapshot was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the domain ID of the snapshot's account",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain name of the snapshot's account",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "physical size of backedup snapshot on image store",
+                    "name": "physicalsize",
+                    "type": "long"
+                },
+                {
+                    "description": "valid types are hourly, daily, weekly, monthy, template, and none.",
+                    "name": "intervaltype",
+                    "type": "string"
+                },
+                {
+                    "description": "type of the disk volume",
+                    "name": "volumetype",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the snapshot",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the account associated with the snapshot",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "ID of the snapshot",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "name of the snapshot",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "id of the availability zone",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "indicates whether the underlying storage supports reverting the volume to this snapshot",
+                    "name": "revertable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "ID of the disk volume",
+                    "name": "volumeid",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of resource tags associated with snapshot",
+                    "name": "tags",
+                    "response": [
+                        {
+                            "description": "tag value",
+                            "name": "value",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project id the tag belongs to",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "id of the resource",
+                            "name": "resourceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "customer associated with the tag",
+                            "name": "customer",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name where tag belongs to",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account associated with the tag",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the domain associated with the tag",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag key name",
+                            "name": "key",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain associated with the tag",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "resource type",
+                            "name": "resourcetype",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "the type of the snapshot",
+                    "name": "snapshottype",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of the snapshot. BackedUp means that snapshot is ready to be used; Creating - the snapshot is being allocated on the primary storage; BackingUp - the snapshot is being backed up on secondary storage",
+                    "name": "state",
+                    "type": "state"
+                },
+                {
+                    "description": "the project name of the snapshot",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "name of the disk volume",
+                    "name": "volumename",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Lists storage pool metrics",
+            "isasync": false,
+            "name": "listStoragePoolsMetrics",
+            "params": [
+                {
+                    "description": "the ID of the storage pool",
+                    "length": 255,
+                    "name": "id",
+                    "related": "createStoragePool,listStoragePools,findStoragePoolsForMigration,enableStorageMaintenance,cancelStorageMaintenance",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "the IP address for the storage pool",
+                    "length": 255,
+                    "name": "ipaddress",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the storage pool",
+                    "length": 255,
+                    "name": "name",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the storage pool path",
+                    "length": 255,
+                    "name": "path",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the storage pool",
+                    "length": 255,
+                    "name": "scope",
+                    "related": "createStoragePool,listStoragePools,findStoragePoolsForMigration,enableStorageMaintenance,cancelStorageMaintenance",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "list storage pools belongig to the specific cluster",
+                    "length": 255,
+                    "name": "clusterid",
+                    "related": "addCluster,updateCluster",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone ID for the storage pool",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones,listZones,createZone,updateZone",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the Pod ID for the storage pool",
+                    "length": 255,
+                    "name": "podid",
+                    "related": "updatePod",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "storage usage disable threshold exceeded",
+                    "name": "storageusagedisablethreshold",
+                    "type": "boolean"
+                },
+                {
+                    "description": "storage usage notification threshold exceeded",
+                    "name": "storageusagethreshold",
+                    "type": "boolean"
+                },
+                {
+                    "description": "storage allocated disable threshold exceeded",
+                    "name": "storageallocateddisablethreshold",
+                    "type": "boolean"
+                },
+                {
+                    "description": "disk size in GiB",
+                    "name": "disksizetotalgb",
+                    "type": "string"
+                },
+                {
+                    "description": "disk size allocated in GiB",
+                    "name": "disksizeallocatedgb",
+                    "type": "string"
+                },
+                {
+                    "description": "storage allocated notification threshold exceeded",
+                    "name": "storageallocatedthreshold",
+                    "type": "boolean"
+                },
+                {
+                    "description": "disk size used in GiB",
+                    "name": "disksizeusedgb",
+                    "type": "string"
+                },
+                {
+                    "description": "disk size unallocated in GiB",
+                    "name": "disksizeunallocatedgb",
+                    "type": "string"
+                }
+            ],
+            "since": "4.9.3"
+        },
+        {
+            "description": "Starts a router.",
+            "isasync": true,
+            "name": "rebootRouter",
+            "params": [
+                {
+                    "description": "the ID of the router",
+                    "length": 255,
+                    "name": "id",
+                    "related": "stopInternalLoadBalancerVM,listInternalLoadBalancerVMs,changeServiceForRouter,rebootRouter,destroyRouter,listRouters",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "stopInternalLoadBalancerVM,listInternalLoadBalancerVMs,changeServiceForRouter,destroyRouter,listRouters",
+            "response": [
+                {
+                    "description": "the domain ID associated with the router",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the guest MAC address for the router",
+                    "name": "guestmacaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the router",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of VPC the router belongs to",
+                    "name": "vpcname",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the corresponding guest network",
+                    "name": "guestnetworkname",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the address",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the hypervisor on which the template runs",
+                    "name": "hypervisor",
+                    "type": "string"
+                },
+                {
+                    "description": "the host ID for the router",
+                    "name": "hostid",
+                    "type": "string"
+                },
+                {
+                    "description": "the link local MAC address for the router",
+                    "name": "linklocalmacaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of redundant virtual router",
+                    "name": "redundantstate",
+                    "type": "string"
+                },
+                {
+                    "description": "the link local IP address for the router",
+                    "name": "linklocalip",
+                    "type": "string"
+                },
+                {
+                    "description": "the template ID for the router",
+                    "name": "templateid",
+                    "type": "string"
+                },
+                {
+                    "description": "the Pod ID for the router",
+                    "name": "podid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the corresponding guest network",
+                    "name": "guestnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "the first DNS for the router",
+                    "name": "dns1",
+                    "type": "string"
+                },
+                {
+                    "description": "the public netmask for the router",
+                    "name": "publicnetmask",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain associated with the router",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "VPC the router belongs to",
+                    "name": "vpcid",
+                    "type": "string"
+                },
+                {
+                    "description": "role of the domain router",
+                    "name": "role",
+                    "type": "string"
+                },
+                {
+                    "description": "the version of scripts",
+                    "name": "scriptsversion",
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone name for the router",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the gateway for the router",
+                    "name": "gateway",
+                    "type": "string"
+                },
+                {
+                    "description": "the version of template",
+                    "name": "version",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the service offering of the virtual machine",
+                    "name": "serviceofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "the second IPv6 DNS for the router",
+                    "name": "ip6dns2",
+                    "type": "string"
+                },
+                {
+                    "description": "true if the router template requires upgrader",
+                    "name": "requiresupgrade",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the network domain for the router",
+                    "name": "networkdomain",
+                    "type": "string"
+                },
+                {
+                    "description": "if this router is an redundant virtual router",
+                    "name": "isredundantrouter",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the name of the service offering of the virtual machine",
+                    "name": "serviceofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "the first IPv6 DNS for the router",
+                    "name": "ip6dns1",
+                    "type": "string"
+                },
+                {
+                    "description": "the id of the router",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the link local netmask for the router",
+                    "name": "linklocalnetmask",
+                    "type": "string"
+                },
+                {
+                    "description": "the guest IP address for the router",
+                    "name": "guestipaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the ipaddress",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone ID for the router",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the corresponding public network",
+                    "name": "publicnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "the guest netmask for the router",
+                    "name": "guestnetmask",
+                    "type": "string"
+                },
+                {
+                    "description": "the public IP address for the router",
+                    "name": "publicip",
+                    "type": "string"
+                },
+                {
+                    "description": "the public MAC address for the router",
+                    "name": "publicmacaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the hostname for the router",
+                    "name": "hostname",
+                    "type": "string"
+                },
+                {
+                    "description": "the date and time the router was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the ID of the corresponding link local network",
+                    "name": "linklocalnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of the router",
+                    "name": "state",
+                    "type": "state"
+                },
+                {
+                    "description": "the second DNS for the router",
+                    "name": "dns2",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of nics associated with the router",
+                    "name": "nic",
+                    "response": [
+                        {
+                            "description": "the Secondary ipv4 addr of nic",
+                            "name": "secondaryip",
+                            "type": "list"
+                        },
+                        {
+                            "description": "the broadcast uri of the nic",
+                            "name": "broadcasturi",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the traffic type of the nic",
+                            "name": "traffictype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "device id for the network when plugged into the virtual machine",
+                            "name": "deviceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the IPv6 address of network",
+                            "name": "ip6address",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the isolation uri of the nic",
+                            "name": "isolationuri",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if nic is default, false otherwise",
+                            "name": "isdefault",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "the ID of the nic",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the gateway of the nic",
+                            "name": "gateway",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the NSX Logical Switch Port (if NSX based), null otherwise",
+                            "name": "nsxlogicalswitchport",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if nic is default, false otherwise",
+                            "name": "macaddress",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the cidr of IPv6 network",
+                            "name": "ip6cidr",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the corresponding network",
+                            "name": "networkid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the gateway of IPv6 network",
+                            "name": "ip6gateway",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the netmask of the nic",
+                            "name": "netmask",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the NSX Logical Switch (if NSX based), null otherwise",
+                            "name": "nsxlogicalswitch",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ip address of the nic",
+                            "name": "ipaddress",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the name of the corresponding network",
+                            "name": "networkname",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the vm to which the nic belongs",
+                            "name": "virtualmachineid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the type of the nic",
+                            "name": "type",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "the account associated with the router",
+                    "name": "account",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "list the vm nics  IP to NIC",
+            "isasync": false,
+            "name": "listNics",
+            "params": [
+                {
+                    "description": "the ID of the vm",
+                    "length": 255,
+                    "name": "virtualmachineid",
+                    "related": "updateVMAffinityGroup,detachIso,resetSSHKeyForVirtualMachine,resetSSHKeyForVirtualMachine,migrateVirtualMachineWithVolume,attachIso,removeNicFromVirtualMachine,updateVirtualMachine,recoverVirtualMachine,migrateVirtualMachine,resetPasswordForVirtualMachine,revertToVMSnapshot,assignVirtualMachine,updateVMAffinityGroup,listVirtualMachines,rebootVirtualMachine,restoreVirtualMachine,destroyVirtualMachine,stopVirtualMachine,deployVirtualMachine,detachIso,deployVirtualMachine,updateDefaultNicForVirtualMachine,updateVirtualMachine,revertToVMSnapshot,addNicToVirtualMachine,tmDestroyVirtualMachine,resetPasswordForVirtualMachine,startVirtualMachine,updateDefaultNicForVirtualMachine,startVirtualMachine,attachIso,listVirtualMachines,addNicToVirtualMachine,stopVirtualMachine,destroyVirtualMachine,removeNicFromVirtualMachine,changeServiceForVirtualMachine",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list nic of the specific vm's network",
+                    "length": 255,
+                    "name": "networkid",
+                    "related": "createNetwork,updateNetwork,listSrxFirewallNetworks,updateNetwork,listBrocadeVcsDeviceNetworks,listNiciraNvpDeviceNetworks,createNetwork,listNetworks,listNetscalerLoadBalancerNetworks,listF5LoadBalancerNetworks,listPaloAltoFirewallNetworks",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "list resources by display flag; only ROOT admin is eligible to pass this parameter",
+                    "length": 255,
+                    "name": "fordisplay",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "boolean"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "the ID of the nic to to list IPs",
+                    "length": 255,
+                    "name": "nicid",
+                    "related": "listNics",
+                    "required": false,
+                    "type": "uuid"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the name of the corresponding network",
+                    "name": "networkname",
+                    "type": "string"
+                },
+                {
+                    "description": "the isolation uri of the nic",
+                    "name": "isolationuri",
+                    "type": "string"
+                },
+                {
+                    "description": "the netmask of the nic",
+                    "name": "netmask",
+                    "type": "string"
+                },
+                {
+                    "description": "the broadcast uri of the nic",
+                    "name": "broadcasturi",
+                    "type": "string"
+                },
+                {
+                    "description": "Id of the vm to which the nic belongs",
+                    "name": "virtualmachineid",
+                    "type": "string"
+                },
+                {
+                    "description": "the gateway of the nic",
+                    "name": "gateway",
+                    "type": "string"
+                },
+                {
+                    "description": "the type of the nic",
+                    "name": "type",
+                    "type": "string"
+                },
+                {
+                    "description": "the gateway of IPv6 network",
+                    "name": "ip6gateway",
+                    "type": "string"
+                },
+                {
+                    "description": "Id of the NSX Logical Switch (if NSX based), null otherwise",
+                    "name": "nsxlogicalswitch",
+                    "type": "string"
+                },
+                {
+                    "description": "device id for the network when plugged into the virtual machine",
+                    "name": "deviceid",
+                    "type": "string"
+                },
+                {
+                    "description": "true if nic is default, false otherwise",
+                    "name": "isdefault",
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if nic is default, false otherwise",
+                    "name": "macaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "Id of the NSX Logical Switch Port (if NSX based), null otherwise",
+                    "name": "nsxlogicalswitchport",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the corresponding network",
+                    "name": "networkid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ip address of the nic",
+                    "name": "ipaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the traffic type of the nic",
+                    "name": "traffictype",
+                    "type": "string"
+                },
+                {
+                    "description": "the Secondary ipv4 addr of nic",
+                    "name": "secondaryip",
+                    "type": "list"
+                },
+                {
+                    "description": "the ID of the nic",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the cidr of IPv6 network",
+                    "name": "ip6cidr",
+                    "type": "string"
+                },
+                {
+                    "description": "the IPv6 address of network",
+                    "name": "ip6address",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Create a new keypair and returns the private key",
+            "isasync": false,
+            "name": "createSSHKeyPair",
+            "params": [
+                {
+                    "description": "an optional domainId for the ssh key. If the account parameter is used, domainId must also be used.",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "createDomain,listDomains,listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "Name of the keypair",
+                    "length": 255,
+                    "name": "name",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "an optional project for the ssh key",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "listProjectAccounts,suspendProject,activateProject,updateProject,listProjects",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "an optional account for the ssh key. Must be used with domainId.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "Private key",
+                    "name": "privatekey",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Authorizes a particular egress rule for this security group",
+            "isasync": true,
+            "name": "authorizeSecurityGroupEgress",
+            "params": [
+                {
+                    "description": "The name of the security group. Mutually exclusive with securityGroupId parameter",
+                    "length": 255,
+                    "name": "securitygroupname",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "end port for this egress rule",
+                    "length": 255,
+                    "name": "endport",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "the cidr list associated",
+                    "length": 255,
+                    "name": "cidrlist",
+                    "required": false,
+                    "type": "list"
+                },
+                {
+                    "description": "user to security group mapping",
+                    "length": 255,
+                    "name": "usersecuritygrouplist",
+                    "required": false,
+                    "type": "map"
+                },
+                {
+                    "description": "TCP is default. UDP is the other supported protocol",
+                    "length": 255,
+                    "name": "protocol",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "type of the icmp message being sent",
+                    "length": 255,
+                    "name": "icmptype",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "an optional domainId for the security group. If the account parameter is used, domainId must also be used.",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "createDomain,listDomains,listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "The ID of the security group. Mutually exclusive with securityGroupName parameter",
+                    "length": 255,
+                    "name": "securitygroupid",
+                    "related": "createSecurityGroup",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "error code for this icmp message",
+                    "length": 255,
+                    "name": "icmpcode",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "an optional project of the security group",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "listProjectAccounts,suspendProject,activateProject,updateProject,listProjects",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "an optional account for the security group. Must be used with domainId.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "start port for this egress rule",
+                    "length": 255,
+                    "name": "startport",
+                    "required": false,
+                    "type": "integer"
+                }
+            ],
+            "related": "authorizeSecurityGroupIngress",
+            "response": [
+                {
+                    "description": "the protocol of the security group rule",
+                    "name": "protocol",
+                    "type": "string"
+                },
+                {
+                    "description": "the id of the security group rule",
+                    "name": "ruleid",
+                    "type": "string"
+                },
+                {
+                    "description": "the type of the ICMP message response",
+                    "name": "icmptype",
+                    "type": "integer"
+                },
+                {
+                    "description": "the code for the ICMP message response",
+                    "name": "icmpcode",
+                    "type": "integer"
+                },
+                {
+                    "description": "security group name",
+                    "name": "securitygroupname",
+                    "type": "string"
+                },
+                {
+                    "description": "the CIDR notation for the base IP address of the security group rule",
+                    "name": "cidr",
+                    "type": "string"
+                },
+                {
+                    "description": "account owning the security group rule",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of resource tags associated with the rule",
+                    "name": "tags",
+                    "response": [
+                        {
+                            "description": "resource type",
+                            "name": "resourcetype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project id the tag belongs to",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name where tag belongs to",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag value",
+                            "name": "value",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the domain associated with the tag",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag key name",
+                            "name": "key",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain associated with the tag",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account associated with the tag",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "customer associated with the tag",
+                            "name": "customer",
+                            "type": "string"
+                        },
+                        {
+                            "description": "id of the resource",
+                            "name": "resourceid",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "the starting IP of the security group rule",
+                    "name": "startport",
+                    "type": "integer"
+                },
+                {
+                    "description": "the ending IP of the security group rule ",
+                    "name": "endport",
+                    "type": "integer"
+                }
+            ],
+            "since": "3.0.0"
+        },
+        {
+            "description": "Lists storage pools.",
+            "isasync": false,
+            "name": "listStoragePools",
+            "params": [
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "the ID of the storage pool",
+                    "length": 255,
+                    "name": "id",
+                    "related": "createStoragePool,listStoragePools,findStoragePoolsForMigration,enableStorageMaintenance,cancelStorageMaintenance",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list storage pools belongig to the specific cluster",
+                    "length": 255,
+                    "name": "clusterid",
+                    "related": "addCluster,updateCluster",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "the name of the storage pool",
+                    "length": 255,
+                    "name": "name",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the storage pool",
+                    "length": 255,
+                    "name": "scope",
+                    "related": "createStoragePool,listStoragePools,findStoragePoolsForMigration,enableStorageMaintenance,cancelStorageMaintenance",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the Pod ID for the storage pool",
+                    "length": 255,
+                    "name": "podid",
+                    "related": "updatePod",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the Zone ID for the storage pool",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones,listZones,createZone,updateZone",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the IP address for the storage pool",
+                    "length": 255,
+                    "name": "ipaddress",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the storage pool path",
+                    "length": 255,
+                    "name": "path",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "createStoragePool,findStoragePoolsForMigration,enableStorageMaintenance,cancelStorageMaintenance",
+            "response": [
+                {
+                    "description": "the storage pool path",
+                    "name": "path",
+                    "type": "string"
+                },
+                {
+                    "description": "the date and time the storage pool was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the scope of the storage pool",
+                    "name": "scope",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the storage pool",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the Pod name of the storage pool",
+                    "name": "podname",
+                    "type": "string"
+                },
+                {
+                    "description": "the tags for the storage pool",
+                    "name": "tags",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of the storage pool",
+                    "name": "state",
+                    "type": "storagepoolstatus"
+                },
+                {
+                    "description": "the overprovisionfactor for the storage pool",
+                    "name": "overprovisionfactor",
+                    "type": "string"
+                },
+                {
+                    "description": "true if this pool is suitable to migrate a volume, false otherwise",
+                    "name": "suitableformigration",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the storage pool capabilities",
+                    "name": "storagecapabilities",
+                    "type": "map"
+                },
+                {
+                    "description": "the Zone name of the storage pool",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the Pod ID of the storage pool",
+                    "name": "podid",
+                    "type": "string"
+                },
+                {
+                    "description": "IOPS CloudStack can provision from this storage pool",
+                    "name": "capacityiops",
+                    "type": "long"
+                },
+                {
+                    "description": "the host's currently allocated disk size",
+                    "name": "disksizeallocated",
+                    "type": "long"
+                },
+                {
+                    "description": "the Zone ID of the storage pool",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the IP address of the storage pool",
+                    "name": "ipaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the storage pool type",
+                    "name": "type",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the cluster for the storage pool",
+                    "name": "clusterid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the cluster for the storage pool",
+                    "name": "clustername",
+                    "type": "string"
+                },
+                {
+                    "description": "the hypervisor type of the storage pool",
+                    "name": "hypervisor",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the storage pool",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the total disk size of the storage pool",
+                    "name": "disksizetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the host's currently used disk size",
+                    "name": "disksizeused",
+                    "type": "long"
+                }
+            ]
+        },
+        {
+            "description": "Find hosts suitable for migrating a virtual machine.",
+            "isasync": false,
+            "name": "findHostsForMigration",
+            "params": [
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "find hosts to which this VM can be migrated and flag the hosts with enough CPU/RAM to host the VM",
+                    "length": 255,
+                    "name": "virtualmachineid",
+                    "related": "updateVMAffinityGroup,detachIso,resetSSHKeyForVirtualMachine,resetSSHKeyForVirtualMachine,migrateVirtualMachineWithVolume,attachIso,removeNicFromVirtualMachine,updateVirtualMachine,recoverVirtualMachine,migrateVirtualMachine,resetPasswordForVirtualMachine,revertToVMSnapshot,assignVirtualMachine,updateVMAffinityGroup,listVirtualMachines,rebootVirtualMachine,restoreVirtualMachine,destroyVirtualMachine,stopVirtualMachine,deployVirtualMachine,detachIso,deployVirtualMachine,updateDefaultNicForVirtualMachine,updateVirtualMachine,revertToVMSnapshot,addNicToVirtualMachine,tmDestroyVirtualMachine,resetPasswordForVirtualMachine,startVirtualMachine,updateDefaultNicForVirtualMachine,startVirtualMachine,attachIso,listVirtualMachines,addNicToVirtualMachine,stopVirtualMachine,destroyVirtualMachine,removeNicFromVirtualMachine,changeServiceForVirtualMachine",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the memory total of the host",
+                    "name": "memorytotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the cluster ID of the host",
+                    "name": "clusterid",
+                    "type": "string"
+                },
+                {
+                    "description": "the date and time the host was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the date and time the host was removed",
+                    "name": "removed",
+                    "type": "date"
+                },
+                {
+                    "description": "true if migrating a vm to this host requires storage motion, false otherwise",
+                    "name": "requiresStorageMotion",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the CPU speed of the host",
+                    "name": "cpuspeed",
+                    "type": "long"
+                },
+                {
+                    "description": "the Zone name of the host",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the cluster name of the host",
+                    "name": "clustername",
+                    "type": "string"
+                },
+                {
+                    "description": "the amount of the host's memory currently allocated",
+                    "name": "memoryallocated",
+                    "type": "long"
+                },
+                {
+                    "description": "the host hypervisor",
+                    "name": "hypervisor",
+                    "type": "hypervisortype"
+                },
+                {
+                    "description": "the amount of the host's CPU currently used",
+                    "name": "cpuused",
+                    "type": "string"
+                },
+                {
+                    "description": "the incoming network traffic on the host",
+                    "name": "networkkbsread",
+                    "type": "long"
+                },
+                {
+                    "description": "the host's currently allocated disk size",
+                    "name": "disksizeallocated",
+                    "type": "long"
+                },
+                {
+                    "description": "the ID of the host",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the Pod ID of the host",
+                    "name": "podid",
+                    "type": "string"
+                },
+                {
+                    "description": "the Pod name of the host",
+                    "name": "podname",
+                    "type": "string"
+                },
+                {
+                    "description": "the date and time the host was last pinged",
+                    "name": "lastpinged",
+                    "type": "date"
+                },
+                {
+                    "description": "comma-separated list of tags for the host",
+                    "name": "hosttags",
+                    "type": "string"
+                },
+                {
+                    "description": "the hypervisor version",
+                    "name": "hypervisorversion",
+                    "type": "string"
+                },
+                {
+                    "description": "the cluster type of the cluster that host belongs to",
+                    "name": "clustertype",
+                    "type": "string"
+                },
+                {
+                    "description": "the outgoing network traffic on the host",
+                    "name": "networkkbswrite",
+                    "type": "long"
+                },
+                {
+                    "description": "capabilities of the host",
+                    "name": "capabilities",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the host",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the host type",
+                    "name": "type",
+                    "type": "type"
+                },
+                {
+                    "description": "the host version",
+                    "name": "version",
+                    "type": "string"
+                },
+                {
+                    "description": "true if local storage is active, false otherwise",
+                    "name": "islocalstorageactive",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the management server ID of the host",
+                    "name": "managementserverid",
+                    "type": "long"
+                },
+                {
+                    "description": "true if this host is suitable(has enough capacity and satisfies all conditions like hosttags, max guests vm limit etc) to migrate a VM to it , false otherwise",
+                    "name": "suitableformigration",
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if this host has enough CPU and RAM capacity to migrate a VM to it, false otherwise",
+                    "name": "hasenoughcapacity",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the state of the host",
+                    "name": "state",
+                    "type": "status"
+                },
+                {
+                    "description": "the amount of the host's CPU after applying the cpu.overprovisioning.factor ",
+                    "name": "cpuwithoverprovisioning",
+                    "type": "string"
+                },
+                {
+                    "description": "the total disk size of the host",
+                    "name": "disksizetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "true if the host is disconnected. False otherwise.",
+                    "name": "disconnected",
+                    "type": "date"
+                },
+                {
+                    "description": "the OS category name of the host",
+                    "name": "oscategoryname",
+                    "type": "string"
+                },
+                {
+                    "description": "the IP address of the host",
+                    "name": "ipaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the OS category ID of the host",
+                    "name": "oscategoryid",
+                    "type": "string"
+                },
+                {
+                    "description": "events available for the host",
+                    "name": "events",
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone ID of the host",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the CPU number of the host",
+                    "name": "cpunumber",
+                    "type": "integer"
+                },
+                {
+                    "description": "the amount of the host's CPU currently allocated",
+                    "name": "cpuallocated",
+                    "type": "string"
+                },
+                {
+                    "description": "the resource state of the host",
+                    "name": "resourcestate",
+                    "type": "string"
+                },
+                {
+                    "description": "true if the host is Ha host (dedicated to vms started by HA process; false otherwise",
+                    "name": "hahost",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the cpu average load on the host",
+                    "name": "averageload",
+                    "type": "long"
+                },
+                {
+                    "description": "the amount of the host's memory currently used",
+                    "name": "memoryused",
+                    "type": "long"
+                }
+            ]
+        },
+        {
+            "description": "Updates a hypervisor capabilities.",
+            "isasync": false,
+            "name": "updateHypervisorCapabilities",
+            "params": [
+                {
+                    "description": "the max number of Guest VMs per host for this hypervisor.",
+                    "length": 255,
+                    "name": "maxguestslimit",
+                    "required": false,
+                    "type": "long"
+                },
+                {
+                    "description": "set true to enable security group for this hypervisor.",
+                    "length": 255,
+                    "name": "securitygroupenabled",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "ID of the hypervisor capability",
+                    "length": 255,
+                    "name": "id",
+                    "related": "listHypervisorCapabilities,updateHypervisorCapabilities",
+                    "required": false,
+                    "type": "uuid"
+                }
+            ],
+            "related": "listHypervisorCapabilities",
+            "response": [
+                {
+                    "description": "true if security group is supported",
+                    "name": "securitygroupenabled",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the maximum number of Data Volumes that can be attached for this hypervisor",
+                    "name": "maxdatavolumeslimit",
+                    "type": "integer"
+                },
+                {
+                    "description": "the maximum number of guest vms recommended for this hypervisor",
+                    "name": "maxguestslimit",
+                    "type": "long"
+                },
+                {
+                    "description": "the hypervisor version",
+                    "name": "hypervisorversion",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the hypervisor capabilities row",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the maximum number of Hosts per cluster for this hypervisor",
+                    "name": "maxhostspercluster",
+                    "type": "integer"
+                },
+                {
+                    "description": "the hypervisor type",
+                    "name": "hypervisor",
+                    "type": "hypervisortype"
+                },
+                {
+                    "description": "true if storage motion is supported",
+                    "name": "storagemotionenabled",
+                    "type": "boolean"
+                }
+            ],
+            "since": "3.0.0"
+        },
+        {
+            "description": "Enable a Cisco Nexus VSM device",
+            "isasync": true,
+            "name": "enableCiscoNexusVSM",
+            "params": [
+                {
+                    "description": "Id of the Cisco Nexus 1000v VSM device to be enabled",
+                    "length": 255,
+                    "name": "id",
+                    "related": "listCiscoNexusVSMs,disableCiscoNexusVSM,enableCiscoNexusVSM",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "listCiscoNexusVSMs,disableCiscoNexusVSM",
+            "response": [
+                {
+                    "description": "The Config State (Primary/Standby) of the VSM",
+                    "name": "vsmconfigstate",
+                    "type": "string"
+                },
+                {
+                    "description": "control vlan id of the VSM",
+                    "name": "vsmctrlvlanid",
+                    "type": "int"
+                },
+                {
+                    "description": "management vlan id of the VSM",
+                    "name": "vsmmgmtvlanid",
+                    "type": "string"
+                },
+                {
+                    "description": "device name",
+                    "name": "vsmdevicename",
+                    "type": "string"
+                },
+                {
+                    "description": "The VSM is a switch supervisor. This is the VSM's switch domain id",
+                    "name": "vsmdomainid",
+                    "type": "string"
+                },
+                {
+                    "description": "device state",
+                    "name": "vsmdevicestate",
+                    "type": "string"
+                },
+                {
+                    "description": "storage vlan id of the VSM",
+                    "name": "vsmstoragevlanid",
+                    "type": "int"
+                },
+                {
+                    "description": "The Device State (Enabled/Disabled) of the VSM",
+                    "name": "vsmdevicestate",
+                    "type": "string"
+                },
+                {
+                    "description": "packet vlan id of the VSM",
+                    "name": "vsmpktvlanid",
+                    "type": "int"
+                },
+                {
+                    "description": "The mode of the VSM (standalone/HA)",
+                    "name": "vsmconfigmode",
+                    "type": "string"
+                },
+                {
+                    "description": "device id of the Cisco N1KV VSM device",
+                    "name": "vsmdeviceid",
+                    "type": "string"
+                },
+                {
+                    "description": "the management IP address of the external Cisco Nexus 1000v Virtual Supervisor Module",
+                    "name": "ipaddress",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Dedicates a guest vlan range to an account",
+            "isasync": false,
+            "name": "dedicateGuestVlanRange",
+            "params": [
+                {
+                    "description": "domain ID of the account owning a VLAN",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "createDomain,listDomains,listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "physical network ID of the vlan",
+                    "length": 255,
+                    "name": "physicalnetworkid",
+                    "related": "createPhysicalNetwork",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "account who will own the VLAN",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "guest vlan range to be dedicated",
+                    "length": 255,
+                    "name": "vlanrange",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "project who will own the VLAN",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "listProjectAccounts,suspendProject,activateProject,updateProject,listProjects",
+                    "required": false,
+                    "type": "uuid"
+                }
+            ],
+            "related": "listDedicatedGuestVlanRanges",
+            "response": [
+                {
+                    "description": "the guest VLAN range",
+                    "name": "guestvlanrange",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the guest vlan range",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the guest VLAN range",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain name of the guest VLAN range",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the account of the guest VLAN range",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain ID of the guest VLAN range",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the guest vlan range",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the zone of the guest vlan range",
+                    "name": "zoneid",
+                    "type": "long"
+                },
+                {
+                    "description": "the physical network of the guest vlan range",
+                    "name": "physicalnetworkid",
+                    "type": "long"
+                }
+            ]
+        },
+        {
+            "description": "Adds VM to specified network by creating a NIC",
+            "isasync": true,
+            "name": "addNicToVirtualMachine",
+            "params": [
+                {
+                    "description": "IP Address for the new network",
+                    "length": 255,
+                    "name": "ipaddress",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "Network ID",
+                    "length": 255,
+                    "name": "networkid",
+                    "related": "createNetwork,updateNetwork,listSrxFirewallNetworks,updateNetwork,listBrocadeVcsDeviceNetworks,listNiciraNvpDeviceNetworks,createNetwork,listNetworks,listNetscalerLoadBalancerNetworks,listF5LoadBalancerNetworks,listPaloAltoFirewallNetworks",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "Virtual Machine ID",
+                    "length": 255,
+                    "name": "virtualmachineid",
+                    "related": "updateVMAffinityGroup,detachIso,resetSSHKeyForVirtualMachine,resetSSHKeyForVirtualMachine,migrateVirtualMachineWithVolume,attachIso,removeNicFromVirtualMachine,updateVirtualMachine,recoverVirtualMachine,migrateVirtualMachine,resetPasswordForVirtualMachine,revertToVMSnapshot,assignVirtualMachine,updateVMAffinityGroup,listVirtualMachines,rebootVirtualMachine,restoreVirtualMachine,destroyVirtualMachine,stopVirtualMachine,deployVirtualMachine,detachIso,deployVirtualMachine,updateDefaultNicForVirtualMachine,updateVirtualMachine,revertToVMSnapshot,addNicToVirtualMachine,tmDestroyVirtualMachine,resetPasswordForVirtualMachine,startVirtualMachine,updateDefaultNicForVirtualMachine,startVirtualMachine,attachIso,listVirtualMachines,addNicToVirtualMachine,stopVirtualMachine,destroyVirtualMachine,removeNicFromVirtualMachine,changeServiceForVirtualMachine",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "updateVMAffinityGroup,detachIso,resetSSHKeyForVirtualMachine,resetSSHKeyForVirtualMachine,migrateVirtualMachineWithVolume,attachIso,removeNicFromVirtualMachine,updateVirtualMachine,recoverVirtualMachine,migrateVirtualMachine,resetPasswordForVirtualMachine,revertToVMSnapshot,assignVirtualMachine,updateVMAffinityGroup,listVirtualMachines,rebootVirtualMachine,restoreVirtualMachine,destroyVirtualMachine,stopVirtualMachine,deployVirtualMachine,detachIso,deployVirtualMachine,updateDefaultNicForVirtualMachine,updateVirtualMachine,revertToVMSnapshot,tmDestroyVirtualMachine,resetPasswordForVirtualMachine,startVirtualMachine,updateDefaultNicForVirtualMachine,startVirtualMachine,attachIso,listVirtualMachines,addNicToVirtualMachine,stopVirtualMachine,destroyVirtualMachine,removeNicFromVirtualMachine,changeServiceForVirtualMachine",
+            "response": [
+                {
+                    "description": "the ID of the service offering of the virtual machine",
+                    "name": "serviceofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the virtual machine",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the host for the virtual machine",
+                    "name": "hostname",
+                    "type": "string"
+                },
+                {
+                    "description": "the user's ID who deployed the virtual machine",
+                    "name": "userid",
+                    "type": "string"
+                },
+                {
+                    "description": "user generated name. The name of the virtual machine is returned if no displayname exists.",
+                    "name": "displayname",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the template for the virtual machine. A -1 is returned if the virtual machine was created from an ISO file.",
+                    "name": "templateid",
+                    "type": "string"
+                },
+                {
+                    "description": "true if vm contains XS/VMWare tools inorder to support dynamic scaling of VM cpu/memory.",
+                    "name": "isdynamicallyscalable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "device type of the root volume",
+                    "name": "rootdevicetype",
+                    "type": "string"
+                },
+                {
+                    "description": "the group name of the virtual machine",
+                    "name": "group",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the availability zone for the virtual machine",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the internal memory thats free in vm",
+                    "name": "memoryintfreekbs",
+                    "type": "long"
+                },
+                {
+                    "description": "the name of the ISO attached to the virtual machine",
+                    "name": "isoname",
+                    "type": "string"
+                },
+                {
+                    "description": " an alternate display text of the template for the virtual machine",
+                    "name": "templatedisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the domain in which the virtual machine exists",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the read (bytes) of disk on the vm",
+                    "name": "diskkbsread",
+                    "type": "long"
+                },
+                {
+
+                },
+                {
+                    "description": "an optional field whether to the display the vm to the end user or not.",
+                    "name": "displayvm",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the password (if exists) of the virtual machine",
+                    "name": "password",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the host for the virtual machine",
+                    "name": "hostid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the domain in which the virtual machine exists",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the date when this virtual machine was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the read (io) of disk on the vm",
+                    "name": "diskioread",
+                    "type": "long"
+                },
+                {
+                    "description": "the outgoing network traffic on the host",
+                    "name": "networkkbswrite",
+                    "type": "long"
+                },
+                {
+                    "description": "an alternate display text of the ISO attached to the virtual machine",
+                    "name": "isodisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "instance name of the user vm; this parameter is returned to the ROOT admin only",
+                    "name": "instancename",
+                    "type": "string"
+                },
+                {
+                    "description": "list of affinity groups associated with the virtual machine",
+                    "name": "affinitygroup",
+                    "response": [
+                        {
+                            "description": "the description of the affinity group",
+                            "name": "description",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain name of the affinity group",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "virtual machine IDs associated with this affinity group",
+                            "name": "virtualmachineIds",
+                            "type": "list"
+                        },
+                        {
+                            "description": "the ID of the affinity group",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the name of the affinity group",
+                            "name": "name",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project ID of the affinity group",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name of the affinity group",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain ID of the affinity group",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the type of the affinity group",
+                            "name": "type",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account owning the affinity group",
+                            "name": "account",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "the virtual network for the service offering",
+                    "name": "forvirtualnetwork",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the number of cpu this virtual machine is running with",
+                    "name": "cpunumber",
+                    "type": "integer"
+                },
+                {
+                    "description": "device ID of the root volume",
+                    "name": "rootdeviceid",
+                    "type": "long"
+                },
+                {
+                    "description": "the write (bytes) of disk on the vm",
+                    "name": "diskkbswrite",
+                    "type": "long"
+                },
+                {
+                    "description": "ssh key-pair",
+                    "name": "keypair",
+                    "type": "string"
+                },
+                {
+                    "description": "Vm details in key/value pairs.",
+                    "name": "details",
+                    "type": "map"
+                },
+                {
+                    "description": "the state of the virtual machine",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the virtual machine",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "list of security groups associated with the virtual machine",
+                    "name": "securitygroup",
+                    "response": [
+                        {
+                            "description": "the account owning the security group",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the security group",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the name of the security group",
+                            "name": "name",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain ID of the security group",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of resource tags associated with the rule",
+                            "name": "tags",
+                            "response": [
+                                {
+                                    "description": "customer associated with the tag",
+                                    "name": "customer",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "id of the resource",
+                                    "name": "resourceid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "tag key name",
+                                    "name": "key",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the project id the tag belongs to",
+                                    "name": "projectid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the project name where tag belongs to",
+                                    "name": "project",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "tag value",
+                                    "name": "value",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the ID of the domain associated with the tag",
+                                    "name": "domainid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the account associated with the tag",
+                                    "name": "account",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the domain associated with the tag",
+                                    "name": "domain",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "resource type",
+                                    "name": "resourcetype",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "set"
+                        },
+                        {
+                            "description": "the list of ingress rules associated with the security group",
+                            "name": "ingressrule",
+                            "response": [
+                                {
+                                    "description": "account owning the security group rule",
+                                    "name": "account",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the type of the ICMP message response",
+                                    "name": "icmptype",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the code for the ICMP message response",
+                                    "name": "icmpcode",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the list of resource tags associated with the rule",
+                                    "name": "tags",
+                                    "response": [
+                                        {
+                                            "description": "tag key name",
+                                            "name": "key",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the ID of the domain associated with the tag",
+                                            "name": "domainid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "resource type",
+                                            "name": "resourcetype",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the account associated with the tag",
+                                            "name": "account",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the domain associated with the tag",
+                                            "name": "domain",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag value",
+                                            "name": "value",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project name where tag belongs to",
+                                            "name": "project",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "id of the resource",
+                                            "name": "resourceid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project id the tag belongs to",
+                                            "name": "projectid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "customer associated with the tag",
+                                            "name": "customer",
+                                            "type": "string"
+                                        }
+                                    ],
+                                    "type": "set"
+                                },
+                                {
+                                    "description": "the id of the security group rule",
+                                    "name": "ruleid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the protocol of the security group rule",
+                                    "name": "protocol",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the CIDR notation for the base IP address of the security group rule",
+                                    "name": "cidr",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "security group name",
+                                    "name": "securitygroupname",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the ending IP of the security group rule ",
+                                    "name": "endport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the starting IP of the security group rule",
+                                    "name": "startport",
+                                    "type": "integer"
+                                }
+                            ],
+                            "type": "set"
+                        },
+                        {
+                            "description": "the list of virtualmachine ids associated with this securitygroup",
+                            "name": "virtualmachineids",
+                            "type": "set"
+                        },
+                        {
+                            "description": "the list of egress rules associated with the security group",
+                            "name": "egressrule",
+                            "response": [
+                                {
+                                    "description": "the id of the security group rule",
+                                    "name": "ruleid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the list of resource tags associated with the rule",
+                                    "name": "tags",
+                                    "response": [
+                                        {
+                                            "description": "the domain associated with the tag",
+                                            "name": "domain",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "customer associated with the tag",
+                                            "name": "customer",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag key name",
+                                            "name": "key",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project name where tag belongs to",
+                                            "name": "project",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the account associated with the tag",
+                                            "name": "account",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the ID of the domain associated with the tag",
+                                            "name": "domainid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "resource type",
+                                            "name": "resourcetype",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag value",
+                                            "name": "value",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "id of the resource",
+                                            "name": "resourceid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project id the tag belongs to",
+                                            "name": "projectid",
+                                            "type": "string"
+                                        }
+                                    ],
+                                    "type": "set"
+                                },
+                                {
+                                    "description": "the type of the ICMP message response",
+                                    "name": "icmptype",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "security group name",
+                                    "name": "securitygroupname",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the CIDR notation for the base IP address of the security group rule",
+                                    "name": "cidr",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "account owning the security group rule",
+                                    "name": "account",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the starting IP of the security group rule",
+                                    "name": "startport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the protocol of the security group rule",
+                                    "name": "protocol",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the code for the ICMP message response",
+                                    "name": "icmpcode",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the ending IP of the security group rule ",
+                                    "name": "endport",
+                                    "type": "integer"
+                                }
+                            ],
+                            "type": "set"
+                        },
+                        {
+                            "description": "the number of virtualmachines associated with this securitygroup",
+                            "name": "virtualmachinecount",
+                            "type": "integer"
+                        },
+                        {
+                            "description": "the project id of the group",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name of the group",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the description of the security group",
+                            "name": "description",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain name of the security group",
+                            "name": "domain",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "the ID of the availablility zone for the virtual machine",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the memory allocated for the virtual machine",
+                    "name": "memory",
+                    "type": "integer"
+                },
+                {
+                    "description": "the ID of the ISO attached to the virtual machine",
+                    "name": "isoid",
+                    "type": "string"
+                },
+                {
+                    "description": "public IP address id associated with vm via Static nat rule",
+                    "name": "publicip",
+                    "type": "string"
+                },
+                {
+                    "description": "the speed of each cpu",
+                    "name": "cpuspeed",
+                    "type": "integer"
+                },
+                {
+                    "description": "the list of nics associated with vm",
+                    "name": "nic",
+                    "response": [
+                        {
+                            "description": "Id of the vm to which the nic belongs",
+                            "name": "virtualmachineid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the isolation uri of the nic",
+                            "name": "isolationuri",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if nic is default, false otherwise",
+                            "name": "isdefault",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "the Secondary ipv4 addr of nic",
+                            "name": "secondaryip",
+                            "type": "list"
+                        },
+                        {
+                            "description": "Id of the NSX Logical Switch Port (if NSX based), null otherwise",
+                            "name": "nsxlogicalswitchport",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the name of the corresponding network",
+                            "name": "networkname",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the gateway of IPv6 network",
+                            "name": "ip6gateway",
+                            "type": "string"
+                        },
+                        {
+                            "description": "device id for the network when plugged into the virtual machine",
+                            "name": "deviceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the nic",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ip address of the nic",
+                            "name": "ipaddress",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the broadcast uri of the nic",
+                            "name": "broadcasturi",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the traffic type of the nic",
+                            "name": "traffictype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the corresponding network",
+                            "name": "networkid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the netmask of the nic",
+                            "name": "netmask",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the IPv6 address of network",
+                            "name": "ip6address",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the cidr of IPv6 network",
+                            "name": "ip6cidr",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the gateway of the nic",
+                            "name": "gateway",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the type of the nic",
+                            "name": "type",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the NSX Logical Switch (if NSX based), null otherwise",
+                            "name": "nsxlogicalswitch",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if nic is default, false otherwise",
+                            "name": "macaddress",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "the memory used by the vm",
+                    "name": "memorykbs",
+                    "type": "long"
+                },
+                {
+                    "description": "the incoming network traffic on the vm",
+                    "name": "networkkbsread",
+                    "type": "long"
+                },
+                {
+                    "description": "public IP address id associated with vm via Static nat rule",
+                    "name": "publicipid",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the vm",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the service offering of the virtual machine",
+                    "name": "serviceofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "Os type ID of the virtual machine",
+                    "name": "guestosid",
+                    "type": "string"
+                },
+                {
+                    "description": "State of the Service from LB rule",
+                    "name": "servicestate",
+                    "type": "string"
+                },
+                {
+                    "description": "the vgpu type used by the virtual machine",
+                    "name": "vgpu",
+                    "type": "string"
+                },
+                {
+                    "description": "the target memory in vm",
+                    "name": "memorytargetkbs",
+                    "type": "long"
+                },
+                {
+                    "description": "the write (io) of disk on the vm",
+                    "name": "diskiowrite",
+                    "type": "long"
+                },
+                {
+                    "description": "true if high-availability is enabled, false otherwise",
+                    "name": "haenable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the user's name who deployed the virtual machine",
+                    "name": "username",
+                    "type": "string"
+                },
+                {
+                    "description": "the hypervisor on which the template runs",
+                    "name": "hypervisor",
+                    "type": "string"
+                },
+                {
+                    "description": "the group ID of the virtual machine",
+                    "name": "groupid",
+                    "type": "string"
+                },
+                {
+                    "description": "OS type id of the vm",
+                    "name": "ostypeid",
+                    "type": "long"
+                },
+                {
+                    "description": "the name of the template for the virtual machine",
+                    "name": "templatename",
+                    "type": "string"
+                },
+                {
+                    "description": "true if the password rest feature is enabled, false otherwise",
+                    "name": "passwordenabled",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the account associated with the virtual machine",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the vm",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the disk offering of the virtual machine",
+                    "name": "diskofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the disk offering of the virtual machine",
+                    "name": "diskofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "the amount of the vm's CPU currently used",
+                    "name": "cpuused",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Lists all static routes",
+            "isasync": false,
+            "name": "listStaticRoutes",
+            "params": [
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "list only resources belonging to the domain specified",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "createDomain,listDomains,listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "list resources by account. Must be used with the domainId parameter.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "list static routes by gateway id",
+                    "length": 255,
+                    "name": "gatewayid",
+                    "related": "createPrivateGateway",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list static route by id",
+                    "length": 255,
+                    "name": "id",
+                    "related": "listStaticRoutes",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list static routes by vpc id",
+                    "length": 255,
+                    "name": "vpcid",
+                    "related": "restartVPC,listVPCs,createVPC,updateVPC,listVPCs,createVPC",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list objects by project",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "listProjectAccounts,suspendProject,activateProject,updateProject,listProjects",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "List resources by tags (key/value pairs)",
+                    "length": 255,
+                    "name": "tags",
+                    "required": false,
+                    "type": "map"
+                },
+                {
+                    "description": "defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.",
+                    "length": 255,
+                    "name": "isrecursive",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "If set to false, list only resources belonging to the command's caller; if set to true - list resources that the caller is authorized to see. Default value is false",
+                    "length": 255,
+                    "name": "listall",
+                    "required": false,
+                    "type": "boolean"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the project name of the static route",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the domain associated with the static route",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "VPC the static route belongs to",
+                    "name": "vpcid",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of resource tags associated with static route",
+                    "name": "tags",
+                    "response": [
+                        {
+                            "description": "id of the resource",
+                            "name": "resourceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account associated with the tag",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "customer associated with the tag",
+                            "name": "customer",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain associated with the tag",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "resource type",
+                            "name": "resourcetype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project id the tag belongs to",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the domain associated with the tag",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag key name",
+                            "name": "key",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag value",
+                            "name": "value",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name where tag belongs to",
+                            "name": "project",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "VPC gateway the route is created for",
+                    "name": "gatewayid",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the static route",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "static route CIDR",
+                    "name": "cidr",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of the static route",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the account associated with the static route",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of static route",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain associated with the static route",
+                    "name": "domain",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "lists F5 load balancer devices",
+            "isasync": false,
+            "name": "listF5LoadBalancers",
+            "params": [
+                {
+                    "description": "the Physical Network ID",
+                    "length": 255,
+                    "name": "physicalnetworkid",
+                    "related": "createPhysicalNetwork",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "f5 load balancer device ID",
+                    "length": 255,
+                    "name": "lbdeviceid",
+                    "related": "listF5LoadBalancers,addF5LoadBalancer",
+                    "required": false,
+                    "type": "uuid"
+                }
+            ],
+            "related": "addF5LoadBalancer",
+            "response": [
+                {
+                    "description": "the physical network to which this F5 device belongs to",
+                    "name": "physicalnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "device name",
+                    "name": "lbdevicename",
+                    "type": "string"
+                },
+                {
+                    "description": "the public interface of the load balancer",
+                    "name": "publicinterface",
+                    "type": "string"
+                },
+                {
+                    "description": "device state",
+                    "name": "lbdevicestate",
+                    "type": "string"
+                },
+                {
+                    "description": "name of the provider",
+                    "name": "provider",
+                    "type": "string"
+                },
+                {
+                    "description": "true if device is dedicated for an account",
+                    "name": "lbdevicededicated",
+                    "type": "boolean"
+                },
+                {
+                    "description": "device capacity",
+                    "name": "lbdevicecapacity",
+                    "type": "long"
+                },
+                {
+                    "description": "device id of the F5 load balancer",
+                    "name": "lbdeviceid",
+                    "type": "string"
+                },
+                {
+                    "description": "the private interface of the load balancer",
+                    "name": "privateinterface",
+                    "type": "string"
+                },
+                {
+                    "description": "the management IP address of the external load balancer",
+                    "name": "ipaddress",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Lists all public ip addresses",
+            "isasync": false,
+            "name": "listPublicIpAddresses",
+            "params": [
+                {
+                    "description": "list resources by display flag; only ROOT admin is eligible to pass this parameter",
+                    "length": 255,
+                    "name": "fordisplay",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "boolean"
+                },
+                {
+                    "description": "lists all public IP addresses by state",
+                    "length": 255,
+                    "name": "state",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "list only static NAT IP addresses",
+                    "length": 255,
+                    "name": "isstaticnat",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "If set to false, list only resources belonging to the command's caller; if set to true - list resources that the caller is authorized to see. Default value is false",
+                    "length": 255,
+                    "name": "listall",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "lists the specified IP address",
+                    "length": 255,
+                    "name": "ipaddress",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "lists all public IP addresses by zone ID",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones,listZones,createZone,updateZone",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "limits search results to allocated public IP addresses",
+                    "length": 255,
+                    "name": "allocatedonly",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "lists IP address by ID",
+                    "length": 255,
+                    "name": "id",
+                    "related": "associateIpAddress,restartNetwork,updateIpAddress,associateIpAddress,listPublicIpAddresses,listPublicIpAddresses",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list resources by account. Must be used with the domainId parameter.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "lists all public IP addresses associated to the network specified",
+                    "length": 255,
+                    "name": "associatednetworkid",
+                    "related": "createNetwork,updateNetwork,listSrxFirewallNetworks,updateNetwork,listBrocadeVcsDeviceNetworks,listNiciraNvpDeviceNetworks,createNetwork,listNetworks,listNetscalerLoadBalancerNetworks,listF5LoadBalancerNetworks,listPaloAltoFirewallNetworks",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "List IPs belonging to the VPC",
+                    "length": 255,
+                    "name": "vpcid",
+                    "related": "restartVPC,listVPCs,createVPC,updateVPC,listVPCs,createVPC",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list only source NAT IP addresses",
+                    "length": 255,
+                    "name": "issourcenat",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "list only IPs used for load balancing",
+                    "length": 255,
+                    "name": "forloadbalancing",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.",
+                    "length": 255,
+                    "name": "isrecursive",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "List resources by tags (key/value pairs)",
+                    "length": 255,
+                    "name": "tags",
+                    "required": false,
+                    "type": "map"
+                },
+                {
+                    "description": "list only resources belonging to the domain specified",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "createDomain,listDomains,listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list objects by project",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "listProjectAccounts,suspendProject,activateProject,updateProject,listProjects",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "lists all public IP addresses by VLAN ID",
+                    "length": 255,
+                    "name": "vlanid",
+                    "related": "createVlanIpRange,listVlanIpRanges,dedicatePublicIpRange",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the virtual network for the IP address",
+                    "length": 255,
+                    "name": "forvirtualnetwork",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "lists all public IP addresses by physical network ID",
+                    "length": 255,
+                    "name": "physicalnetworkid",
+                    "related": "createPhysicalNetwork",
+                    "required": false,
+                    "type": "uuid"
+                }
+            ],
+            "related": "associateIpAddress,restartNetwork,updateIpAddress,associateIpAddress,listPublicIpAddresses",
+            "response": [
+                {
+                    "description": "the name of the zone the public IP address belongs to",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the zone the public IP address belongs to",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "is public ip for display to the regular user",
+                    "name": "fordisplay",
+                    "type": "boolean"
+                },
+                {
+                    "description": "virutal machine (dnat) ip address (not null only for static nat Ip)",
+                    "name": "vmipaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "purpose of the IP address. In Acton this value is not null for Ips with isSystem=true, and can have either StaticNat or LB value",
+                    "name": "purpose",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the address",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "date the public IP address was acquired",
+                    "name": "allocated",
+                    "type": "date"
+                },
+                {
+                    "description": "public IP address id",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "is public IP portable across the zones",
+                    "name": "isportable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the account the public IP address is associated with",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "virutal machine name the ip address is assigned to (not null only for static nat Ip)",
+                    "name": "virtualmachinename",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the Network associated with the IP address",
+                    "name": "associatednetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "VPC the ip belongs to",
+                    "name": "vpcid",
+                    "type": "string"
+                },
+                {
+                    "description": "true if this ip is system ip (was allocated as a part of deployVm or createLbRule)",
+                    "name": "issystem",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the name of the Network associated with the IP address",
+                    "name": "associatednetworkname",
+                    "type": "string"
+                },
+                {
+                    "description": "State of the ip address. Can be: Allocatin, Allocated and Releasing",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the VLAN associated with the IP address",
+                    "name": "vlanname",
+                    "type": "string"
+                },
+                {
+                    "description": "the physical network this belongs to",
+                    "name": "physicalnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "public IP address",
+                    "name": "ipaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "true if the IP address is a source nat address, false otherwise",
+                    "name": "issourcenat",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the ID of the VLAN associated with the IP address. This parameter is visible to ROOT admins only",
+                    "name": "vlanid",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain ID the public IP address is associated with",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the Network where ip belongs to",
+                    "name": "networkid",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the ipaddress",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "true if this ip is for static nat, false otherwise",
+                    "name": "isstaticnat",
+                    "type": "boolean"
+                },
+                {
+                    "description": "virutal machine display name the ip address is assigned to (not null only for static nat Ip)",
+                    "name": "virtualmachinedisplayname",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of resource tags associated with ip address",
+                    "name": "tags",
+                    "response": [
+                        {
+                            "description": "tag key name",
+                            "name": "key",
+                            "type": "string"
+                        },
+                        {
+                            "description": "resource type",
+                            "name": "resourcetype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account associated with the tag",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "customer associated with the tag",
+                            "name": "customer",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the domain associated with the tag",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain associated with the tag",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name where tag belongs to",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag value",
+                            "name": "value",
+                            "type": "string"
+                        },
+                        {
+                            "description": "id of the resource",
+                            "name": "resourceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project id the tag belongs to",
+                            "name": "projectid",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "the domain the public IP address is associated with",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the virtual network for the IP address",
+                    "name": "forvirtualnetwork",
+                    "type": "boolean"
+                },
+                {
+                    "description": "virutal machine id the ip address is assigned to (not null only for static nat Ip)",
+                    "name": "virtualmachineid",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Lists F5 external load balancer appliances added in a zone.",
+            "isasync": false,
+            "name": "listExternalLoadBalancers",
+            "params": [
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "zone Id",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones,listZones,createZone,updateZone",
+                    "required": false,
+                    "type": "uuid"
+                }
+            ],
+            "related": "addBaremetalHost,prepareHostForMaintenance,reconnectHost,addHost,cancelHostMaintenance",
+            "response": [
+                {
+                    "description": "events available for the host",
+                    "name": "events",
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone name of the host",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the management server ID of the host",
+                    "name": "managementserverid",
+                    "type": "long"
+                },
+                {
+                    "description": "the hypervisor version",
+                    "name": "hypervisorversion",
+                    "type": "string"
+                },
+                {
+                    "description": "the date and time the host was last pinged",
+                    "name": "lastpinged",
+                    "type": "date"
+                },
+                {
+                    "description": "the amount of the host's CPU currently used",
+                    "name": "cpuused",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the host",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the cpu average load on the host",
+                    "name": "averageload",
+                    "type": "long"
+                },
+                {
+                    "description": "the incoming network traffic on the host",
+                    "name": "networkkbsread",
+                    "type": "long"
+                },
+                {
+                    "description": "Host details in key/value pairs.",
+                    "name": "details",
+                    "type": "map"
+                },
+                {
+                    "description": "comma-separated list of tags for the host",
+                    "name": "hosttags",
+                    "type": "string"
+                },
+                {
+                    "description": "the host hypervisor",
+                    "name": "hypervisor",
+                    "type": "hypervisortype"
+                },
+                {
+                    "description": "capabilities of the host",
+                    "name": "capabilities",
+                    "type": "string"
+                },
+                {
+                    "description": "the amount of the host's CPU after applying the cpu.overprovisioning.factor ",
+                    "name": "cpuwithoverprovisioning",
+                    "type": "string"
+                },
+                {
+                    "description": "the cluster type of the cluster that host belongs to",
+                    "name": "clustertype",
+                    "type": "string"
+                },
+                {
+                    "description": "the memory total of the host",
+                    "name": "memorytotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the Zone ID of the host",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the host version",
+                    "name": "version",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of the host",
+                    "name": "state",
+                    "type": "status"
+                },
+                {
+                    "description": "true if the host is disconnected. False otherwise.",
+                    "name": "disconnected",
+                    "type": "date"
+                },
+                {
+                    "description": "the Pod name of the host",
+                    "name": "podname",
+                    "type": "string"
+                },
+                {
+                    "description": "the outgoing network traffic on the host",
+                    "name": "networkkbswrite",
+                    "type": "long"
+                },
+                {
+                    "description": "the Pod ID of the host",
+                    "name": "podid",
+                    "type": "string"
+                },
+                {
+                    "description": "the OS category ID of the host",
+                    "name": "oscategoryid",
+                    "type": "string"
+                },
+                {
+                    "description": "the amount of the host's memory currently used",
+                    "name": "memoryused",
+                    "type": "long"
+                },
+                {
+                    "description": "the host out-of-band management information",
+                    "name": "outofbandmanagement",
+                    "type": "outofbandmanagementresponse"
+                },
+                {
+                    "description": "GPU cards present in the host",
+                    "name": "gpugroup",
+                    "response": [
+                        {
+                            "description": "the list of enabled vGPUs",
+                            "name": "vgpu",
+                            "response": [
+                                {
+                                    "description": "Video RAM for this vGPU type",
+                                    "name": "videoram",
+                                    "type": "long"
+                                },
+                                {
+                                    "description": "Maximum Y resolution per display",
+                                    "name": "maxresolutiony",
+                                    "type": "long"
+                                },
+                                {
+                                    "description": "Remaining capacity in terms of no. of more VMs that can be deployped with this vGPU type",
+                                    "name": "remainingcapacity",
+                                    "type": "long"
+                                },
+                                {
+                                    "description": "Maximum vgpu can be created with this vgpu type on the given gpu group",
+                                    "name": "maxcapacity",
+                                    "type": "long"
+                                },
+                                {
+                                    "description": "Maximum X resolution per display",
+                                    "name": "maxresolutionx",
+                                    "type": "long"
+                                },
+                                {
+                                    "description": "Maximum displays per user",
+                                    "name": "maxheads",
+                                    "type": "long"
+                                },
+                                {
+                                    "description": "Model Name of vGPU",
+                                    "name": "vgputype",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "Maximum no. of vgpu per gpu card (pgpu)",
+                                    "name": "maxvgpuperpgpu",
+                                    "type": "long"
+                                }
+                            ],
+                            "type": "list"
+                        },
+                        {
+                            "description": "GPU cards present in the host",
+                            "name": "gpugroupname",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "true if this host is suitable(has enough capacity and satisfies all conditions like hosttags, max guests vm limit etc) to migrate a VM to it , false otherwise",
+                    "name": "suitableformigration",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the cluster name of the host",
+                    "name": "clustername",
+                    "type": "string"
+                },
+                {
+                    "description": "true if this host has enough CPU and RAM capacity to migrate a VM to it, false otherwise",
+                    "name": "hasenoughcapacity",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the host type",
+                    "name": "type",
+                    "type": "type"
+                },
+                {
+                    "description": "the CPU number of the host",
+                    "name": "cpunumber",
+                    "type": "integer"
+                },
+                {
+                    "description": "the CPU speed of the host",
+                    "name": "cpuspeed",
+                    "type": "long"
+                },
+                {
+                    "description": "the amount of the host's CPU currently allocated",
+                    "name": "cpuallocated",
+                    "type": "string"
+                },
+                {
+                    "description": "true if local storage is active, false otherwise",
+                    "name": "islocalstorageactive",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the cluster ID of the host",
+                    "name": "clusterid",
+                    "type": "string"
+                },
+                {
+                    "description": "true if the host is Ha host (dedicated to vms started by HA process; false otherwise",
+                    "name": "hahost",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the number of CPU sockets on the host",
+                    "name": "cpusockets",
+                    "type": "integer"
+                },
+                {
+                    "description": "the total disk size of the host",
+                    "name": "disksizetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the ID of the host",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the date and time the host was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the resource state of the host",
+                    "name": "resourcestate",
+                    "type": "string"
+                },
+                {
+                    "description": "the IP address of the host",
+                    "name": "ipaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the date and time the host was removed",
+                    "name": "removed",
+                    "type": "date"
+                },
+                {
+                    "description": "the amount of the host's memory currently allocated",
+                    "name": "memoryallocated",
+                    "type": "long"
+                },
+                {
+                    "description": "the host's currently allocated disk size",
+                    "name": "disksizeallocated",
+                    "type": "long"
+                },
+                {
+                    "description": "the OS category name of the host",
+                    "name": "oscategoryname",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Updates an ISO file.",
+            "isasync": false,
+            "name": "updateIso",
+            "params": [
+                {
+                    "description": "true if the template type is routing i.e., if template is used to deploy router",
+                    "length": 255,
+                    "name": "isrouting",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if the template requres HVM, false otherwise; available only for updateTemplate API",
+                    "length": 255,
+                    "name": "requireshvm",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "Details in key/value pairs using format details[i].keyname=keyvalue. Example: details[0].hypervisortoolsversion=xenserver61",
+                    "length": 255,
+                    "name": "details",
+                    "required": false,
+                    "type": "map"
+                },
+                {
+                    "description": "the format for the image",
+                    "length": 255,
+                    "name": "format",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the image file",
+                    "length": 255,
+                    "name": "name",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "true if template/ISO contains XS/VMWare tools inorder to support dynamic scaling of VM cpu/memory",
+                    "length": 255,
+                    "name": "isdynamicallyscalable",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "the ID of the image file",
+                    "length": 255,
+                    "name": "id",
+                    "related": "copyTemplate,registerTemplate,listIsos,copyTemplate,registerTemplate,listTemplates,createTemplate,registerIso,registerIso,prepareTemplate,updateIso,listIsos,updateTemplate,createTemplate,copyIso",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the display text of the image",
+                    "length": 4096,
+                    "name": "displaytext",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "sort key of the template, integer",
+                    "length": 255,
+                    "name": "sortkey",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "the ID of the OS type that best represents the OS of this image.",
+                    "length": 255,
+                    "name": "ostypeid",
+                    "related": "addGuestOs,listOsTypes",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "true if the image supports the password reset feature; default is false",
+                    "length": 255,
+                    "name": "passwordenabled",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if image is bootable, false otherwise; available only for updateIso API",
+                    "length": 255,
+                    "name": "bootable",
+                    "required": false,
+                    "type": "boolean"
+                }
+            ],
+            "related": "copyTemplate,registerTemplate,listIsos,copyTemplate,registerTemplate,listTemplates,createTemplate,registerIso,registerIso,prepareTemplate,listIsos,updateTemplate,createTemplate,copyIso",
+            "response": [
+                {
+                    "description": "true if this template is a public template, false otherwise",
+                    "name": "ispublic",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the hypervisor on which the template runs",
+                    "name": "hypervisor",
+                    "type": "string"
+                },
+                {
+                    "description": "the template name",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the template",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "true if this template is a featured template, false otherwise",
+                    "name": "isfeatured",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the ID of the OS type for this template.",
+                    "name": "ostypeid",
+                    "type": "string"
+                },
+                {
+                    "description": "the date this template was removed",
+                    "name": "removed",
+                    "type": "date"
+                },
+                {
+                    "description": "the account name to which the template belongs",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the tag of this template",
+                    "name": "templatetag",
+                    "type": "string"
+                },
+                {
+                    "description": "true if the template is extractable, false otherwise",
+                    "name": "isextractable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the size of the template",
+                    "name": "size",
+                    "type": "long"
+                },
+                {
+                    "description": "true if the reset password feature is enabled, false otherwise",
+                    "name": "passwordenabled",
+                    "type": "boolean"
+                },
+                {
+                    "description": "additional key/value details tied with template",
+                    "name": "details",
+                    "type": "map"
+                },
+                {
+                    "description": "the date this template was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "true if the template is ready to be deployed from, false otherwise.",
+                    "name": "isready",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the account id to which the template belongs",
+                    "name": "accountid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the domain to which the template belongs",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the zone for this template",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the format of the template.",
+                    "name": "format",
+                    "type": "imageformat"
+                },
+                {
+                    "description": "true if the template is managed across all Zones, false otherwise",
+                    "name": "crossZones",
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if template is sshkey enabled, false otherwise",
+                    "name": "sshkeyenabled",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the type of the template",
+                    "name": "templatetype",
+                    "type": "string"
+                },
+                {
+                    "description": "the template ID of the parent template if present",
+                    "name": "sourcetemplateid",
+                    "type": "string"
+                },
+                {
+                    "description": "the template ID",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the status of the template",
+                    "name": "status",
+                    "type": "string"
+                },
+                {
+                    "description": "the template display text",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the zone for this template",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "true if template contains XS/VMWare tools inorder to support dynamic scaling of VM cpu/memory",
+                    "name": "isdynamicallyscalable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the name of the OS type for this template.",
+                    "name": "ostypename",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the domain to which the template belongs",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "true if the ISO is bootable, false otherwise",
+                    "name": "bootable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the ID of the secondary storage host for the template",
+                    "name": "hostid",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the template",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "checksum of the template",
+                    "name": "checksum",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the secondary storage host for the template",
+                    "name": "hostname",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Lists OpenDyalight controllers",
+            "isasync": false,
+            "name": "listOpenDaylightControllers",
+            "params": [
+                {
+                    "description": "the Physical Network ID",
+                    "length": 255,
+                    "name": "physicalnetworkid",
+                    "related": "createPhysicalNetwork",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the ID of a OpenDaylight Controller",
+                    "length": 255,
+                    "name": "id",
+                    "related": "addOpenDaylightController,deleteOpenDaylightController,listOpenDaylightControllers",
+                    "required": false,
+                    "type": "uuid"
+                }
+            ],
+            "related": "addOpenDaylightController,deleteOpenDaylightController",
+            "response": [
+                {
+                    "description": "the username to authenticate to the controller",
+                    "name": "username",
+                    "type": "string"
+                },
+                {
+                    "description": "the name assigned to the controller",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "device id of the controller",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the physical network to which this controller belongs to",
+                    "name": "physicalnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "the url of the controller api",
+                    "name": "url",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Adds a BigSwitch BCF Controller device",
+            "isasync": true,
+            "name": "addBigSwitchBcfDevice",
+            "params": [
+                {
+                    "description": "Hostname of ip address of the BigSwitch BCF Controller.",
+                    "length": 255,
+                    "name": "hostname",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the Physical Network ID",
+                    "length": 255,
+                    "name": "physicalnetworkid",
+                    "related": "createPhysicalNetwork",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "Username of the BigSwitch BCF Controller.",
+                    "length": 255,
+                    "name": "username",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "NAT support of the BigSwitch BCF Controller.",
+                    "length": 255,
+                    "name": "nat",
+                    "required": true,
+                    "type": "boolean"
+                },
+                {
+                    "description": "Password of the BigSwitch BCF Controller.",
+                    "length": 255,
+                    "name": "password",
+                    "required": true,
+                    "type": "string"
+                }
+            ],
+            "related": "listBigSwitchBcfDevices",
+            "response": [
+                {
+                    "description": "the controller username",
+                    "name": "username",
+                    "type": "string"
+                },
+                {
+                    "description": "NAT support",
+                    "name": "nat",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the controller password",
+                    "name": "password",
+                    "type": "string"
+                },
+                {
+                    "description": "the controller Ip address",
+                    "name": "hostname",
+                    "type": "string"
+                },
+                {
+                    "description": "device id of the BigSwitch BCF Controller",
+                    "name": "bcfdeviceid",
+                    "type": "string"
+                },
+                {
+                    "description": "the physical network to which this BigSwitch BCF segment belongs to",
+                    "name": "physicalnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "name of the provider",
+                    "name": "provider",
+                    "type": "string"
+                },
+                {
+                    "description": "device name",
+                    "name": "bigswitchdevicename",
+                    "type": "string"
+                }
+            ],
+            "since": "4.6.0"
+        },
+        {
+            "description": "Deletes a counter",
+            "isasync": true,
+            "name": "deleteCounter",
+            "params": [
+                {
+                    "description": "the ID of the counter",
+                    "length": 255,
+                    "name": "id",
+                    "related": "createCounter,listCounters",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "Changes the default NIC on a VM",
+            "isasync": true,
+            "name": "updateDefaultNicForVirtualMachine",
+            "params": [
+                {
+                    "description": "Virtual Machine ID",
+                    "length": 255,
+                    "name": "virtualmachineid",
+                    "related": "updateVMAffinityGroup,detachIso,resetSSHKeyForVirtualMachine,resetSSHKeyForVirtualMachine,migrateVirtualMachineWithVolume,attachIso,removeNicFromVirtualMachine,updateVirtualMachine,recoverVirtualMachine,migrateVirtualMachine,resetPasswordForVirtualMachine,revertToVMSnapshot,assignVirtualMachine,updateVMAffinityGroup,listVirtualMachines,rebootVirtualMachine,restoreVirtualMachine,destroyVirtualMachine,stopVirtualMachine,deployVirtualMachine,detachIso,deployVirtualMachine,updateDefaultNicForVirtualMachine,updateVirtualMachine,revertToVMSnapshot,tmDestroyVirtualMachine,resetPasswordForVirtualMachine,startVirtualMachine,updateDefaultNicForVirtualMachine,startVirtualMachine,attachIso,listVirtualMachines,addNicToVirtualMachine,stopVirtualMachine,destroyVirtualMachine,removeNicFromVirtualMachine,changeServiceForVirtualMachine",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "NIC ID",
+                    "length": 255,
+                    "name": "nicid",
+                    "related": "",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "updateVMAffinityGroup,detachIso,resetSSHKeyForVirtualMachine,resetSSHKeyForVirtualMachine,migrateVirtualMachineWithVolume,attachIso,removeNicFromVirtualMachine,updateVirtualMachine,recoverVirtualMachine,migrateVirtualMachine,resetPasswordForVirtualMachine,revertToVMSnapshot,assignVirtualMachine,updateVMAffinityGroup,listVirtualMachines,rebootVirtualMachine,restoreVirtualMachine,destroyVirtualMachine,stopVirtualMachine,deployVirtualMachine,detachIso,deployVirtualMachine,updateVirtualMachine,revertToVMSnapshot,tmDestroyVirtualMachine,resetPasswordForVirtualMachine,startVirtualMachine,updateDefaultNicForVirtualMachine,startVirtualMachine,attachIso,listVirtualMachines,addNicToVirtualMachine,stopVirtualMachine,destroyVirtualMachine,removeNicFromVirtualMachine,changeServiceForVirtualMachine",
+            "response": [
+                {
+                    "description": "the ID of the virtual machine",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": " an alternate display text of the template for the virtual machine",
+                    "name": "templatedisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "instance name of the user vm; this parameter is returned to the ROOT admin only",
+                    "name": "instancename",
+                    "type": "string"
+                },
+                {
+                    "description": "the number of cpu this virtual machine is running with",
+                    "name": "cpunumber",
+                    "type": "integer"
+                },
+                {
+                    "description": "the state of the virtual machine",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "list of security groups associated with the virtual machine",
+                    "name": "securitygroup",
+                    "response": [
+                        {
+                            "description": "the domain name of the security group",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name of the group",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the description of the security group",
+                            "name": "description",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project id of the group",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the number of virtualmachines associated with this securitygroup",
+                            "name": "virtualmachinecount",
+                            "type": "integer"
+                        },
+                        {
+                            "description": "the account owning the security group",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of egress rules associated with the security group",
+                            "name": "egressrule",
+                            "response": [
+                                {
+                                    "description": "account owning the security group rule",
+                                    "name": "account",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the type of the ICMP message response",
+                                    "name": "icmptype",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the ending IP of the security group rule ",
+                                    "name": "endport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "security group name",
+                                    "name": "securitygroupname",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the protocol of the security group rule",
+                                    "name": "protocol",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the list of resource tags associated with the rule",
+                                    "name": "tags",
+                                    "response": [
+                                        {
+                                            "description": "resource type",
+                                            "name": "resourcetype",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the ID of the domain associated with the tag",
+                                            "name": "domainid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project name where tag belongs to",
+                                            "name": "project",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "id of the resource",
+                                            "name": "resourceid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag value",
+                                            "name": "value",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "customer associated with the tag",
+                                            "name": "customer",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag key name",
+                                            "name": "key",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project id the tag belongs to",
+                                            "name": "projectid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the account associated with the tag",
+                                            "name": "account",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the domain associated with the tag",
+                                            "name": "domain",
+                                            "type": "string"
+                                        }
+                                    ],
+                                    "type": "set"
+                                },
+                                {
+                                    "description": "the id of the security group rule",
+                                    "name": "ruleid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the code for the ICMP message response",
+                                    "name": "icmpcode",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the starting IP of the security group rule",
+                                    "name": "startport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the CIDR notation for the base IP address of the security group rule",
+                                    "name": "cidr",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "set"
+                        },
+                        {
+                            "description": "the list of virtualmachine ids associated with this securitygroup",
+                            "name": "virtualmachineids",
+                            "type": "set"
+                        },
+                        {
+                            "description": "the domain ID of the security group",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of ingress rules associated with the security group",
+                            "name": "ingressrule",
+                            "response": [
+                                {
+                                    "description": "account owning the security group rule",
+                                    "name": "account",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the protocol of the security group rule",
+                                    "name": "protocol",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the starting IP of the security group rule",
+                                    "name": "startport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "security group name",
+                                    "name": "securitygroupname",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the type of the ICMP message response",
+                                    "name": "icmptype",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the code for the ICMP message response",
+                                    "name": "icmpcode",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the list of resource tags associated with the rule",
+                                    "name": "tags",
+                                    "response": [
+                                        {
+                                            "description": "the account associated with the tag",
+                                            "name": "account",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the domain associated with the tag",
+                                            "name": "domain",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "customer associated with the tag",
+                                            "name": "customer",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the ID of the domain associated with the tag",
+                                            "name": "domainid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project id the tag belongs to",
+                                            "name": "projectid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "resource type",
+                                            "name": "resourcetype",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag key name",
+                                            "name": "key",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project name where tag belongs to",
+                                            "name": "project",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "id of the resource",
+                                            "name": "resourceid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag value",
+                                            "name": "value",
+                                            "type": "string"
+                                        }
+                                    ],
+                                    "type": "set"
+                                },
+                                {
+                                    "description": "the ending IP of the security group rule ",
+                                    "name": "endport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the id of the security group rule",
+                                    "name": "ruleid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the CIDR notation for the base IP address of the security group rule",
+                                    "name": "cidr",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "set"
+                        },
+                        {
+                            "description": "the ID of the security group",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the name of the security group",
+                            "name": "name",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of resource tags associated with the rule",
+                            "name": "tags",
+                            "response": [
+                                {
+                                    "description": "tag key name",
+                                    "name": "key",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "customer associated with the tag",
+                                    "name": "customer",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the project id the tag belongs to",
+                                    "name": "projectid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the ID of the domain associated with the tag",
+                                    "name": "domainid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the project name where tag belongs to",
+                                    "name": "project",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the domain associated with the tag",
+                                    "name": "domain",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "tag value",
+                                    "name": "value",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "resource type",
+                                    "name": "resourcetype",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "id of the resource",
+                                    "name": "resourceid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the account associated with the tag",
+                                    "name": "account",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "set"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "public IP address id associated with vm via Static nat rule",
+                    "name": "publicipid",
+                    "type": "string"
+                },
+                {
+                    "description": "the user's ID who deployed the virtual machine",
+                    "name": "userid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the host for the virtual machine",
+                    "name": "hostname",
+                    "type": "string"
+                },
+                {
+                    "description": "the incoming network traffic on the vm",
+                    "name": "networkkbsread",
+                    "type": "long"
+                },
+                {
+                    "description": "the virtual network for the service offering",
+                    "name": "forvirtualnetwork",
+                    "type": "boolean"
+                },
+                {
+                    "description": "Vm details in key/value pairs.",
+                    "name": "details",
+                    "type": "map"
+                },
+                {
+                    "description": "the memory allocated for the virtual machine",
+                    "name": "memory",
+                    "type": "integer"
+                },
+                {
+                    "description": "the account associated with the virtual machine",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the availablility zone for the virtual machine",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the service offering of the virtual machine",
+                    "name": "serviceofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "device ID of the root volume",
+                    "name": "rootdeviceid",
+                    "type": "long"
+                },
+                {
+                    "description": "true if high-availability is enabled, false otherwise",
+                    "name": "haenable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the project id of the vm",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "true if vm contains XS/VMWare tools inorder to support dynamic scaling of VM cpu/memory.",
+                    "name": "isdynamicallyscalable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "Os type ID of the virtual machine",
+                    "name": "guestosid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the ISO attached to the virtual machine",
+                    "name": "isoid",
+                    "type": "string"
+                },
+                {
+                    "description": "the write (io) of disk on the vm",
+                    "name": "diskiowrite",
+                    "type": "long"
+                },
+                {
+                    "description": "the name of the disk offering of the virtual machine",
+                    "name": "diskofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the disk offering of the virtual machine",
+                    "name": "diskofferingid",
+                    "type": "string"
+                },
+                {
+
+                },
+                {
+                    "description": "the date when this virtual machine was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the name of the template for the virtual machine",
+                    "name": "templatename",
+                    "type": "string"
+                },
+                {
+                    "description": "an alternate display text of the ISO attached to the virtual machine",
+                    "name": "isodisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "State of the Service from LB rule",
+                    "name": "servicestate",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the vm",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the hypervisor on which the template runs",
+                    "name": "hypervisor",
+                    "type": "string"
+                },
+                {
+                    "description": "OS type id of the vm",
+                    "name": "ostypeid",
+                    "type": "long"
+                },
+                {
+                    "description": "the read (bytes) of disk on the vm",
+                    "name": "diskkbsread",
+                    "type": "long"
+                },
+                {
+                    "description": "the target memory in vm",
+                    "name": "memorytargetkbs",
+                    "type": "long"
+                },
+                {
+                    "description": "the outgoing network traffic on the host",
+                    "name": "networkkbswrite",
+                    "type": "long"
+                },
+                {
+                    "description": "the list of nics associated with vm",
+                    "name": "nic",
+                    "response": [
+                        {
+                            "description": "the isolation uri of the nic",
+                            "name": "isolationuri",
+                            "type": "string"
+                        },
+                        {
+                            "description": "device id for the network when plugged into the virtual machine",
+                            "name": "deviceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the NSX Logical Switch Port (if NSX based), null otherwise",
+                            "name": "nsxlogicalswitchport",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the IPv6 address of network",
+                            "name": "ip6address",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the netmask of the nic",
+                            "name": "netmask",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the nic",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the type of the nic",
+                            "name": "type",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if nic is default, false otherwise",
+                            "name": "isdefault",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "the broadcast uri of the nic",
+                            "name": "broadcasturi",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the gateway of IPv6 network",
+                            "name": "ip6gateway",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the cidr of IPv6 network",
+                            "name": "ip6cidr",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the name of the corresponding network",
+                            "name": "networkname",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the corresponding network",
+                            "name": "networkid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ip address of the nic",
+                            "name": "ipaddress",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the traffic type of the nic",
+                            "name": "traffictype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the Secondary ipv4 addr of nic",
+                            "name": "secondaryip",
+                            "type": "list"
+                        },
+                        {
+                            "description": "Id of the vm to which the nic belongs",
+                            "name": "virtualmachineid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the gateway of the nic",
+                            "name": "gateway",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if nic is default, false otherwise",
+                            "name": "macaddress",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the NSX Logical Switch (if NSX based), null otherwise",
+                            "name": "nsxlogicalswitch",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "the name of the availability zone for the virtual machine",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "an optional field whether to the display the vm to the end user or not.",
+                    "name": "displayvm",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the password (if exists) of the virtual machine",
+                    "name": "password",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the ISO attached to the virtual machine",
+                    "name": "isoname",
+                    "type": "string"
+                },
+                {
+                    "description": "public IP address id associated with vm via Static nat rule",
+                    "name": "publicip",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the service offering of the virtual machine",
+                    "name": "serviceofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "the group name of the virtual machine",
+                    "name": "group",
+                    "type": "string"
+                },
+                {
+                    "description": "the speed of each cpu",
+                    "name": "cpuspeed",
+                    "type": "integer"
+                },
+                {
+                    "description": "list of affinity groups associated with the virtual machine",
+                    "name": "affinitygroup",
+                    "response": [
+                        {
+                            "description": "the name of the affinity group",
+                            "name": "name",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the description of the affinity group",
+                            "name": "description",
+                            "type": "string"
+                        },
+                        {
+                            "description": "virtual machine IDs associated with this affinity group",
+                            "name": "virtualmachineIds",
+                            "type": "list"
+                        },
+                        {
+                            "description": "the account owning the affinity group",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain ID of the affinity group",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the type of the affinity group",
+                            "name": "type",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the affinity group",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain name of the affinity group",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name of the affinity group",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project ID of the affinity group",
+                            "name": "projectid",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "the vgpu type used by the virtual machine",
+                    "name": "vgpu",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the domain in which the virtual machine exists",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "device type of the root volume",
+                    "name": "rootdevicetype",
+                    "type": "string"
+                },
+                {
+                    "description": "the group ID of the virtual machine",
+                    "name": "groupid",
+                    "type": "string"
+                },
+                {
+                    "description": "the read (io) of disk on the vm",
+                    "name": "diskioread",
+                    "type": "long"
+                },
+                {
+                    "description": "the memory used by the vm",
+                    "name": "memorykbs",
+                    "type": "long"
+                },
+                {
+                    "description": "the ID of the host for the virtual machine",
+                    "name": "hostid",
+                    "type": "string"
+                },
+                {
+                    "description": "the internal memory thats free in vm",
+                    "name": "memoryintfreekbs",
+                    "type": "long"
+                },
+                {
+                    "description": "the amount of the vm's CPU currently used",
+                    "name": "cpuused",
+                    "type": "string"
+                },
+                {
+                    "description": "user generated name. The name of the virtual machine is returned if no displayname exists.",
+                    "name": "displayname",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the template for the virtual machine. A -1 is returned if the virtual machine was created from an ISO file.",
+                    "name": "templateid",
+                    "type": "string"
+                },
+                {
+                    "description": "true if the password rest feature is enabled, false otherwise",
+                    "name": "passwordenabled",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the name of the virtual machine",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "ssh key-pair",
+                    "name": "keypair",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the domain in which the virtual machine exists",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the write (bytes) of disk on the vm",
+                    "name": "diskkbswrite",
+                    "type": "long"
+                },
+                {
+                    "description": "the user's name who deployed the virtual machine",
+                    "name": "username",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Initiates the specified power action to the host's out-of-band management interface",
+            "isasync": true,
+            "name": "issueOutOfBandManagementPowerAction",
+            "params": [
+                {
+                    "description": "the ID of the host",
+                    "length": 255,
+                    "name": "hostid",
+                    "related": "addBaremetalHost,prepareHostForMaintenance,reconnectHost,addHost,cancelHostMaintenance",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "optional operation timeout in seconds that overrides the global or cluster-level out-of-band management timeout setting",
+                    "length": 255,
+                    "name": "timeout",
+                    "required": false,
+                    "type": "long"
+                },
+                {
+                    "description": "out-of-band management power actions, valid actions are: ON, OFF, CYCLE, RESET, SOFT, STATUS",
+                    "length": 255,
+                    "name": "action",
+                    "required": true,
+                    "type": "string"
+                }
+            ],
+            "related": "disableOutOfBandManagementForCluster,disableOutOfBandManagementForHost,enableOutOfBandManagementForCluster,enableOutOfBandManagementForHost",
+            "response": [
+                {
+                    "description": "the out-of-band management interface password",
+                    "name": "password",
+                    "type": "string"
+                },
+                {
+                    "description": "the out-of-band management driver for the host",
+                    "name": "driver",
+                    "type": "string"
+                },
+                {
+                    "description": "the out-of-band management action (if issued)",
+                    "name": "action",
+                    "type": "string"
+                },
+                {
+                    "description": "the operation result",
+                    "name": "status",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the out-of-band management interface address",
+                    "name": "address",
+                    "type": "string"
+                },
+                {
+                    "description": "the out-of-band management interface powerState of the host",
+                    "name": "powerstate",
+                    "type": "powerstate"
+                },
+                {
+                    "description": "the operation result description",
+                    "name": "description",
+                    "type": "string"
+                },
+                {
+                    "description": "the out-of-band management interface username",
+                    "name": "username",
+                    "type": "string"
+                },
+                {
+                    "description": "true if out-of-band management is enabled for the host",
+                    "name": "enabled",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the out-of-band management interface port",
+                    "name": "port",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the host",
+                    "name": "hostid",
+                    "type": "string"
+                }
+            ],
+            "since": "4.9.0"
+        },
+        {
+            "description": "Deletes a user for an account",
+            "isasync": false,
+            "name": "deleteUser",
+            "params": [
+                {
+                    "description": "id of the user to be deleted",
+                    "length": 255,
+                    "name": "id",
+                    "related": "disableUser,lockUser,enableUser,getUser,listUsers,updateUser,createUser",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "Deletes network device.",
+            "isasync": false,
+            "name": "deleteNetworkDevice",
+            "params": [
+                {
+                    "description": "Id of network device to delete",
+                    "length": 255,
+                    "name": "id",
+                    "related": "addBaremetalHost,prepareHostForMaintenance,reconnectHost,addHost,cancelHostMaintenance",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                },
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Creates a port forwarding rule",
+            "isasync": true,
+            "name": "createPortForwardingRule",
+            "params": [
+                {
+                    "description": "VM guest nic secondary IP address for the port forwarding rule",
+                    "length": 255,
+                    "name": "vmguestip",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the IP address id of the port forwarding rule",
+                    "length": 255,
+                    "name": "ipaddressid",
+                    "related": "associateIpAddress,restartNetwork,updateIpAddress,associateIpAddress,listPublicIpAddresses",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the protocol for the port forwarding rule. Valid values are TCP or UDP.",
+                    "length": 255,
+                    "name": "protocol",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the starting port of port forwarding rule's private port range",
+                    "length": 255,
+                    "name": "privateport",
+                    "required": true,
+                    "type": "integer"
+                },
+                {
+                    "description": "the ID of the virtual machine for the port forwarding rule",
+                    "length": 255,
+                    "name": "virtualmachineid",
+                    "related": "updateVMAffinityGroup,detachIso,resetSSHKeyForVirtualMachine,resetSSHKeyForVirtualMachine,migrateVirtualMachineWithVolume,attachIso,removeNicFromVirtualMachine,updateVirtualMachine,recoverVirtualMachine,migrateVirtualMachine,resetPasswordForVirtualMachine,revertToVMSnapshot,assignVirtualMachine,updateVMAffinityGroup,listVirtualMachines,rebootVirtualMachine,restoreVirtualMachine,destroyVirtualMachine,stopVirtualMachine,deployVirtualMachine,detachIso,deployVirtualMachine,updateVirtualMachine,revertToVMSnapshot,tmDestroyVirtualMachine,resetPasswordForVirtualMachine,startVirtualMachine,updateDefaultNicForVirtualMachine,startVirtualMachine,attachIso,listVirtualMachines,addNicToVirtualMachine,stopVirtualMachine,destroyVirtualMachine,removeNicFromVirtualMachine,changeServiceForVirtualMachine",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the network of the virtual machine the port forwarding rule will be created for. Required when public IP address is not associated with any guest network yet (VPC case).",
+                    "length": 255,
+                    "name": "networkid",
+                    "related": "createNetwork,updateNetwork,listSrxFirewallNetworks,updateNetwork,listBrocadeVcsDeviceNetworks,listNiciraNvpDeviceNetworks,createNetwork,listNetworks,listNetscalerLoadBalancerNetworks,listF5LoadBalancerNetworks,listPaloAltoFirewallNetworks",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "an optional field, whether to the display the rule to the end user or not",
+                    "length": 255,
+                    "name": "fordisplay",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the ending port of port forwarding rule's private port range",
+                    "length": 255,
+                    "name": "publicendport",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "the cidr list to forward traffic from",
+                    "length": 255,
+                    "name": "cidrlist",
+                    "required": false,
+                    "type": "list"
+                },
+                {
+                    "description": "the starting port of port forwarding rule's public port range",
+                    "length": 255,
+                    "name": "publicport",
+                    "required": true,
+                    "type": "integer"
+                },
+                {
+                    "description": "the ending port of port forwarding rule's private port range",
+                    "length": 255,
+                    "name": "privateendport",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "if true, firewall rule for source/end public port is automatically created; if false - firewall rule has to be created explicitly. If not specified 1) defaulted to false when PF rule is being created for VPC guest network 2) in all other cases defaulted to true",
+                    "length": 255,
+                    "name": "openfirewall",
+                    "required": false,
+                    "type": "boolean"
+                }
+            ],
+            "related": "updatePortForwardingRule,listPortForwardingRules",
+            "response": [
+                {
+                    "description": "the starting port of port forwarding rule's private port range",
+                    "name": "privateport",
+                    "type": "string"
+                },
+                {
+                    "description": "the VM name for the port forwarding rule",
+                    "name": "virtualmachinename",
+                    "type": "string"
+                },
+                {
+                    "description": "the VM display name for the port forwarding rule",
+                    "name": "virtualmachinedisplayname",
+                    "type": "string"
+                },
+                {
+                    "description": "the public ip address for the port forwarding rule",
+                    "name": "ipaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the ending port of port forwarding rule's private port range",
+                    "name": "privateendport",
+                    "type": "string"
+                },
+                {
+                    "description": "the public ip address id for the port forwarding rule",
+                    "name": "ipaddressid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the port forwarding rule",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the starting port of port forwarding rule's public port range",
+                    "name": "publicport",
+                    "type": "string"
+                },
+                {
+                    "description": "the vm ip address for the port forwarding rule",
+                    "name": "vmguestip",
+                    "type": "string"
+                },
+                {
+                    "description": "is firewall for display to the regular user",
+                    "name": "fordisplay",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the list of resource tags associated with the rule",
+                    "name": "tags",
+                    "response": [
+                        {
+                            "description": "tag key name",
+                            "name": "key",
+                            "type": "string"
+                        },
+                        {
+                            "description": "id of the resource",
+                            "name": "resourceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "customer associated with the tag",
+                            "name": "customer",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name where tag belongs to",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag value",
+                            "name": "value",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the domain associated with the tag",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "resource type",
+                            "name": "resourcetype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project id the tag belongs to",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account associated with the tag",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain associated with the tag",
+                            "name": "domain",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "the cidr list to forward traffic from",
+                    "name": "cidrlist",
+                    "type": "string"
+                },
+                {
+                    "description": "the VM ID for the port forwarding rule",
+                    "name": "virtualmachineid",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of the rule",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the id of the guest network the port forwarding rule belongs to",
+                    "name": "networkid",
+                    "type": "string"
+                },
+                {
+                    "description": "the protocol of the port forwarding rule",
+                    "name": "protocol",
+                    "type": "string"
+                },
+                {
+                    "description": "the ending port of port forwarding rule's private port range",
+                    "name": "publicendport",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Dedicates a zones.",
+            "isasync": true,
+            "name": "dedicateZone",
+            "params": [
+                {
+                    "description": "the ID of the containing domain",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "createDomain,listDomains,listDomainChildren,listDomains",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the ID of the zone",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones,listZones,createZone,updateZone",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the name of the account which needs dedication. Must be used with domainId.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the ID of the Zone",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain ID to which the Zone is dedicated",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the Name of the Zone",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the Dedication Affinity Group ID of the zone",
+                    "name": "affinitygroupid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the dedicated resource",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the Account Id to which the Zone is dedicated",
+                    "name": "accountid",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "load template into primary storage",
+            "isasync": false,
+            "name": "prepareTemplate",
+            "params": [
+                {
+                    "description": "template ID of the template to be prepared in primary storage(s).",
+                    "length": 255,
+                    "name": "templateid",
+                    "related": "copyTemplate,registerTemplate,listIsos,copyTemplate,registerTemplate,listTemplates,createTemplate,registerIso,registerIso,prepareTemplate,listIsos,updateTemplate,createTemplate,copyIso",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "zone ID of the template to be prepared in primary storage(s).",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones,listZones,createZone,updateZone",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "storage pool ID of the primary storage pool to which the template should be prepared. If it is not provided the template is prepared on all the available primary storage pools.",
+                    "length": 255,
+                    "name": "storageid",
+                    "related": "createStoragePool,findStoragePoolsForMigration,enableStorageMaintenance,cancelStorageMaintenance",
+                    "required": false,
+                    "type": "uuid"
+                }
+            ],
+            "related": "copyTemplate,registerTemplate,listIsos,copyTemplate,registerTemplate,listTemplates,createTemplate,registerIso,registerIso,listIsos,updateTemplate,createTemplate,copyIso",
+            "response": [
+                {
+                    "description": "the account id to which the template belongs",
+                    "name": "accountid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the OS type for this template.",
+                    "name": "ostypename",
+                    "type": "string"
+                },
+                {
+                    "description": "the hypervisor on which the template runs",
+                    "name": "hypervisor",
+                    "type": "string"
+                },
+                {
+                    "description": "the format of the template.",
+                    "name": "format",
+                    "type": "imageformat"
+                },
+                {
+                    "description": "true if the template is managed across all Zones, false otherwise",
+                    "name": "crossZones",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the size of the template",
+                    "name": "size",
+                    "type": "long"
+                },
+                {
+                    "description": "checksum of the template",
+                    "name": "checksum",
+                    "type": "string"
+                },
+                {
+                    "description": "the date this template was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the template name",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the OS type for this template.",
+                    "name": "ostypeid",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the template",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the secondary storage host for the template",
+                    "name": "hostid",
+                    "type": "string"
+                },
+                {
+                    "description": "the account name to which the template belongs",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "true if template is sshkey enabled, false otherwise",
+                    "name": "sshkeyenabled",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the template ID of the parent template if present",
+                    "name": "sourcetemplateid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the secondary storage host for the template",
+                    "name": "hostname",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the zone for this template",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the type of the template",
+                    "name": "templatetype",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the domain to which the template belongs",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the status of the template",
+                    "name": "status",
+                    "type": "string"
+                },
+                {
+                    "description": "true if this template is a featured template, false otherwise",
+                    "name": "isfeatured",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the project name of the template",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "true if the template is ready to be deployed from, false otherwise.",
+                    "name": "isready",
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if the template is extractable, false otherwise",
+                    "name": "isextractable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the date this template was removed",
+                    "name": "removed",
+                    "type": "date"
+                },
+                {
+                    "description": "true if the ISO is bootable, false otherwise",
+                    "name": "bootable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if the reset password feature is enabled, false otherwise",
+                    "name": "passwordenabled",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the tag of this template",
+                    "name": "templatetag",
+                    "type": "string"
+                },
+                {
+                    "description": "true if this template is a public template, false otherwise",
+                    "name": "ispublic",
+                    "type": "boolean"
+                },
+                {
+                    "description": "additional key/value details tied with template",
+                    "name": "details",
+                    "type": "map"
+                },
+                {
+                    "description": "the name of the zone for this template",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the template display text",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the domain to which the template belongs",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the template ID",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "true if template contains XS/VMWare tools inorder to support dynamic scaling of VM cpu/memory",
+                    "name": "isdynamicallyscalable",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "Assigns virtual machine or a list of virtual machines to a load balancer rule.",
+            "isasync": true,
+            "name": "assignToLoadBalancerRule",
+            "params": [
+                {
+                    "description": "the ID of the load balancer rule",
+                    "length": 255,
+                    "name": "id",
+                    "related": "updatePortForwardingRule,listPortForwardingRules",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "VM ID and IP map, vmidipmap[0].vmid=1 vmidipmap[0].ip=10.1.1.75",
+                    "length": 255,
+                    "name": "vmidipmap",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "map"
+                },
+                {
+                    "description": "the list of IDs of the virtual machine that are being assigned to the load balancer rule(i.e. virtualMachineIds=1,2,3)",
+                    "length": 255,
+                    "name": "virtualmachineids",
+                    "related": "updateVMAffinityGroup,detachIso,resetSSHKeyForVirtualMachine,resetSSHKeyForVirtualMachine,migrateVirtualMachineWithVolume,attachIso,removeNicFromVirtualMachine,updateVirtualMachine,recoverVirtualMachine,migrateVirtualMachine,resetPasswordForVirtualMachine,revertToVMSnapshot,assignVirtualMachine,updateVMAffinityGroup,listVirtualMachines,rebootVirtualMachine,restoreVirtualMachine,destroyVirtualMachine,stopVirtualMachine,deployVirtualMachine,detachIso,deployVirtualMachine,updateVirtualMachine,revertToVMSnapshot,tmDestroyVirtualMachine,resetPasswordForVirtualMachine,startVirtualMachine,updateDefaultNicForVirtualMachine,startVirtualMachine,attachIso,listVirtualMachines,addNicToVirtualMachine,stopVirtualMachine,destroyVirtualMachine,removeNicFromVirtualMachine,changeServiceForVirtualMachine",
+                    "required": false,
+                    "type": "list"
+                }
+            ],
+            "response": [
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                },
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Lookup VM hostname",
+            "isasync": true,
+            "name": "tmProvisionVirtualMachine",
+            "params": [
+                {
+                    "description": "OS family such as ol5,ol6,centos6,centos7",
+                    "length": 255,
+                    "name": "osfamily",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "Instance type such as GP1-1-1",
+                    "length": 255,
+                    "name": "instancetype",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "Ticketmaster inventory product code",
+                    "length": 255,
+                    "name": "productcode",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "FQDN of the virtual machine",
+                    "length": 255,
+                    "name": "hostname",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "Set to reprovision current VM and update DNS record. Has no effect if VM and DNS record do not currently exist.If the VM does not currently exist it will be provisioned and DNS record will be created (or updated).",
+                    "length": 255,
+                    "name": "reprovision",
+                    "required": false,
+                    "type": "boolean"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+
+                },
+                {
+
+                }
+            ]
+        },
+        {
+            "description": "Archive one or more alerts.",
+            "isasync": false,
+            "name": "archiveAlerts",
+            "params": [
+                {
+                    "description": "archive by alert type",
+                    "length": 255,
+                    "name": "type",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "start date range to archive alerts (including) this date (use format \"yyyy-MM-dd\" or the new format \"yyyy-MM-ddThh:mm:ss\")",
+                    "length": 255,
+                    "name": "startdate",
+                    "required": false,
+                    "type": "date"
+                },
+                {
+                    "description": "end date range to archive alerts (including) this date (use format \"yyyy-MM-dd\" or the new format \"yyyy-MM-ddThh:mm:ss\")",
+                    "length": 255,
+                    "name": "enddate",
+                    "required": false,
+                    "type": "date"
+                },
+                {
+                    "description": "the IDs of the alerts",
+                    "length": 255,
+                    "name": "ids",
+                    "related": "listAlerts",
+                    "required": false,
+                    "type": "list"
+                }
+            ],
+            "response": [
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "Lists all pending asynchronous jobs for the account.",
+            "isasync": false,
+            "name": "listAsyncJobs",
+            "params": [
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "If set to false, list only resources belonging to the command's caller; if set to true - list resources that the caller is authorized to see. Default value is false",
+                    "length": 255,
+                    "name": "listall",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "list only resources belonging to the domain specified",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "createDomain,listDomains,listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.",
+                    "length": 255,
+                    "name": "isrecursive",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "list resources by account. Must be used with the domainId parameter.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the start date of the async job",
+                    "length": 255,
+                    "name": "startdate",
+                    "required": false,
+                    "type": "tzdate"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "queryAsyncJobResult",
+            "response": [
+                {
+                    "description": "the account that executed the async command",
+                    "name": "accountid",
+                    "type": "string"
+                },
+                {
+                    "description": "the progress information of the PENDING job",
+                    "name": "jobprocstatus",
+                    "type": "integer"
+                },
+                {
+                    "description": "the unique ID of the instance/entity object related to the job",
+                    "name": "jobinstanceid",
+                    "type": "string"
+                },
+                {
+                    "description": "the current job status-should be 0 for PENDING",
+                    "name": "jobstatus",
+                    "type": "integer"
+                },
+                {
+                    "description": "the instance/entity object related to the job",
+                    "name": "jobinstancetype",
+                    "type": "string"
+                },
+                {
+                    "description": "  the created date of the job",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the async command executed",
+                    "name": "cmd",
+                    "type": "string"
+                },
+                {
+                    "description": "the result type",
+                    "name": "jobresulttype",
+                    "type": "string"
+                },
+                {
+                    "description": "the result code for the job",
+                    "name": "jobresultcode",
+                    "type": "integer"
+                },
+                {
+                    "description": "the result reason",
+                    "name": "jobresult",
+                    "type": "responseobject"
+                },
+                {
+                    "description": "the user that executed the async command",
+                    "name": "userid",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Deletes a Cisco Vnmc controller",
+            "isasync": false,
+            "name": "deleteCiscoVnmcResource",
+            "params": [
+                {
+                    "description": "Cisco Vnmc resource ID",
+                    "length": 255,
+                    "name": "resourceid",
+                    "related": "listCiscoVnmcResources",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "Stops an Internal LB vm.",
+            "isasync": true,
+            "name": "stopInternalLoadBalancerVM",
+            "params": [
+                {
+                    "description": "the ID of the internal lb vm",
+                    "length": 255,
+                    "name": "id",
+                    "related": "stopInternalLoadBalancerVM,listInternalLoadBalancerVMs,changeServiceForRouter,destroyRouter,listRouters",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "Force stop the VM. The caller knows the VM is stopped.",
+                    "length": 255,
+                    "name": "forced",
+                    "required": false,
+                    "type": "boolean"
+                }
+            ],
+            "related": "listInternalLoadBalancerVMs,changeServiceForRouter,destroyRouter,listRouters",
+            "response": [
+                {
+                    "description": "the gateway for the router",
+                    "name": "gateway",
+                    "type": "string"
+                },
+                {
+                    "description": "the guest IP address for the router",
+                    "name": "guestipaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the service offering of the virtual machine",
+                    "name": "serviceofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain associated with the router",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the corresponding guest network",
+                    "name": "guestnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of redundant virtual router",
+                    "name": "redundantstate",
+                    "type": "string"
+                },
+                {
+                    "description": "the date and time the router was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the first IPv6 DNS for the router",
+                    "name": "ip6dns1",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the address",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the hypervisor on which the template runs",
+                    "name": "hypervisor",
+                    "type": "string"
+                },
+                {
+                    "description": "the public netmask for the router",
+                    "name": "publicnetmask",
+                    "type": "string"
+                },
+                {
+                    "description": "the id of the router",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone name for the router",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the first DNS for the router",
+                    "name": "dns1",
+                    "type": "string"
+                },
+                {
+                    "description": "the public MAC address for the router",
+                    "name": "publicmacaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the router",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the guest netmask for the router",
+                    "name": "guestnetmask",
+                    "type": "string"
+                },
+                {
+                    "description": "the second DNS for the router",
+                    "name": "dns2",
+                    "type": "string"
+                },
+                {
+                    "description": "true if the router template requires upgrader",
+                    "name": "requiresupgrade",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the ID of the corresponding public network",
+                    "name": "publicnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "the template ID for the router",
+                    "name": "templateid",
+                    "type": "string"
+                },
+                {
+                    "description": "the version of scripts",
+                    "name": "scriptsversion",
+                    "type": "string"
+                },
+                {
+                    "description": "the account associated with the router",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of nics associated with the router",
+                    "name": "nic",
+                    "response": [
+                        {
+                            "description": "true if nic is default, false otherwise",
+                            "name": "macaddress",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the vm to which the nic belongs",
+                            "name": "virtualmachineid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the NSX Logical Switch Port (if NSX based), null otherwise",
+                            "name": "nsxlogicalswitchport",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the corresponding network",
+                            "name": "networkid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the name of the corresponding network",
+                            "name": "networkname",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the nic",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the NSX Logical Switch (if NSX based), null otherwise",
+                            "name": "nsxlogicalswitch",
+                            "type": "string"
+                        },
+                        {
+                            "description": "device id for the network when plugged into the virtual machine",
+                            "name": "deviceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the gateway of IPv6 network",
+                            "name": "ip6gateway",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the cidr of IPv6 network",
+                            "name": "ip6cidr",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the isolation uri of the nic",
+                            "name": "isolationuri",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the traffic type of the nic",
+                            "name": "traffictype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if nic is default, false otherwise",
+                            "name": "isdefault",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "the type of the nic",
+                            "name": "type",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ip address of the nic",
+                            "name": "ipaddress",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the netmask of the nic",
+                            "name": "netmask",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the gateway of the nic",
+                            "name": "gateway",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the broadcast uri of the nic",
+                            "name": "broadcasturi",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the IPv6 address of network",
+                            "name": "ip6address",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the Secondary ipv4 addr of nic",
+                            "name": "secondaryip",
+                            "type": "list"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "VPC the router belongs to",
+                    "name": "vpcid",
+                    "type": "string"
+                },
+                {
+                    "description": "the Pod ID for the router",
+                    "name": "podid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the corresponding guest network",
+                    "name": "guestnetworkname",
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone ID for the router",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain ID associated with the router",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the service offering of the virtual machine",
+                    "name": "serviceofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "role of the domain router",
+                    "name": "role",
+                    "type": "string"
+                },
+                {
+                    "description": "the link local MAC address for the router",
+                    "name": "linklocalmacaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "if this router is an redundant virtual router",
+                    "name": "isredundantrouter",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the ID of the corresponding link local network",
+                    "name": "linklocalnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "the guest MAC address for the router",
+                    "name": "guestmacaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the host ID for the router",
+                    "name": "hostid",
+                    "type": "string"
+                },
+                {
+                    "description": "the hostname for the router",
+                    "name": "hostname",
+                    "type": "string"
+                },
+                {
+                    "description": "the link local IP address for the router",
+                    "name": "linklocalip",
+                    "type": "string"
+                },
+                {
+                    "description": "the public IP address for the router",
+                    "name": "publicip",
+                    "type": "string"
+                },
+                {
+                    "description": "the second IPv6 DNS for the router",
+                    "name": "ip6dns2",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the ipaddress",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the network domain for the router",
+                    "name": "networkdomain",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of VPC the router belongs to",
+                    "name": "vpcname",
+                    "type": "string"
+                },
+                {
+                    "description": "the link local netmask for the router",
+                    "name": "linklocalnetmask",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of the router",
+                    "name": "state",
+                    "type": "state"
+                },
+                {
+                    "description": "the version of template",
+                    "name": "version",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Adds a Brocade VCS Switch",
+            "isasync": true,
+            "name": "addBrocadeVcsDevice",
+            "params": [
+                {
+                    "description": "Hostname of ip address of the Brocade VCS Switch.",
+                    "length": 255,
+                    "name": "hostname",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "Credentials to access the Brocade VCS Switch API",
+                    "length": 255,
+                    "name": "password",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the Physical Network ID",
+                    "length": 255,
+                    "name": "physicalnetworkid",
+                    "related": "createPhysicalNetwork",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "Credentials to access the Brocade VCS Switch API",
+                    "length": 255,
+                    "name": "username",
+                    "required": true,
+                    "type": "string"
+                }
+            ],
+            "related": "listBrocadeVcsDevices",
+            "response": [
+                {
+                    "description": "name of the provider",
+                    "name": "provider",
+                    "type": "string"
+                },
+                {
+                    "description": "the principal switch Ip address",
+                    "name": "hostname",
+                    "type": "string"
+                },
+                {
+                    "description": "the physical Network to which this Brocade VCS belongs to",
+                    "name": "physicalnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "device id of the Brocade Vcs",
+                    "name": "vcsdeviceid",
+                    "type": "string"
+                },
+                {
+                    "description": "device name",
+                    "name": "brocadedevicename",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Creates a domain",
+            "isasync": false,
+            "name": "createDomain",
+            "params": [
+                {
+                    "description": "creates domain with this name",
+                    "length": 255,
+                    "name": "name",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "Domain UUID, required for adding domain from another Region",
+                    "length": 255,
+                    "name": "domainid",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "assigns new domain a parent domain by domain ID of the parent.  If no parent domain is specied, the ROOT domain is assumed.",
+                    "length": 255,
+                    "name": "parentdomainid",
+                    "related": "createDomain,listDomains,listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "Network domain for networks in the domain",
+                    "length": 255,
+                    "name": "networkdomain",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "listDomains,listDomainChildren,listDomains",
+            "response": [
+                {
+                    "description": "the total number of templates available to be created by this domain",
+                    "name": "templateavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of snapshots which can be stored by this domain",
+                    "name": "snapshotlimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total memory (in MB) owned by domain",
+                    "name": "memorytotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of public ip addresses allocated for this domain",
+                    "name": "iptotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of public ip addresses this domain can acquire",
+                    "name": "iplimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of networks owned by domain",
+                    "name": "networktotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the level of the domain",
+                    "name": "level",
+                    "type": "integer"
+                },
+                {
+                    "description": "the total memory (in MB) the domain can own",
+                    "name": "memorylimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of vpcs the domain can own",
+                    "name": "vpclimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of public ip addresses available for this domain to acquire",
+                    "name": "ipavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of networks the domain can own",
+                    "name": "networklimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total primary storage space (in GiB) the domain can own",
+                    "name": "primarystoragelimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total secondary storage space (in GiB) owned by domain",
+                    "name": "secondarystoragetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the path of the domain",
+                    "name": "path",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of cpu cores available to be created for this domain",
+                    "name": "cpuavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of snapshots stored by this domain",
+                    "name": "snapshottotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of vpcs owned by domain",
+                    "name": "vpctotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total volume being used by this domain",
+                    "name": "volumetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of projects available for administration by this domain",
+                    "name": "projectavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the domain",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of the domain",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of virtual machines that can be deployed by this domain",
+                    "name": "vmlimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total volume which can be used by this domain",
+                    "name": "volumelimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total secondary storage space (in GiB) the domain can own",
+                    "name": "secondarystoragelimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total secondary storage space (in GiB) available to be used for this domain",
+                    "name": "secondarystorageavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total primary storage space (in GiB) available to be used for this domain",
+                    "name": "primarystorageavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain name of the parent domain",
+                    "name": "parentdomainname",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of networks available to be created for this domain",
+                    "name": "networkavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of snapshots available for this domain",
+                    "name": "snapshotavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of templates which have been created by this domain",
+                    "name": "templatetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the domain ID of the parent domain",
+                    "name": "parentdomainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of templates which can be created by this domain",
+                    "name": "templatelimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total memory (in MB) available to be created for this domain",
+                    "name": "memoryavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total primary storage space (in GiB) owned by domain",
+                    "name": "primarystoragetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of virtual machines available for this domain to acquire",
+                    "name": "vmavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total volume available for this domain",
+                    "name": "volumeavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of virtual machines deployed by this domain",
+                    "name": "vmtotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of cpu cores the domain can own",
+                    "name": "cpulimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of cpu cores owned by domain",
+                    "name": "cputotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of vpcs available to be created for this domain",
+                    "name": "vpcavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of projects being administrated by this domain",
+                    "name": "projecttotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the network domain",
+                    "name": "networkdomain",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of projects the domain can own",
+                    "name": "projectlimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the domain",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "whether the domain has one or more sub-domains",
+                    "name": "haschild",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "Deleting resource tag(s)",
+            "isasync": true,
+            "name": "deleteTags",
+            "params": [
+                {
+                    "description": "Delete tags for resource id(s)",
+                    "length": 255,
+                    "name": "resourceids",
+                    "required": true,
+                    "type": "list"
+                },
+                {
+                    "description": "Delete tag by resource type",
+                    "length": 255,
+                    "name": "resourcetype",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "Delete tags matching key/value pairs",
+                    "length": 255,
+                    "name": "tags",
+                    "required": false,
+                    "type": "map"
+                }
+            ],
+            "response": [
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                },
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                }
+            ],
+            "since": "4.0.0"
+        },
+        {
+            "description": "List external firewall appliances.",
+            "isasync": false,
+            "name": "listExternalFirewalls",
+            "params": [
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "zone Id",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones,listZones,createZone,updateZone",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the number of times to retry requests to the external firewall",
+                    "name": "numretries",
+                    "type": "string"
+                },
+                {
+                    "description": "the public interface of the external firewall",
+                    "name": "publicinterface",
+                    "type": "string"
+                },
+                {
+                    "description": "the private interface of the external firewall",
+                    "name": "privateinterface",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the external firewall",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the username that's used to log in to the external firewall",
+                    "name": "username",
+                    "type": "string"
+                },
+                {
+                    "description": "the zone ID of the external firewall",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the private security zone of the external firewall",
+                    "name": "privatezone",
+                    "type": "string"
+                },
+                {
+                    "description": "the usage interface of the external firewall",
+                    "name": "usageinterface",
+                    "type": "string"
+                },
+                {
+                    "description": "the timeout (in seconds) for requests to the external firewall",
+                    "name": "timeout",
+                    "type": "string"
+                },
+                {
+                    "description": "the management IP address of the external firewall",
+                    "name": "ipaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the public security zone of the external firewall",
+                    "name": "publiczone",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Restarts the network; includes 1) restarting network elements - virtual routers, DHCP servers 2) reapplying all public IPs 3) reapplying loadBalancing/portForwarding rules",
+            "isasync": true,
+            "name": "restartNetwork",
+            "params": [
+                {
+                    "description": "The ID of the network to restart.",
+                    "length": 255,
+                    "name": "id",
+                    "related": "createNetwork,updateNetwork,listSrxFirewallNetworks,updateNetwork,listBrocadeVcsDeviceNetworks,listNiciraNvpDeviceNetworks,createNetwork,listNetworks,listNetscalerLoadBalancerNetworks,listF5LoadBalancerNetworks,listPaloAltoFirewallNetworks",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "If cleanup old network elements",
+                    "length": 255,
+                    "name": "cleanup",
+                    "required": false,
+                    "type": "boolean"
+                }
+            ],
+            "related": "associateIpAddress,updateIpAddress,associateIpAddress,listPublicIpAddresses",
+            "response": [
+                {
+                    "description": "the name of the zone the public IP address belongs to",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "virutal machine display name the ip address is assigned to (not null only for static nat Ip)",
+                    "name": "virtualmachinedisplayname",
+                    "type": "string"
+                },
+                {
+                    "description": "true if this ip is for static nat, false otherwise",
+                    "name": "isstaticnat",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the account the public IP address is associated with",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "is public ip for display to the regular user",
+                    "name": "fordisplay",
+                    "type": "boolean"
+                },
+                {
+                    "description": "virutal machine name the ip address is assigned to (not null only for static nat Ip)",
+                    "name": "virtualmachinename",
+                    "type": "string"
+                },
+                {
+                    "description": "is public IP portable across the zones",
+                    "name": "isportable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "public IP address",
+                    "name": "ipaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain the public IP address is associated with",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "virutal machine id the ip address is assigned to (not null only for static nat Ip)",
+                    "name": "virtualmachineid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the Network associated with the IP address",
+                    "name": "associatednetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the address",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the ipaddress",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the Network associated with the IP address",
+                    "name": "associatednetworkname",
+                    "type": "string"
+                },
+                {
+                    "description": "the VLAN associated with the IP address",
+                    "name": "vlanname",
+                    "type": "string"
+                },
+                {
+                    "description": "date the public IP address was acquired",
+                    "name": "allocated",
+                    "type": "date"
+                },
+                {
+                    "description": "public IP address id",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the Network where ip belongs to",
+                    "name": "networkid",
+                    "type": "string"
+                },
+                {
+                    "description": "the physical network this belongs to",
+                    "name": "physicalnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain ID the public IP address is associated with",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the VLAN associated with the IP address. This parameter is visible to ROOT admins only",
+                    "name": "vlanid",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of resource tags associated with ip address",
+                    "name": "tags",
+                    "response": [
+                        {
+                            "description": "customer associated with the tag",
+                            "name": "customer",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag key name",
+                            "name": "key",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag value",
+                            "name": "value",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account associated with the tag",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name where tag belongs to",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the domain associated with the tag",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "resource type",
+                            "name": "resourcetype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project id the tag belongs to",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "id of the resource",
+                            "name": "resourceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain associated with the tag",
+                            "name": "domain",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "State of the ip address. Can be: Allocatin, Allocated and Releasing",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the zone the public IP address belongs to",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "true if this ip is system ip (was allocated as a part of deployVm or createLbRule)",
+                    "name": "issystem",
+                    "type": "boolean"
+                },
+                {
+                    "description": "virutal machine (dnat) ip address (not null only for static nat Ip)",
+                    "name": "vmipaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "true if the IP address is a source nat address, false otherwise",
+                    "name": "issourcenat",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the virtual network for the IP address",
+                    "name": "forvirtualnetwork",
+                    "type": "boolean"
+                },
+                {
+                    "description": "purpose of the IP address. In Acton this value is not null for Ips with isSystem=true, and can have either StaticNat or LB value",
+                    "name": "purpose",
+                    "type": "string"
+                },
+                {
+                    "description": "VPC the ip belongs to",
+                    "name": "vpcid",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Logs a user into the CloudStack. A successful login attempt will generate a JSESSIONID cookie value that can be passed in subsequent Query command calls until the \"logout\" command has been issued or the session has expired.",
+            "isasync": false,
+            "name": "login",
+            "params": [
+                {
+                    "description": "Path of the domain that the user belongs to. Example: domain=/com/cloud/internal. If no domain is passed in, the ROOT (/) domain is assumed.",
+                    "length": 255,
+                    "name": "domain",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "The id of the domain that the user belongs to. If both domain and domainId are passed in, \"domainId\" parameter takes precendence",
+                    "length": 255,
+                    "name": "domainId",
+                    "required": false,
+                    "type": "long"
+                },
+                {
+                    "description": "Username",
+                    "length": 255,
+                    "name": "username",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "Hashed password (Default is MD5). If you wish to use any other hashing algorithm, you would need to write a custom authentication adapter See Docs section.",
+                    "length": 255,
+                    "name": "password",
+                    "required": true,
+                    "type": "string"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "Username",
+                    "name": "username",
+                    "type": "string"
+                },
+                {
+                    "description": "User ID",
+                    "name": "userid",
+                    "type": "string"
+                },
+                {
+                    "description": "Session key that can be passed in subsequent Query command calls",
+                    "name": "sessionkey",
+                    "type": "string"
+                },
+                {
+                    "description": "the account name the user belongs to",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the account type (admin, domain-admin, read-only-admin, user)",
+                    "name": "type",
+                    "type": "string"
+                },
+                {
+                    "description": "first name of the user",
+                    "name": "firstname",
+                    "type": "string"
+                },
+                {
+                    "description": "Domain ID that the user belongs to",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the time period before the session has expired",
+                    "name": "timeout",
+                    "type": "integer"
+                },
+                {
+                    "description": "Is user registered",
+                    "name": "registered",
+                    "type": "string"
+                },
+                {
+                    "description": "last name of the user",
+                    "name": "lastname",
+                    "type": "string"
+                },
+                {
+                    "description": "user time zone",
+                    "name": "timezone",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Lists all hypervisor capabilities.",
+            "isasync": false,
+            "name": "listHypervisorCapabilities",
+            "params": [
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "the hypervisor for which to restrict the search",
+                    "length": 255,
+                    "name": "hypervisor",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "ID of the hypervisor capability",
+                    "length": 255,
+                    "name": "id",
+                    "related": "listHypervisorCapabilities",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the maximum number of Hosts per cluster for this hypervisor",
+                    "name": "maxhostspercluster",
+                    "type": "integer"
+                },
+                {
+                    "description": "the hypervisor version",
+                    "name": "hypervisorversion",
+                    "type": "string"
+                },
+                {
+                    "description": "true if storage motion is supported",
+                    "name": "storagemotionenabled",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the maximum number of guest vms recommended for this hypervisor",
+                    "name": "maxguestslimit",
+                    "type": "long"
+                },
+                {
+                    "description": "true if security group is supported",
+                    "name": "securitygroupenabled",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the maximum number of Data Volumes that can be attached for this hypervisor",
+                    "name": "maxdatavolumeslimit",
+                    "type": "integer"
+                },
+                {
+                    "description": "the ID of the hypervisor capabilities row",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the hypervisor type",
+                    "name": "hypervisor",
+                    "type": "hypervisortype"
+                }
+            ],
+            "since": "3.0.0"
+        },
+        {
+            "description": "Adds backup image store.",
+            "isasync": false,
+            "name": "addImageStore",
+            "params": [
+                {
+                    "description": "the Zone ID for the image store",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones,listZones,createZone,updateZone",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the details for the image store. Example: details[0].key=accesskey&details[0].value=s389ddssaa&details[1].key=secretkey&details[1].value=8dshfsss",
+                    "length": 255,
+                    "name": "details",
+                    "required": false,
+                    "type": "map"
+                },
+                {
+                    "description": "the URL for the image store",
+                    "length": 2048,
+                    "name": "url",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the image store provider name",
+                    "length": 255,
+                    "name": "provider",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the name for the image store",
+                    "length": 255,
+                    "name": "name",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "addSecondaryStorage,addImageStoreS3,updateCloudToUseObjectStore,listSwifts,listImageStores",
+            "response": [
+                {
+                    "description": "the url of the image store",
+                    "name": "url",
+                    "type": "string"
+                },
+                {
+                    "description": "the details of the image store",
+                    "name": "details",
+                    "type": "set"
+                },
+                {
+                    "description": "the scope of the image store",
+                    "name": "scope",
+                    "type": "scopetype"
+                },
+                {
+                    "description": "the Zone name of the image store",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the protocol of the image store",
+                    "name": "protocol",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the image store",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone ID of the image store",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the image store",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the provider name of the image store",
+                    "name": "providername",
+                    "type": "string"
+                }
+            ],
+            "since": "4.2.0"
+        },
+        {
+            "description": "Destroy VM and remove DNS entry",
+            "isasync": true,
+            "name": "tmDestroyVirtualMachine",
+            "params": [
+                {
+                    "description": "FQDN of the virtual machine",
+                    "length": 255,
+                    "name": "hostname",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "Set to true to keep the DNS record",
+                    "length": 255,
+                    "name": "retaindns",
+                    "required": false,
+                    "type": "boolean"
+                }
+            ],
+            "related": "updateVMAffinityGroup,detachIso,resetSSHKeyForVirtualMachine,resetSSHKeyForVirtualMachine,migrateVirtualMachineWithVolume,attachIso,removeNicFromVirtualMachine,updateVirtualMachine,recoverVirtualMachine,migrateVirtualMachine,resetPasswordForVirtualMachine,revertToVMSnapshot,assignVirtualMachine,updateVMAffinityGroup,listVirtualMachines,rebootVirtualMachine,restoreVirtualMachine,destroyVirtualMachine,stopVirtualMachine,deployVirtualMachine,detachIso,deployVirtualMachine,updateVirtualMachine,revertToVMSnapshot,resetPasswordForVirtualMachine,startVirtualMachine,updateDefaultNicForVirtualMachine,startVirtualMachine,attachIso,listVirtualMachines,addNicToVirtualMachine,stopVirtualMachine,destroyVirtualMachine,removeNicFromVirtualMachine,changeServiceForVirtualMachine",
+            "response": [
+                {
+                    "description": "the read (io) of disk on the vm",
+                    "name": "diskioread",
+                    "type": "long"
+                },
+                {
+                    "description": "the user's name who deployed the virtual machine",
+                    "name": "username",
+                    "type": "string"
+                },
+                {
+                    "description": "instance name of the user vm; this parameter is returned to the ROOT admin only",
+                    "name": "instancename",
+                    "type": "string"
+                },
+                {
+                    "description": "list of affinity groups associated with the virtual machine",
+                    "name": "affinitygroup",
+                    "response": [
+                        {
+                            "description": "the type of the affinity group",
+                            "name": "type",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the name of the affinity group",
+                            "name": "name",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain ID of the affinity group",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain name of the affinity group",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "virtual machine IDs associated with this affinity group",
+                            "name": "virtualmachineIds",
+                            "type": "list"
+                        },
+                        {
+                            "description": "the account owning the affinity group",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project ID of the affinity group",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the affinity group",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the description of the affinity group",
+                            "name": "description",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name of the affinity group",
+                            "name": "project",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "the group name of the virtual machine",
+                    "name": "group",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the template for the virtual machine. A -1 is returned if the virtual machine was created from an ISO file.",
+                    "name": "templateid",
+                    "type": "string"
+                },
+                {
+                    "description": " an alternate display text of the template for the virtual machine",
+                    "name": "templatedisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the vm",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "an alternate display text of the ISO attached to the virtual machine",
+                    "name": "isodisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "the target memory in vm",
+                    "name": "memorytargetkbs",
+                    "type": "long"
+                },
+                {
+                    "description": "the amount of the vm's CPU currently used",
+                    "name": "cpuused",
+                    "type": "string"
+                },
+                {
+                    "description": "the incoming network traffic on the vm",
+                    "name": "networkkbsread",
+                    "type": "long"
+                },
+                {
+                    "description": "the vgpu type used by the virtual machine",
+                    "name": "vgpu",
+                    "type": "string"
+                },
+                {
+                    "description": "list of security groups associated with the virtual machine",
+                    "name": "securitygroup",
+                    "response": [
+                        {
+                            "description": "the list of ingress rules associated with the security group",
+                            "name": "ingressrule",
+                            "response": [
+                                {
+                                    "description": "the starting IP of the security group rule",
+                                    "name": "startport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the list of resource tags associated with the rule",
+                                    "name": "tags",
+                                    "response": [
+                                        {
+                                            "description": "the project id the tag belongs to",
+                                            "name": "projectid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the account associated with the tag",
+                                            "name": "account",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "resource type",
+                                            "name": "resourcetype",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the ID of the domain associated with the tag",
+                                            "name": "domainid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project name where tag belongs to",
+                                            "name": "project",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the domain associated with the tag",
+                                            "name": "domain",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag key name",
+                                            "name": "key",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "id of the resource",
+                                            "name": "resourceid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag value",
+                                            "name": "value",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "customer associated with the tag",
+                                            "name": "customer",
+                                            "type": "string"
+                                        }
+                                    ],
+                                    "type": "set"
+                                },
+                                {
+                                    "description": "the CIDR notation for the base IP address of the security group rule",
+                                    "name": "cidr",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the id of the security group rule",
+                                    "name": "ruleid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "security group name",
+                                    "name": "securitygroupname",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the protocol of the security group rule",
+                                    "name": "protocol",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the type of the ICMP message response",
+                                    "name": "icmptype",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the code for the ICMP message response",
+                                    "name": "icmpcode",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the ending IP of the security group rule ",
+                                    "name": "endport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "account owning the security group rule",
+                                    "name": "account",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "set"
+                        },
+                        {
+                            "description": "the number of virtualmachines associated with this securitygroup",
+                            "name": "virtualmachinecount",
+                            "type": "integer"
+                        },
+                        {
+                            "description": "the account owning the security group",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project id of the group",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain name of the security group",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name of the group",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain ID of the security group",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the description of the security group",
+                            "name": "description",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of resource tags associated with the rule",
+                            "name": "tags",
+                            "response": [
+                                {
+                                    "description": "id of the resource",
+                                    "name": "resourceid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "tag value",
+                                    "name": "value",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "resource type",
+                                    "name": "resourcetype",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "tag key name",
+                                    "name": "key",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the project name where tag belongs to",
+                                    "name": "project",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the project id the tag belongs to",
+                                    "name": "projectid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the domain associated with the tag",
+                                    "name": "domain",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the account associated with the tag",
+                                    "name": "account",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "customer associated with the tag",
+                                    "name": "customer",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the ID of the domain associated with the tag",
+                                    "name": "domainid",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "set"
+                        },
+                        {
+                            "description": "the name of the security group",
+                            "name": "name",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of virtualmachine ids associated with this securitygroup",
+                            "name": "virtualmachineids",
+                            "type": "set"
+                        },
+                        {
+                            "description": "the ID of the security group",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of egress rules associated with the security group",
+                            "name": "egressrule",
+                            "response": [
+                                {
+                                    "description": "the id of the security group rule",
+                                    "name": "ruleid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the list of resource tags associated with the rule",
+                                    "name": "tags",
+                                    "response": [
+                                        {
+                                            "description": "tag key name",
+                                            "name": "key",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the account associated with the tag",
+                                            "name": "account",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project id the tag belongs to",
+                                            "name": "projectid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the ID of the domain associated with the tag",
+                                            "name": "domainid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the domain associated with the tag",
+                                            "name": "domain",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "customer associated with the tag",
+                                            "name": "customer",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "id of the resource",
+                                            "name": "resourceid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project name where tag belongs to",
+                                            "name": "project",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "resource type",
+                                            "name": "resourcetype",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag value",
+                                            "name": "value",
+                                            "type": "string"
+                                        }
+                                    ],
+                                    "type": "set"
+                                },
+                                {
+                                    "description": "account owning the security group rule",
+                                    "name": "account",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "security group name",
+                                    "name": "securitygroupname",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the CIDR notation for the base IP address of the security group rule",
+                                    "name": "cidr",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the starting IP of the security group rule",
+                                    "name": "startport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the type of the ICMP message response",
+                                    "name": "icmptype",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the protocol of the security group rule",
+                                    "name": "protocol",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the ending IP of the security group rule ",
+                                    "name": "endport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the code for the ICMP message response",
+                                    "name": "icmpcode",
+                                    "type": "integer"
+                                }
+                            ],
+                            "type": "set"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "true if vm contains XS/VMWare tools inorder to support dynamic scaling of VM cpu/memory.",
+                    "name": "isdynamicallyscalable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the ID of the service offering of the virtual machine",
+                    "name": "serviceofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "the read (bytes) of disk on the vm",
+                    "name": "diskkbsread",
+                    "type": "long"
+                },
+                {
+                    "description": "the group ID of the virtual machine",
+                    "name": "groupid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the virtual machine",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "Vm details in key/value pairs.",
+                    "name": "details",
+                    "type": "map"
+                },
+                {
+                    "description": "the date when this virtual machine was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the ID of the disk offering of the virtual machine",
+                    "name": "diskofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "the number of cpu this virtual machine is running with",
+                    "name": "cpunumber",
+                    "type": "integer"
+                },
+                {
+                    "description": "the ID of the ISO attached to the virtual machine",
+                    "name": "isoid",
+                    "type": "string"
+                },
+                {
+                    "description": "device type of the root volume",
+                    "name": "rootdevicetype",
+                    "type": "string"
+                },
+                {
+                    "description": "the internal memory thats free in vm",
+                    "name": "memoryintfreekbs",
+                    "type": "long"
+                },
+                {
+                    "description": "true if the password rest feature is enabled, false otherwise",
+                    "name": "passwordenabled",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the ID of the host for the virtual machine",
+                    "name": "hostid",
+                    "type": "string"
+                },
+                {
+                    "description": "Os type ID of the virtual machine",
+                    "name": "guestosid",
+                    "type": "string"
+                },
+                {
+                    "description": "the virtual network for the service offering",
+                    "name": "forvirtualnetwork",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the name of the template for the virtual machine",
+                    "name": "templatename",
+                    "type": "string"
+                },
+                {
+                    "description": "device ID of the root volume",
+                    "name": "rootdeviceid",
+                    "type": "long"
+                },
+                {
+                    "description": "the list of nics associated with vm",
+                    "name": "nic",
+                    "response": [
+                        {
+                            "description": "the gateway of IPv6 network",
+                            "name": "ip6gateway",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the broadcast uri of the nic",
+                            "name": "broadcasturi",
+                            "type": "string"
+                        },
+                        {
+                            "description": "device id for the network when plugged into the virtual machine",
+                            "name": "deviceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the NSX Logical Switch (if NSX based), null otherwise",
+                            "name": "nsxlogicalswitch",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the gateway of the nic",
+                            "name": "gateway",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the traffic type of the nic",
+                            "name": "traffictype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ip address of the nic",
+                            "name": "ipaddress",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the vm to which the nic belongs",
+                            "name": "virtualmachineid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the nic",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the cidr of IPv6 network",
+                            "name": "ip6cidr",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the corresponding network",
+                            "name": "networkid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the Secondary ipv4 addr of nic",
+                            "name": "secondaryip",
+                            "type": "list"
+                        },
+                        {
+                            "description": "true if nic is default, false otherwise",
+                            "name": "macaddress",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the netmask of the nic",
+                            "name": "netmask",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the isolation uri of the nic",
+                            "name": "isolationuri",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the type of the nic",
+                            "name": "type",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the NSX Logical Switch Port (if NSX based), null otherwise",
+                            "name": "nsxlogicalswitchport",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the name of the corresponding network",
+                            "name": "networkname",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if nic is default, false otherwise",
+                            "name": "isdefault",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "the IPv6 address of network",
+                            "name": "ip6address",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "the name of the disk offering of the virtual machine",
+                    "name": "diskofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "the user's ID who deployed the virtual machine",
+                    "name": "userid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the domain in which the virtual machine exists",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the availablility zone for the virtual machine",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of the virtual machine",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "State of the Service from LB rule",
+                    "name": "servicestate",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the availability zone for the virtual machine",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the service offering of the virtual machine",
+                    "name": "serviceofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the host for the virtual machine",
+                    "name": "hostname",
+                    "type": "string"
+                },
+                {
+                    "description": "the write (bytes) of disk on the vm",
+                    "name": "diskkbswrite",
+                    "type": "long"
+                },
+                {
+                    "description": "the account associated with the virtual machine",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the speed of each cpu",
+                    "name": "cpuspeed",
+                    "type": "integer"
+                },
+                {
+                    "description": "the write (io) of disk on the vm",
+                    "name": "diskiowrite",
+                    "type": "long"
+                },
+                {
+                    "description": "the ID of the virtual machine",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the domain in which the virtual machine exists",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "true if high-availability is enabled, false otherwise",
+                    "name": "haenable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the memory used by the vm",
+                    "name": "memorykbs",
+                    "type": "long"
+                },
+                {
+
+                },
+                {
+                    "description": "public IP address id associated with vm via Static nat rule",
+                    "name": "publicip",
+                    "type": "string"
+                },
+                {
+                    "description": "the hypervisor on which the template runs",
+                    "name": "hypervisor",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the ISO attached to the virtual machine",
+                    "name": "isoname",
+                    "type": "string"
+                },
+                {
+                    "description": "public IP address id associated with vm via Static nat rule",
+                    "name": "publicipid",
+                    "type": "string"
+                },
+                {
+                    "description": "the password (if exists) of the virtual machine",
+                    "name": "password",
+                    "type": "string"
+                },
+                {
+                    "description": "an optional field whether to the display the vm to the end user or not.",
+                    "name": "displayvm",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the project id of the vm",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the outgoing network traffic on the host",
+                    "name": "networkkbswrite",
+                    "type": "long"
+                },
+                {
+                    "description": "ssh key-pair",
+                    "name": "keypair",
+                    "type": "string"
+                },
+                {
+                    "description": "the memory allocated for the virtual machine",
+                    "name": "memory",
+                    "type": "integer"
+                },
+                {
+                    "description": "OS type id of the vm",
+                    "name": "ostypeid",
+                    "type": "long"
+                },
+                {
+                    "description": "user generated name. The name of the virtual machine is returned if no displayname exists.",
+                    "name": "displayname",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Get SolidFire Account ID",
+            "isasync": false,
+            "name": "getSolidFireAccountId",
+            "params": [
+                {
+                    "description": "Storage Pool UUID",
+                    "length": 255,
+                    "name": "storageid",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "CloudStack Account UUID",
+                    "length": 255,
+                    "name": "accountid",
+                    "required": true,
+                    "type": "string"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "SolidFire Account ID",
+                    "name": "solidFireAccountId",
+                    "type": "long"
+                }
+            ]
+        },
+        {
+            "description": "Lists all network services provided by CloudStack or for the given Provider.",
+            "isasync": false,
+            "name": "listSupportedNetworkServices",
+            "params": [
+                {
+                    "description": "network service name to list providers and capabilities of",
+                    "length": 255,
+                    "name": "service",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "network service provider name",
+                    "length": 255,
+                    "name": "provider",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the service provider name",
+                    "name": "provider",
+                    "response": [
+                        {
+                            "description": "the physical network this belongs to",
+                            "name": "physicalnetworkid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the provider name",
+                            "name": "name",
+                            "type": "string"
+                        },
+                        {
+                            "description": "state of the network provider",
+                            "name": "state",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the destination physical network",
+                            "name": "destinationphysicalnetworkid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "uuid of the network provider",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if individual services can be enabled/disabled",
+                            "name": "canenableindividualservice",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "services for this provider",
+                            "name": "servicelist",
+                            "type": "list"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "the list of capabilities",
+                    "name": "capability",
+                    "response": [
+                        {
+                            "description": "the capability value",
+                            "name": "value",
+                            "type": "string"
+                        },
+                        {
+                            "description": "can this service capability value can be choosable while creatine network offerings",
+                            "name": "canchooseservicecapability",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "the capability name",
+                            "name": "name",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "the service name",
+                    "name": "name",
+                    "type": "string"
+                }
+            ],
+            "since": "3.0.0"
+        },
+        {
+            "description": "Lists role permissions",
+            "isasync": false,
+            "name": "listRolePermissions",
+            "params": [
+                {
+                    "description": "ID of the role",
+                    "length": 255,
+                    "name": "roleid",
+                    "related": "listRoles,createRole",
+                    "required": false,
+                    "type": "uuid"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the ID of the role to which the role permission belongs",
+                    "name": "roleid",
+                    "type": "string"
+                },
+                {
+                    "description": "the api name or wildcard rule",
+                    "name": "rule",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the role to which the role permission belongs",
+                    "name": "rolename",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the role permission",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the permission type of the api name or wildcard rule, allow/deny",
+                    "name": "permission",
+                    "type": "string"
+                },
+                {
+                    "description": "the description of the role permission",
+                    "name": "description",
+                    "type": "string"
+                }
+            ],
+            "since": "4.9.0"
+        },
+        {
+            "description": "Deletes a particular ingress rule from this security group",
+            "isasync": true,
+            "name": "revokeSecurityGroupIngress",
+            "params": [
+                {
+                    "description": "The ID of the ingress rule",
+                    "length": 255,
+                    "name": "id",
+                    "related": "authorizeSecurityGroupIngress",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                },
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Lists dedicated guest vlan ranges",
+            "isasync": false,
+            "name": "listDedicatedGuestVlanRanges",
+            "params": [
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "list dedicated guest vlan ranges by id",
+                    "length": 255,
+                    "name": "id",
+                    "related": "listDedicatedGuestVlanRanges",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "physical network id of the guest VLAN range",
+                    "length": 255,
+                    "name": "physicalnetworkid",
+                    "related": "createPhysicalNetwork",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "the account with which the guest VLAN range is associated. Must be used with the domainId parameter.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the domain ID with which the guest VLAN range is associated.  If used with the account parameter, returns all guest VLAN ranges for that account in the specified domain.",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "listDomains,listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "zone of the guest VLAN range",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones,listZones,createZone,updateZone",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the dedicated guest vlan range",
+                    "length": 255,
+                    "name": "guestvlanrange",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "project who will own the guest VLAN range",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "listProjectAccounts,suspendProject,activateProject,updateProject,listProjects",
+                    "required": false,
+                    "type": "uuid"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the guest VLAN range",
+                    "name": "guestvlanrange",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the guest vlan range",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the guest VLAN range",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain name of the guest VLAN range",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain ID of the guest VLAN range",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the zone of the guest vlan range",
+                    "name": "zoneid",
+                    "type": "long"
+                },
+                {
+                    "description": "the account of the guest VLAN range",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the guest vlan range",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the physical network of the guest vlan range",
+                    "name": "physicalnetworkid",
+                    "type": "long"
+                }
+            ]
+        },
+        {
+            "description": "Lists all network ACL items",
+            "isasync": false,
+            "name": "listNetworkACLs",
+            "params": [
+                {
+                    "description": "list resources by display flag; only ROOT admin is eligible to pass this parameter",
+                    "length": 255,
+                    "name": "fordisplay",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "boolean"
+                },
+                {
+                    "description": "list network ACL items by ACL ID",
+                    "length": 255,
+                    "name": "aclid",
+                    "related": "createNetworkACLList,listNetworkACLLists",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list resources by account. Must be used with the domainId parameter.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "list network ACL items by protocol",
+                    "length": 255,
+                    "name": "protocol",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "list only resources belonging to the domain specified",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "listDomains,listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.",
+                    "length": 255,
+                    "name": "isrecursive",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "list network ACL items by network ID",
+                    "length": 255,
+                    "name": "networkid",
+                    "related": "createNetwork,updateNetwork,listSrxFirewallNetworks,updateNetwork,listBrocadeVcsDeviceNetworks,listNiciraNvpDeviceNetworks,createNetwork,listNetworks,listNetscalerLoadBalancerNetworks,listF5LoadBalancerNetworks,listPaloAltoFirewallNetworks",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list network ACL items by traffic type - ingress or egress",
+                    "length": 255,
+                    "name": "traffictype",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "list objects by project",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "listProjectAccounts,suspendProject,activateProject,updateProject,listProjects",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list network ACL items by action",
+                    "length": 255,
+                    "name": "action",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "List resources by tags (key/value pairs)",
+                    "length": 255,
+                    "name": "tags",
+                    "required": false,
+                    "type": "map"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "If set to false, list only resources belonging to the command's caller; if set to true - list resources that the caller is authorized to see. Default value is false",
+                    "length": 255,
+                    "name": "listall",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "Lists network ACL Item with the specified ID",
+                    "length": 255,
+                    "name": "id",
+                    "related": "createNetworkACL,listNetworkACLs,updateNetworkACLItem",
+                    "required": false,
+                    "type": "uuid"
+                }
+            ],
+            "related": "createNetworkACL,updateNetworkACLItem",
+            "response": [
+                {
+                    "description": "Number of the ACL Item",
+                    "name": "number",
+                    "type": "integer"
+                },
+                {
+                    "description": "is rule for display to the regular user",
+                    "name": "fordisplay",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the traffic type for the ACL",
+                    "name": "traffictype",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of resource tags associated with the network ACLs",
+                    "name": "tags",
+                    "response": [
+                        {
+                            "description": "the project id the tag belongs to",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag value",
+                            "name": "value",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain associated with the tag",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name where tag belongs to",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag key name",
+                            "name": "key",
+                            "type": "string"
+                        },
+                        {
+                            "description": "resource type",
+                            "name": "resourcetype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "id of the resource",
+                            "name": "resourceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the domain associated with the tag",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account associated with the tag",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "customer associated with the tag",
+                            "name": "customer",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "the ID of the ACL this item belongs to",
+                    "name": "aclid",
+                    "type": "string"
+                },
+                {
+                    "description": "Action of ACL Item. Allow/Deny",
+                    "name": "action",
+                    "type": "string"
+                },
+                {
+                    "description": "the protocol of the ACL",
+                    "name": "protocol",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of the rule",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the cidr list to forward traffic from",
+                    "name": "cidrlist",
+                    "type": "string"
+                },
+                {
+                    "description": "type of the icmp message being sent",
+                    "name": "icmptype",
+                    "type": "integer"
+                },
+                {
+                    "description": "the ID of the ACL Item",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "error code for this icmp message",
+                    "name": "icmpcode",
+                    "type": "integer"
+                },
+                {
+                    "description": "the starting port of ACL's port range",
+                    "name": "startport",
+                    "type": "string"
+                },
+                {
+                    "description": "the ending port of ACL's port range",
+                    "name": "endport",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Adds a network serviceProvider to a physical network",
+            "isasync": true,
+            "name": "addNetworkServiceProvider",
+            "params": [
+                {
+                    "description": "the Physical Network ID to add the provider to",
+                    "length": 255,
+                    "name": "physicalnetworkid",
+                    "related": "createPhysicalNetwork",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the list of services to be enabled for this physical network service provider",
+                    "length": 255,
+                    "name": "servicelist",
+                    "required": false,
+                    "type": "list"
+                },
+                {
+                    "description": "the name for the physical network service provider",
+                    "length": 255,
+                    "name": "name",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the destination Physical Network ID to bridge to",
+                    "length": 255,
+                    "name": "destinationphysicalnetworkid",
+                    "related": "createPhysicalNetwork",
+                    "required": false,
+                    "type": "uuid"
+                }
+            ],
+            "related": "listNetworkServiceProviders,listTrafficTypes",
+            "response": [
+                {
+                    "description": "the provider name",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "state of the network provider",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the physical network this belongs to",
+                    "name": "physicalnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "true if individual services can be enabled/disabled",
+                    "name": "canenableindividualservice",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the destination physical network",
+                    "name": "destinationphysicalnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "uuid of the network provider",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "services for this provider",
+                    "name": "servicelist",
+                    "type": "list"
+                }
+            ],
+            "since": "3.0.0"
+        },
+        {
+            "description": "Delete site to site vpn gateway",
+            "isasync": true,
+            "name": "deleteVpnGateway",
+            "params": [
+                {
+                    "description": "id of customer gateway",
+                    "length": 255,
+                    "name": "id",
+                    "related": "listVpnGateways,updateVpnGateway,createVpnGateway",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "Copies a template from one zone to another.",
+            "isasync": true,
+            "name": "copyTemplate",
+            "params": [
+                {
+                    "description": "ID of the zone the template is currently hosted on. If not specified and template is cross-zone, then we will sync this template to region wide image store.",
+                    "length": 255,
+                    "name": "sourcezoneid",
+                    "related": "listZones,listZones,createZone,updateZone",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "Template ID.",
+                    "length": 255,
+                    "name": "id",
+                    "related": "copyTemplate,registerTemplate,listIsos,copyTemplate,registerTemplate,listTemplates,createTemplate,registerIso,registerIso,listIsos,updateTemplate,createTemplate,copyIso",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "ID of the zone the template is being copied to.",
+                    "length": 255,
+                    "name": "destzoneid",
+                    "related": "listZones,listZones,createZone,updateZone",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "registerTemplate,listIsos,copyTemplate,registerTemplate,listTemplates,createTemplate,registerIso,registerIso,listIsos,updateTemplate,createTemplate,copyIso",
+            "response": [
+                {
+                    "description": "true if the template is extractable, false otherwise",
+                    "name": "isextractable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the template display text",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "the hypervisor on which the template runs",
+                    "name": "hypervisor",
+                    "type": "string"
+                },
+                {
+                    "description": "the date this template was removed",
+                    "name": "removed",
+                    "type": "date"
+                },
+                {
+                    "description": "the type of the template",
+                    "name": "templatetype",
+                    "type": "string"
+                },
+                {
+                    "description": "the format of the template.",
+                    "name": "format",
+                    "type": "imageformat"
+                },
+                {
+                    "description": "the account id to which the template belongs",
+                    "name": "accountid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the OS type for this template.",
+                    "name": "ostypeid",
+                    "type": "string"
+                },
+                {
+                    "description": "the template ID",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "true if template contains XS/VMWare tools inorder to support dynamic scaling of VM cpu/memory",
+                    "name": "isdynamicallyscalable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the ID of the zone for this template",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the size of the template",
+                    "name": "size",
+                    "type": "long"
+                },
+                {
+                    "description": "checksum of the template",
+                    "name": "checksum",
+                    "type": "string"
+                },
+                {
+                    "description": "the date this template was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the account name to which the template belongs",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the secondary storage host for the template",
+                    "name": "hostname",
+                    "type": "string"
+                },
+                {
+                    "description": "additional key/value details tied with template",
+                    "name": "details",
+                    "type": "map"
+                },
+                {
+                    "description": "the tag of this template",
+                    "name": "templatetag",
+                    "type": "string"
+                },
+                {
+                    "description": "true if the ISO is bootable, false otherwise",
+                    "name": "bootable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the ID of the secondary storage host for the template",
+                    "name": "hostid",
+                    "type": "string"
+                },
+                {
+                    "description": "true if template is sshkey enabled, false otherwise",
+                    "name": "sshkeyenabled",
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if this template is a featured template, false otherwise",
+                    "name": "isfeatured",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the status of the template",
+                    "name": "status",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the domain to which the template belongs",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the OS type for this template.",
+                    "name": "ostypename",
+                    "type": "string"
+                },
+                {
+                    "description": "true if the template is ready to be deployed from, false otherwise.",
+                    "name": "isready",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the name of the zone for this template",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the template ID of the parent template if present",
+                    "name": "sourcetemplateid",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the template",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "true if the template is managed across all Zones, false otherwise",
+                    "name": "crossZones",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the template name",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "true if the reset password feature is enabled, false otherwise",
+                    "name": "passwordenabled",
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if this template is a public template, false otherwise",
+                    "name": "ispublic",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the name of the domain to which the template belongs",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the template",
+                    "name": "projectid",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Creates a service offering.",
+            "isasync": false,
+            "name": "createServiceOffering",
+            "params": [
+                {
+                    "description": "details for planner, used to store specific parameters",
+                    "length": 255,
+                    "name": "serviceofferingdetails",
+                    "required": false,
+                    "type": "map"
+                },
+                {
+                    "description": "whether compute offering iops is custom or not",
+                    "length": 255,
+                    "name": "customizediops",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the total memory of the service offering in MB",
+                    "length": 255,
+                    "name": "memory",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "the HA for the service offering",
+                    "length": 255,
+                    "name": "offerha",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "data transfer rate in megabits per second allowed. Supported only for non-System offering and system offerings having \"domainrouter\" systemvmtype",
+                    "length": 255,
+                    "name": "networkrate",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "the CPU number of the service offering",
+                    "length": 255,
+                    "name": "cpunumber",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "provisioning type used to create volumes. Valid values are thin, sparse, fat.",
+                    "length": 255,
+                    "name": "provisioningtype",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the containing domain, null for public offerings",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "listDomains,listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "bytes write rate of the disk offering",
+                    "length": 255,
+                    "name": "byteswriterate",
+                    "required": false,
+                    "type": "long"
+                },
+                {
+                    "description": "is this a system vm offering",
+                    "length": 255,
+                    "name": "issystem",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "the storage type of the service offering. Values are local and shared.",
+                    "length": 255,
+                    "name": "storagetype",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "bytes read rate of the disk offering",
+                    "length": 255,
+                    "name": "bytesreadrate",
+                    "required": false,
+                    "type": "long"
+                },
+                {
+                    "description": "true if the virtual machine needs to be volatile so that on every reboot of VM, original root disk is dettached then destroyed and a fresh root disk is created and attached to VM",
+                    "length": 255,
+                    "name": "isvolatile",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "max iops of the compute offering",
+                    "length": 255,
+                    "name": "maxiops",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "long"
+                },
+                {
+                    "description": "min iops of the compute offering",
+                    "length": 255,
+                    "name": "miniops",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "long"
+                },
+                {
+                    "description": "the host tag for this service offering.",
+                    "length": 255,
+                    "name": "hosttags",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "The deployment planner heuristics used to deploy a VM of this offering. If null, value of global config vm.deployment.planner is used",
+                    "length": 255,
+                    "name": "deploymentplanner",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the tags for this service offering.",
+                    "length": 255,
+                    "name": "tags",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the CPU speed of the service offering in MHz.",
+                    "length": 255,
+                    "name": "cpuspeed",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "the display text of the service offering",
+                    "length": 255,
+                    "name": "displaytext",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the system VM type. Possible types are \"domainrouter\", \"consoleproxy\" and \"secondarystoragevm\".",
+                    "length": 255,
+                    "name": "systemvmtype",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "io requests write rate of the disk offering",
+                    "length": 255,
+                    "name": "iopswriterate",
+                    "required": false,
+                    "type": "long"
+                },
+                {
+                    "description": "the name of the service offering",
+                    "length": 255,
+                    "name": "name",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "io requests read rate of the disk offering",
+                    "length": 255,
+                    "name": "iopsreadrate",
+                    "required": false,
+                    "type": "long"
+                },
+                {
+                    "description": "restrict the CPU usage to committed service offering",
+                    "length": 255,
+                    "name": "limitcpuuse",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "Hypervisor snapshot reserve space as a percent of a volume (for managed storage using Xen or VMware)",
+                    "length": 255,
+                    "name": "hypervisorsnapshotreserve",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "integer"
+                }
+            ],
+            "related": "updateServiceOffering,listServiceOfferings",
+            "response": [
+                {
+                    "description": "the host tag for the service offering",
+                    "name": "hosttags",
+                    "type": "string"
+                },
+                {
+                    "description": "the max iops of the disk offering",
+                    "name": "maxiops",
+                    "type": "long"
+                },
+                {
+                    "description": "Hypervisor snapshot reserve space as a percent of a volume (for managed storage using Xen or VMware)",
+                    "name": "hypervisorsnapshotreserve",
+                    "type": "integer"
+                },
+                {
+                    "description": "io requests read rate of the service offering",
+                    "name": "diskIopsReadRate",
+                    "type": "long"
+                },
+                {
+                    "description": "the tags for the service offering",
+                    "name": "tags",
+                    "type": "string"
+                },
+                {
+                    "description": "the number of CPU",
+                    "name": "cpunumber",
+                    "type": "integer"
+                },
+                {
+                    "description": "an alternate display text of the service offering.",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "the storage type for this service offering",
+                    "name": "storagetype",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the service offering",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the memory in MB",
+                    "name": "memory",
+                    "type": "integer"
+                },
+                {
+                    "description": "the domain id of the service offering",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "provisioning type used to create volumes. Valid values are thin, sparse, fat.",
+                    "name": "provisioningtype",
+                    "type": "string"
+                },
+                {
+                    "description": "Domain name for the offering",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "is this a  default system vm offering",
+                    "name": "defaultuse",
+                    "type": "boolean"
+                },
+                {
+                    "description": "deployment strategy used to deploy VM.",
+                    "name": "deploymentplanner",
+                    "type": "string"
+                },
+                {
+                    "description": "is this a the systemvm type for system vm offering",
+                    "name": "systemvmtype",
+                    "type": "string"
+                },
+                {
+                    "description": "the min iops of the disk offering",
+                    "name": "miniops",
+                    "type": "long"
+                },
+                {
+                    "description": "is true if the offering is customized",
+                    "name": "iscustomized",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the id of the service offering",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "true if the vm needs to be volatile, i.e., on every reboot of vm from API root disk is discarded and creates a new root disk",
+                    "name": "isvolatile",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the clock rate CPU speed in Mhz",
+                    "name": "cpuspeed",
+                    "type": "integer"
+                },
+                {
+                    "description": "restrict the CPU usage to committed service offering",
+                    "name": "limitcpuuse",
+                    "type": "boolean"
+                },
+                {
+                    "description": "data transfer rate in megabits per second allowed.",
+                    "name": "networkrate",
+                    "type": "integer"
+                },
+                {
+                    "description": "is this a system vm offering",
+                    "name": "issystem",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the ha support in the service offering",
+                    "name": "offerha",
+                    "type": "boolean"
+                },
+                {
+                    "description": "bytes write rate of the service offering",
+                    "name": "diskBytesWriteRate",
+                    "type": "long"
+                },
+                {
+                    "description": "additional key/value details tied with this service offering",
+                    "name": "serviceofferingdetails",
+                    "type": "map"
+                },
+                {
+                    "description": "the date this service offering was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "io requests write rate of the service offering",
+                    "name": "diskIopsWriteRate",
+                    "type": "long"
+                },
+                {
+                    "description": "true if disk offering uses custom iops, false otherwise",
+                    "name": "iscustomizediops",
+                    "type": "boolean"
+                },
+                {
+                    "description": "bytes read rate of the service offering",
+                    "name": "diskBytesReadRate",
+                    "type": "long"
+                }
+            ]
+        },
+        {
+            "description": "lists network that are using a nicira nvp device",
+            "isasync": false,
+            "name": "listNiciraNvpDeviceNetworks",
+            "params": [
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "nicira nvp device ID",
+                    "length": 255,
+                    "name": "nvpdeviceid",
+                    "related": "listNiciraNvpDevices,addNiciraNvpDevice",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                }
+            ],
+            "related": "createNetwork,updateNetwork,listSrxFirewallNetworks,updateNetwork,listBrocadeVcsDeviceNetworks,createNetwork,listNetworks,listNetscalerLoadBalancerNetworks,listF5LoadBalancerNetworks,listPaloAltoFirewallNetworks",
+            "response": [
+                {
+                    "description": "related to what other network configuration",
+                    "name": "related",
+                    "type": "string"
+                },
+                {
+                    "description": "an optional field, whether to the display the network to the end user or not.",
+                    "name": "displaynetwork",
+                    "type": "boolean"
+                },
+                {
+                    "description": "broadcast uri of the network. This parameter is visible to ROOT admins only",
+                    "name": "broadcasturi",
+                    "type": "string"
+                },
+                {
+                    "description": "availability of the network offering the network is created from",
+                    "name": "networkofferingavailability",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain name of the network owner",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the gateway of IPv6 network",
+                    "name": "ip6gateway",
+                    "type": "string"
+                },
+                {
+                    "description": "the network's gateway",
+                    "name": "gateway",
+                    "type": "string"
+                },
+                {
+                    "description": "display text of the network offering the network is created from",
+                    "name": "networkofferingdisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "If a network is enabled for 'streched l2 subnet' then represents zones on which network currently spans",
+                    "name": "zonesnetworkspans",
+                    "type": "set"
+                },
+                {
+                    "description": "the domain id of the network owner",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the cidr of IPv6 network",
+                    "name": "ip6cidr",
+                    "type": "string"
+                },
+                {
+                    "description": "true if network offering is ip conserve mode enabled",
+                    "name": "networkofferingconservemode",
+                    "type": "boolean"
+                },
+                {
+                    "description": "VPC the network belongs to",
+                    "name": "vpcid",
+                    "type": "string"
+                },
+                {
+                    "description": "the first DNS for the network",
+                    "name": "dns1",
+                    "type": "string"
+                },
+                {
+                    "description": "true if network supports specifying ip ranges, false otherwise",
+                    "name": "specifyipranges",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the type of the network",
+                    "name": "type",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of resource tags associated with network",
+                    "name": "tags",
+                    "response": [
+                        {
+                            "description": "tag value",
+                            "name": "value",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag key name",
+                            "name": "key",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the domain associated with the tag",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "customer associated with the tag",
+                            "name": "customer",
+                            "type": "string"
+                        },
+                        {
+                            "description": "id of the resource",
+                            "name": "resourceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain associated with the tag",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name where tag belongs to",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account associated with the tag",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "resource type",
+                            "name": "resourcetype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project id the tag belongs to",
+                            "name": "projectid",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "true if network is default, false otherwise",
+                    "name": "isdefault",
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if network can span multiple zones",
+                    "name": "strechedl2subnet",
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if users from subdomains can access the domain level network",
+                    "name": "subdomainaccess",
+                    "type": "boolean"
+                },
+                {
+                    "description": "acl type - access type to the network",
+                    "name": "acltype",
+                    "type": "string"
+                },
+                {
+                    "description": "the network CIDR of the guest network configured with IP reservation. It is the summation of CIDR and RESERVED_IP_RANGE",
+                    "name": "networkcidr",
+                    "type": "string"
+                },
+                {
+                    "description": "list networks available for vm deployment",
+                    "name": "canusefordeploy",
+                    "type": "boolean"
+                },
+                {
+                    "description": "Cloudstack managed address space, all CloudStack managed VMs get IP address from CIDR",
+                    "name": "cidr",
+                    "type": "string"
+                },
+                {
+                    "description": "ACL Id associated with the VPC network",
+                    "name": "aclid",
+                    "type": "string"
+                },
+                {
+                    "description": "the owner of the network",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the network's IP range not to be used by CloudStack guest VMs and can be used for non CloudStack purposes",
+                    "name": "reservediprange",
+                    "type": "string"
+                },
+                {
+                    "description": "network offering id the network is created from",
+                    "name": "networkofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "true if network is system, false otherwise",
+                    "name": "issystem",
+                    "type": "boolean"
+                },
+                {
+                    "description": "state of the network",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the address",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the second DNS for the network",
+                    "name": "dns2",
+                    "type": "string"
+                },
+                {
+                    "description": "Broadcast domain type of the network",
+                    "name": "broadcastdomaintype",
+                    "type": "string"
+                },
+                {
+                    "description": "the physical network id",
+                    "name": "physicalnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "the network domain",
+                    "name": "networkdomain",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the zone the network belongs to",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "name of the network offering the network is created from",
+                    "name": "networkofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "true network requires restart",
+                    "name": "restartrequired",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the id of the network",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of services",
+                    "name": "service",
+                    "response": [
+                        {
+                            "description": "the service name",
+                            "name": "name",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the service provider name",
+                            "name": "provider",
+                            "response": [
+                                {
+                                    "description": "the provider name",
+                                    "name": "name",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the destination physical network",
+                                    "name": "destinationphysicalnetworkid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the physical network this belongs to",
+                                    "name": "physicalnetworkid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "uuid of the network provider",
+                                    "name": "id",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "state of the network provider",
+                                    "name": "state",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "services for this provider",
+                                    "name": "servicelist",
+                                    "type": "list"
+                                },
+                                {
+                                    "description": "true if individual services can be enabled/disabled",
+                                    "name": "canenableindividualservice",
+                                    "type": "boolean"
+                                }
+                            ],
+                            "type": "list"
+                        },
+                        {
+                            "description": "the list of capabilities",
+                            "name": "capability",
+                            "response": [
+                                {
+                                    "description": "the capability name",
+                                    "name": "name",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "can this service capability value can be choosable while creatine network offerings",
+                                    "name": "canchooseservicecapability",
+                                    "type": "boolean"
+                                },
+                                {
+                                    "description": "the capability value",
+                                    "name": "value",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "list"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "the network's netmask",
+                    "name": "netmask",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the ipaddress",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the traffic type of the network",
+                    "name": "traffictype",
+                    "type": "string"
+                },
+                {
+                    "description": "list networks that are persistent",
+                    "name": "ispersistent",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the displaytext of the network",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "The vlan of the network. This parameter is visible to ROOT admins only",
+                    "name": "vlan",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the network",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "zone id of the network",
+                    "name": "zoneid",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Change ownership of a VM from one account to another. This API is available for Basic zones with security groups and Advanced zones with guest networks. A root administrator can reassign a VM from any account to any other account in any domain. A domain administrator can reassign a VM to any account in the same domain.",
+            "isasync": false,
+            "name": "assignVirtualMachine",
+            "params": [
+                {
+                    "description": "list of new network ids in which the moved VM will participate. In case no network ids are provided the VM will be part of the default network for that zone. In case there is no network yet created for the new account the default network will be created.",
+                    "length": 255,
+                    "name": "networkids",
+                    "related": "createNetwork,updateNetwork,listSrxFirewallNetworks,updateNetwork,listBrocadeVcsDeviceNetworks,createNetwork,listNetworks,listNetscalerLoadBalancerNetworks,listF5LoadBalancerNetworks,listPaloAltoFirewallNetworks",
+                    "required": false,
+                    "type": "list"
+                },
+                {
+                    "description": "domain id of the new VM owner.",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "listDomains,listDomainChildren,listDomains",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "account name of the new VM owner.",
+                    "length": 255,
+                    "name": "account",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "list of security group ids to be applied on the virtual machine. In case no security groups are provided the VM is part of the default security group.",
+                    "length": 255,
+                    "name": "securitygroupids",
+                    "related": "createSecurityGroup",
+                    "required": false,
+                    "type": "list"
+                },
+                {
+                    "description": "id of the VM to be moved",
+                    "length": 255,
+                    "name": "virtualmachineid",
+                    "related": "updateVMAffinityGroup,detachIso,resetSSHKeyForVirtualMachine,resetSSHKeyForVirtualMachine,migrateVirtualMachineWithVolume,attachIso,removeNicFromVirtualMachine,updateVirtualMachine,recoverVirtualMachine,migrateVirtualMachine,resetPasswordForVirtualMachine,revertToVMSnapshot,assignVirtualMachine,updateVMAffinityGroup,listVirtualMachines,rebootVirtualMachine,restoreVirtualMachine,destroyVirtualMachine,stopVirtualMachine,deployVirtualMachine,detachIso,deployVirtualMachine,updateVirtualMachine,revertToVMSnapshot,resetPasswordForVirtualMachine,startVirtualMachine,updateDefaultNicForVirtualMachine,startVirtualMachine,attachIso,listVirtualMachines,addNicToVirtualMachine,stopVirtualMachine,destroyVirtualMachine,removeNicFromVirtualMachine,changeServiceForVirtualMachine",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "updateVMAffinityGroup,detachIso,resetSSHKeyForVirtualMachine,resetSSHKeyForVirtualMachine,migrateVirtualMachineWithVolume,attachIso,removeNicFromVirtualMachine,updateVirtualMachine,recoverVirtualMachine,migrateVirtualMachine,resetPasswordForVirtualMachine,revertToVMSnapshot,updateVMAffinityGroup,listVirtualMachines,rebootVirtualMachine,restoreVirtualMachine,destroyVirtualMachine,stopVirtualMachine,deployVirtualMachine,detachIso,deployVirtualMachine,updateVirtualMachine,revertToVMSnapshot,resetPasswordForVirtualMachine,startVirtualMachine,updateDefaultNicForVirtualMachine,startVirtualMachine,attachIso,listVirtualMachines,addNicToVirtualMachine,stopVirtualMachine,destroyVirtualMachine,removeNicFromVirtualMachine,changeServiceForVirtualMachine",
+            "response": [
+                {
+                    "description": "Os type ID of the virtual machine",
+                    "name": "guestosid",
+                    "type": "string"
+                },
+                {
+                    "description": "OS type id of the vm",
+                    "name": "ostypeid",
+                    "type": "long"
+                },
+                {
+                    "description": "the target memory in vm",
+                    "name": "memorytargetkbs",
+                    "type": "long"
+                },
+                {
+                    "description": "public IP address id associated with vm via Static nat rule",
+                    "name": "publicipid",
+                    "type": "string"
+                },
+                {
+                    "description": "ssh key-pair",
+                    "name": "keypair",
+                    "type": "string"
+                },
+                {
+                    "description": "true if high-availability is enabled, false otherwise",
+                    "name": "haenable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the outgoing network traffic on the host",
+                    "name": "networkkbswrite",
+                    "type": "long"
+                },
+                {
+                    "description": "the ID of the virtual machine",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the user's name who deployed the virtual machine",
+                    "name": "username",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of nics associated with vm",
+                    "name": "nic",
+                    "response": [
+                        {
+                            "description": "Id of the NSX Logical Switch (if NSX based), null otherwise",
+                            "name": "nsxlogicalswitch",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the netmask of the nic",
+                            "name": "netmask",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the Secondary ipv4 addr of nic",
+                            "name": "secondaryip",
+                            "type": "list"
+                        },
+                        {
+                            "description": "Id of the NSX Logical Switch Port (if NSX based), null otherwise",
+                            "name": "nsxlogicalswitchport",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the vm to which the nic belongs",
+                            "name": "virtualmachineid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the type of the nic",
+                            "name": "type",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the gateway of IPv6 network",
+                            "name": "ip6gateway",
+                            "type": "string"
+                        },
+                        {
+                            "description": "device id for the network when plugged into the virtual machine",
+                            "name": "deviceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the nic",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ip address of the nic",
+                            "name": "ipaddress",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if nic is default, false otherwise",
+                            "name": "macaddress",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the IPv6 address of network",
+                            "name": "ip6address",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the corresponding network",
+                            "name": "networkid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the isolation uri of the nic",
+                            "name": "isolationuri",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the gateway of the nic",
+                            "name": "gateway",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the broadcast uri of the nic",
+                            "name": "broadcasturi",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if nic is default, false otherwise",
+                            "name": "isdefault",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "the cidr of IPv6 network",
+                            "name": "ip6cidr",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the name of the corresponding network",
+                            "name": "networkname",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the traffic type of the nic",
+                            "name": "traffictype",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": " an alternate display text of the template for the virtual machine",
+                    "name": "templatedisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the disk offering of the virtual machine",
+                    "name": "diskofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "public IP address id associated with vm via Static nat rule",
+                    "name": "publicip",
+                    "type": "string"
+                },
+                {
+                    "description": "an alternate display text of the ISO attached to the virtual machine",
+                    "name": "isodisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the ISO attached to the virtual machine",
+                    "name": "isoname",
+                    "type": "string"
+                },
+                {
+                    "description": "the number of cpu this virtual machine is running with",
+                    "name": "cpunumber",
+                    "type": "integer"
+                },
+                {
+                    "description": "the ID of the template for the virtual machine. A -1 is returned if the virtual machine was created from an ISO file.",
+                    "name": "templateid",
+                    "type": "string"
+                },
+                {
+                    "description": "user generated name. The name of the virtual machine is returned if no displayname exists.",
+                    "name": "displayname",
+                    "type": "string"
+                },
+                {
+                    "description": "an optional field whether to the display the vm to the end user or not.",
+                    "name": "displayvm",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the group ID of the virtual machine",
+                    "name": "groupid",
+                    "type": "string"
+                },
+                {
+                    "description": "the user's ID who deployed the virtual machine",
+                    "name": "userid",
+                    "type": "string"
+                },
+                {
+                    "description": "the date when this virtual machine was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the state of the virtual machine",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the service offering of the virtual machine",
+                    "name": "serviceofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "the read (bytes) of disk on the vm",
+                    "name": "diskkbsread",
+                    "type": "long"
+                },
+                {
+                    "description": "the write (io) of disk on the vm",
+                    "name": "diskiowrite",
+                    "type": "long"
+                },
+                {
+                    "description": "instance name of the user vm; this parameter is returned to the ROOT admin only",
+                    "name": "instancename",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the domain in which the virtual machine exists",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "list of security groups associated with the virtual machine",
+                    "name": "securitygroup",
+                    "response": [
+                        {
+                            "description": "the name of the security group",
+                            "name": "name",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of virtualmachine ids associated with this securitygroup",
+                            "name": "virtualmachineids",
+                            "type": "set"
+                        },
+                        {
+                            "description": "the domain name of the security group",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name of the group",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of resource tags associated with the rule",
+                            "name": "tags",
+                            "response": [
+                                {
+                                    "description": "the project id the tag belongs to",
+                                    "name": "projectid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the account associated with the tag",
+                                    "name": "account",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "id of the resource",
+                                    "name": "resourceid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the domain associated with the tag",
+                                    "name": "domain",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "resource type",
+                                    "name": "resourcetype",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the project name where tag belongs to",
+                                    "name": "project",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "tag key name",
+                                    "name": "key",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "customer associated with the tag",
+                                    "name": "customer",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the ID of the domain associated with the tag",
+                                    "name": "domainid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "tag value",
+                                    "name": "value",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "set"
+                        },
+                        {
+                            "description": "the list of egress rules associated with the security group",
+                            "name": "egressrule",
+                            "response": [
+                                {
+                                    "description": "the code for the ICMP message response",
+                                    "name": "icmpcode",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "security group name",
+                                    "name": "securitygroupname",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the type of the ICMP message response",
+                                    "name": "icmptype",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the starting IP of the security group rule",
+                                    "name": "startport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the CIDR notation for the base IP address of the security group rule",
+                                    "name": "cidr",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the id of the security group rule",
+                                    "name": "ruleid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "account owning the security group rule",
+                                    "name": "account",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the ending IP of the security group rule ",
+                                    "name": "endport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the list of resource tags associated with the rule",
+                                    "name": "tags",
+                                    "response": [
+                                        {
+                                            "description": "tag key name",
+                                            "name": "key",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag value",
+                                            "name": "value",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "resource type",
+                                            "name": "resourcetype",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "customer associated with the tag",
+                                            "name": "customer",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the account associated with the tag",
+                                            "name": "account",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project id the tag belongs to",
+                                            "name": "projectid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the ID of the domain associated with the tag",
+                                            "name": "domainid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the domain associated with the tag",
+                                            "name": "domain",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "id of the resource",
+                                            "name": "resourceid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project name where tag belongs to",
+                                            "name": "project",
+                                            "type": "string"
+                                        }
+                                    ],
+                                    "type": "set"
+                                },
+                                {
+                                    "description": "the protocol of the security group rule",
+                                    "name": "protocol",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "set"
+                        },
+                        {
+                            "description": "the ID of the security group",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account owning the security group",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the number of virtualmachines associated with this securitygroup",
+                            "name": "virtualmachinecount",
+                            "type": "integer"
+                        },
+                        {
+                            "description": "the description of the security group",
+                            "name": "description",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project id of the group",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of ingress rules associated with the security group",
+                            "name": "ingressrule",
+                            "response": [
+                                {
+                                    "description": "the type of the ICMP message response",
+                                    "name": "icmptype",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "security group name",
+                                    "name": "securitygroupname",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the ending IP of the security group rule ",
+                                    "name": "endport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "account owning the security group rule",
+                                    "name": "account",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the list of resource tags associated with the rule",
+                                    "name": "tags",
+                                    "response": [
+                                        {
+                                            "description": "the project id the tag belongs to",
+                                            "name": "projectid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the domain associated with the tag",
+                                            "name": "domain",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag value",
+                                            "name": "value",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the ID of the domain associated with the tag",
+                                            "name": "domainid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project name where tag belongs to",
+                                            "name": "project",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag key name",
+                                            "name": "key",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "resource type",
+                                            "name": "resourcetype",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the account associated with the tag",
+                                            "name": "account",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "id of the resource",
+                                            "name": "resourceid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "customer associated with the tag",
+                                            "name": "customer",
+                                            "type": "string"
+                                        }
+                                    ],
+                                    "type": "set"
+                                },
+                                {
+                                    "description": "the id of the security group rule",
+                                    "name": "ruleid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the code for the ICMP message response",
+                                    "name": "icmpcode",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the CIDR notation for the base IP address of the security group rule",
+                                    "name": "cidr",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the starting IP of the security group rule",
+                                    "name": "startport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the protocol of the security group rule",
+                                    "name": "protocol",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "set"
+                        },
+                        {
+                            "description": "the domain ID of the security group",
+                            "name": "domainid",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "the project name of the vm",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "list of affinity groups associated with the virtual machine",
+                    "name": "affinitygroup",
+                    "response": [
+                        {
+                            "description": "the project ID of the affinity group",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the affinity group",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account owning the affinity group",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain name of the affinity group",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name of the affinity group",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the type of the affinity group",
+                            "name": "type",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain ID of the affinity group",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the description of the affinity group",
+                            "name": "description",
+                            "type": "string"
+                        },
+                        {
+                            "description": "virtual machine IDs associated with this affinity group",
+                            "name": "virtualmachineIds",
+                            "type": "list"
+                        },
+                        {
+                            "description": "the name of the affinity group",
+                            "name": "name",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "the name of the availability zone for the virtual machine",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the domain in which the virtual machine exists",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the write (bytes) of disk on the vm",
+                    "name": "diskkbswrite",
+                    "type": "long"
+                },
+                {
+                    "description": "the memory used by the vm",
+                    "name": "memorykbs",
+                    "type": "long"
+                },
+                {
+
+                },
+                {
+                    "description": "the speed of each cpu",
+                    "name": "cpuspeed",
+                    "type": "integer"
+                },
+                {
+                    "description": "the incoming network traffic on the vm",
+                    "name": "networkkbsread",
+                    "type": "long"
+                },
+                {
+                    "description": "the amount of the vm's CPU currently used",
+                    "name": "cpuused",
+                    "type": "string"
+                },
+                {
+                    "description": "the password (if exists) of the virtual machine",
+                    "name": "password",
+                    "type": "string"
+                },
+                {
+                    "description": "the vgpu type used by the virtual machine",
+                    "name": "vgpu",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the ISO attached to the virtual machine",
+                    "name": "isoid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the virtual machine",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the read (io) of disk on the vm",
+                    "name": "diskioread",
+                    "type": "long"
+                },
+                {
+                    "description": "true if the password rest feature is enabled, false otherwise",
+                    "name": "passwordenabled",
+                    "type": "boolean"
+                },
+                {
+                    "description": "device type of the root volume",
+                    "name": "rootdevicetype",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the host for the virtual machine",
+                    "name": "hostname",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the template for the virtual machine",
+                    "name": "templatename",
+                    "type": "string"
+                },
+                {
+                    "description": "true if vm contains XS/VMWare tools inorder to support dynamic scaling of VM cpu/memory.",
+                    "name": "isdynamicallyscalable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the ID of the host for the virtual machine",
+                    "name": "hostid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the disk offering of the virtual machine",
+                    "name": "diskofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "the hypervisor on which the template runs",
+                    "name": "hypervisor",
+                    "type": "string"
+                },
+                {
+                    "description": "State of the Service from LB rule",
+                    "name": "servicestate",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the availablility zone for the virtual machine",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the internal memory thats free in vm",
+                    "name": "memoryintfreekbs",
+                    "type": "long"
+                },
+                {
+                    "description": "the group name of the virtual machine",
+                    "name": "group",
+                    "type": "string"
+                },
+                {
+                    "description": "the memory allocated for the virtual machine",
+                    "name": "memory",
+                    "type": "integer"
+                },
+                {
+                    "description": "device ID of the root volume",
+                    "name": "rootdeviceid",
+                    "type": "long"
+                },
+                {
+                    "description": "the account associated with the virtual machine",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "Vm details in key/value pairs.",
+                    "name": "details",
+                    "type": "map"
+                },
+                {
+                    "description": "the project id of the vm",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the virtual network for the service offering",
+                    "name": "forvirtualnetwork",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the ID of the service offering of the virtual machine",
+                    "name": "serviceofferingid",
+                    "type": "string"
+                }
+            ],
+            "since": "3.0.0"
+        },
+        {
+            "description": " delete a BigSwitch BCF Controller device",
+            "isasync": true,
+            "name": "deleteBigSwitchBcfDevice",
+            "params": [
+                {
+                    "description": "BigSwitch device ID",
+                    "length": 255,
+                    "name": "bcfdeviceid",
+                    "related": "listBigSwitchBcfDevices",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                },
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                }
+            ],
+            "since": "4.6.0"
+        },
+        {
+            "description": "configures a netscaler load balancer device",
+            "isasync": true,
+            "name": "configureNetscalerLoadBalancer",
+            "params": [
+                {
+                    "description": "true if this netscaler device to dedicated for a account, false if the netscaler device will be shared by multiple accounts",
+                    "length": 255,
+                    "name": "lbdevicededicated",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "Netscaler load balancer device ID",
+                    "length": 255,
+                    "name": "lbdeviceid",
+                    "related": "addNetscalerLoadBalancer,listNetscalerLoadBalancers,configureNetscalerLoadBalancer",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "capacity of the device, Capacity will be interpreted as number of networks device can handle",
+                    "length": 255,
+                    "name": "lbdevicecapacity",
+                    "required": false,
+                    "type": "long"
+                },
+                {
+                    "description": "true if netscaler load balancer is intended to be used in in-line with firewall, false if netscaler load balancer will side-by-side with firewall",
+                    "length": 255,
+                    "name": "inline",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "Used when NetScaler device is provider of EIP service. This parameter represents the list of pod's, for which there exists a policy based route on datacenter L3 router to route pod's subnet IP to a NetScaler device.",
+                    "length": 255,
+                    "name": "podids",
+                    "related": "updatePod",
+                    "required": false,
+                    "type": "list"
+                }
+            ],
+            "related": "addNetscalerLoadBalancer,listNetscalerLoadBalancers",
+            "response": [
+                {
+                    "description": "device state",
+                    "name": "lbdevicestate",
+                    "type": "string"
+                },
+                {
+                    "description": "the physical network to which this netscaler device belongs to",
+                    "name": "physicalnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "private IP of the NetScaler representing GSLB site",
+                    "name": "gslbproviderprivateip",
+                    "type": "string"
+                },
+                {
+                    "description": "Used when NetScaler device is provider of EIP service. This parameter represents the list of pod's, for which there exists a policy based route on datacenter L3 router to route pod's subnet IP to a NetScaler device.",
+                    "name": "podids",
+                    "type": "list"
+                },
+                {
+                    "description": "true if device is dedicated for an account",
+                    "name": "lbdevicededicated",
+                    "type": "boolean"
+                },
+                {
+                    "description": "public IP of the NetScaler representing GSLB site",
+                    "name": "gslbproviderpublicip",
+                    "type": "string"
+                },
+                {
+                    "description": "name of the provider",
+                    "name": "provider",
+                    "type": "string"
+                },
+                {
+                    "description": "true if NetScaler device is provisioned to be a GSLB service provider",
+                    "name": "gslbprovider",
+                    "type": "boolean"
+                },
+                {
+                    "description": "device capacity",
+                    "name": "lbdevicecapacity",
+                    "type": "long"
+                },
+                {
+                    "description": "the management IP address of the external load balancer",
+                    "name": "ipaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "device id of the netscaler load balancer",
+                    "name": "lbdeviceid",
+                    "type": "string"
+                },
+                {
+                    "description": "device name",
+                    "name": "lbdevicename",
+                    "type": "string"
+                },
+                {
+                    "description": "true if NetScaler device is provisioned exclusively to be a GSLB service provider",
+                    "name": "isexclusivegslbprovider",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the private interface of the load balancer",
+                    "name": "privateinterface",
+                    "type": "string"
+                },
+                {
+                    "description": "the public interface of the load balancer",
+                    "name": "publicinterface",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Lists all available ovs elements.",
+            "isasync": false,
+            "name": "listOvsElements",
+            "params": [
+                {
+                    "description": "list ovs elements by id",
+                    "length": 255,
+                    "name": "id",
+                    "related": "listOvsElements,configureOvsElement",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "list network offerings by enabled state",
+                    "length": 255,
+                    "name": "enabled",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "list ovs elements by network service provider id",
+                    "length": 255,
+                    "name": "nspid",
+                    "related": "listNetworkServiceProviders,listTrafficTypes",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                }
+            ],
+            "related": "configureOvsElement",
+            "response": [
+                {
+                    "description": "the project id of the ipaddress",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain ID associated with the provider",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "Enabled/Disabled the service provider",
+                    "name": "enabled",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the id of the ovs",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the physical network service provider id of the provider",
+                    "name": "nspid",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain associated with the provider",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the account associated with the provider",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the address",
+                    "name": "project",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "associate a profile to a blade",
+            "isasync": true,
+            "name": "associateUcsProfileToBlade",
+            "params": [
+                {
+                    "description": "profile dn",
+                    "length": 255,
+                    "name": "profiledn",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "blade id",
+                    "length": 255,
+                    "name": "bladeid",
+                    "related": "associateUcsProfileToBlade",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "ucs manager id",
+                    "length": 255,
+                    "name": "ucsmanagerid",
+                    "related": "addUcsManager,listUcsManagers",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "cloudstack host id this blade associates to",
+                    "name": "hostid",
+                    "type": "string"
+                },
+                {
+                    "description": "ucs blade id",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "ucs blade dn",
+                    "name": "bladedn",
+                    "type": "string"
+                },
+                {
+                    "description": "associated ucs profile dn",
+                    "name": "profiledn",
+                    "type": "string"
+                },
+                {
+                    "description": "ucs manager id",
+                    "name": "ucsmanagerid",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Deletes affinity group",
+            "isasync": true,
+            "name": "deleteAffinityGroup",
+            "params": [
+                {
+                    "description": "the domain ID of account owning the affinity group",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "listDomains,listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the account of the affinity group. Must be specified with domain ID",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "The ID of the affinity group. Mutually exclusive with name parameter",
+                    "length": 255,
+                    "name": "id",
+                    "related": "",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "The name of the affinity group. Mutually exclusive with ID parameter",
+                    "length": 255,
+                    "name": "name",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the project of the affinity group",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "listProjectAccounts,suspendProject,activateProject,updateProject,listProjects",
+                    "required": false,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                },
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Resizes a volume",
+            "isasync": true,
+            "name": "resizeVolume",
+            "params": [
+                {
+                    "description": "the ID of the disk volume",
+                    "length": 255,
+                    "name": "id",
+                    "related": "listVolumes,updateVolume,attachVolume,resizeVolume,updateVolume,migrateVolume,createVolume,listVolumes,uploadVolume,attachVolume,detachVolume,resizeVolume,migrateVolume,createVolume",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "New minimum number of IOPS",
+                    "length": 255,
+                    "name": "miniops",
+                    "required": false,
+                    "type": "long"
+                },
+                {
+                    "description": "New volume size in GB",
+                    "length": 255,
+                    "name": "size",
+                    "required": false,
+                    "type": "long"
+                },
+                {
+                    "description": "new disk offering id",
+                    "length": 255,
+                    "name": "diskofferingid",
+                    "related": "createDiskOffering,listDiskOfferings",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "New maximum number of IOPS",
+                    "length": 255,
+                    "name": "maxiops",
+                    "required": false,
+                    "type": "long"
+                },
+                {
+                    "description": "Verify OK to Shrink",
+                    "length": 255,
+                    "name": "shrinkok",
+                    "required": false,
+                    "type": "boolean"
+                }
+            ],
+            "related": "listVolumes,updateVolume,attachVolume,updateVolume,migrateVolume,createVolume,listVolumes,uploadVolume,attachVolume,detachVolume,resizeVolume,migrateVolume,createVolume",
+            "response": [
+                {
+                    "description": "the project id of the vpn",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the device on user vm the volume is attahed to. This tag is not returned when the volume is detached.",
+                    "name": "deviceid",
+                    "type": "long"
+                },
+                {
+                    "description": "size of the disk volume",
+                    "name": "size",
+                    "type": "long"
+                },
+                {
+                    "description": "io requests read rate of the disk volume",
+                    "name": "diskIopsReadRate",
+                    "type": "long"
+                },
+                {
+                    "description": "ID of the disk volume",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "ID of the availability zone",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": " an alternate display text of the template for the virtual machine",
+                    "name": "templatedisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "ID of the snapshot from which this volume was created",
+                    "name": "snapshotid",
+                    "type": "string"
+                },
+                {
+                    "description": "max iops of the disk volume",
+                    "name": "maxiops",
+                    "type": "long"
+                },
+                {
+                    "description": "name of the primary storage hosting the disk volume",
+                    "name": "storage",
+                    "type": "string"
+                },
+                {
+                    "description": "display name of the virtual machine",
+                    "name": "vmdisplayname",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the vpn",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "name of the virtual machine",
+                    "name": "vmname",
+                    "type": "string"
+                },
+                {
+                    "description": "bytes read rate of the disk volume",
+                    "name": "diskBytesReadRate",
+                    "type": "long"
+                },
+                {
+                    "description": "an alternate display text of the ISO attached to the virtual machine",
+                    "name": "isodisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the domain associated with the disk volume",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "an optional field whether to the display the volume to the end user or not.",
+                    "name": "displayvolume",
+                    "type": "boolean"
+                },
+                {
+                    "description": "ID of the disk offering",
+                    "name": "diskofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "id of the primary storage hosting the disk volume; returned to admin user only",
+                    "name": "storageid",
+                    "type": "string"
+                },
+                {
+                    "description": "true if the volume is extractable, false otherwise",
+                    "name": "isextractable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the domain associated with the disk volume",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "state of the virtual machine",
+                    "name": "vmstate",
+                    "type": "string"
+                },
+                {
+                    "description": "shared or local storage",
+                    "name": "storagetype",
+                    "type": "string"
+                },
+                {
+                    "description": "the account associated with the disk volume",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the display text of the disk offering",
+                    "name": "diskofferingdisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "the date the disk volume was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "bytes write rate of the disk volume",
+                    "name": "diskBytesWriteRate",
+                    "type": "long"
+                },
+                {
+                    "description": "the name of the ISO attached to the virtual machine",
+                    "name": "isoname",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the template for the virtual machine",
+                    "name": "templatename",
+                    "type": "string"
+                },
+                {
+                    "description": "the path of the volume",
+                    "name": "path",
+                    "type": "string"
+                },
+                {
+                    "description": "Hypervisor the volume belongs to",
+                    "name": "hypervisor",
+                    "type": "string"
+                },
+                {
+                    "description": "min iops of the disk volume",
+                    "name": "miniops",
+                    "type": "long"
+                },
+                {
+                    "description": "name of the disk volume",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the status of the volume",
+                    "name": "status",
+                    "type": "string"
+                },
+                {
+                    "description": "the chain info of the volume",
+                    "name": "chaininfo",
+                    "type": "string"
+                },
+                {
+                    "description": "io requests write rate of the disk volume",
+                    "name": "diskIopsWriteRate",
+                    "type": "long"
+                },
+                {
+                    "description": "provisioning type used to create volumes.",
+                    "name": "provisioningtype",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the template for the virtual machine. A -1 is returned if the virtual machine was created from an ISO file.",
+                    "name": "templateid",
+                    "type": "string"
+                },
+                {
+                    "description": "name of the service offering for root disk",
+                    "name": "serviceofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of the disk volume",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "id of the virtual machine",
+                    "name": "virtualmachineid",
+                    "type": "string"
+                },
+                {
+                    "description": "name of the availability zone",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "name of the disk offering",
+                    "name": "diskofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "the date the volume was attached to a VM instance",
+                    "name": "attached",
+                    "type": "date"
+                },
+                {
+                    "description": "type of the disk volume (ROOT or DATADISK)",
+                    "name": "type",
+                    "type": "string"
+                },
+                {
+                    "description": "the display text of the service offering for root disk",
+                    "name": "serviceofferingdisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "need quiesce vm or not when taking snapshot",
+                    "name": "quiescevm",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the boolean state of whether the volume is destroyed or not",
+                    "name": "destroyed",
+                    "type": "boolean"
+                },
+                {
+                    "description": "ID of the service offering for root disk",
+                    "name": "serviceofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the ISO attached to the virtual machine",
+                    "name": "isoid",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Deletes a Network Service Provider.",
+            "isasync": true,
+            "name": "deleteNetworkServiceProvider",
+            "params": [
+                {
+                    "description": "the ID of the network service provider",
+                    "length": 255,
+                    "name": "id",
+                    "related": "listNetworkServiceProviders,listTrafficTypes",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                }
+            ],
+            "since": "3.0.0"
+        },
+        {
+            "description": "Deletes a network offering.",
+            "isasync": false,
+            "name": "deleteNetworkOffering",
+            "params": [
+                {
+                    "description": "the ID of the network offering",
+                    "length": 255,
+                    "name": "id",
+                    "related": "listNetworkOfferings",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                },
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                }
+            ],
+            "since": "3.0.0"
+        },
+        {
+            "description": "Dedicates a Pod.",
+            "isasync": true,
+            "name": "dedicatePod",
+            "params": [
+                {
+                    "description": "the ID of the Pod",
+                    "length": 255,
+                    "name": "podid",
+                    "related": "updatePod",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the ID of the containing domain",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "listDomains,listDomainChildren,listDomains",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the name of the account which needs dedication. Must be used with domainId.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "listDedicatedPods",
+            "response": [
+                {
+                    "description": "the domain ID to which the Pod is dedicated",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the dedicated resource",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the Name of the Pod",
+                    "name": "podname",
+                    "type": "string"
+                },
+                {
+                    "description": "the Account Id to which the Pod is dedicated",
+                    "name": "accountid",
+                    "type": "string"
+                },
+                {
+                    "description": "the Dedication Affinity Group ID of the pod",
+                    "name": "affinitygroupid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the Pod",
+                    "name": "podid",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "List network devices",
+            "isasync": false,
+            "name": "listNetworkDevice",
+            "params": [
+                {
+                    "description": "parameters for network device",
+                    "length": 255,
+                    "name": "networkdeviceparameterlist",
+                    "required": false,
+                    "type": "map"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "Network device type, now supports ExternalDhcp, PxeServer, NetscalerMPXLoadBalancer, NetscalerVPXLoadBalancer, NetscalerSDXLoadBalancer, F5BigIpLoadBalancer, JuniperSRXFirewall, PaloAltoFirewall",
+                    "length": 255,
+                    "name": "networkdevicetype",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                }
+            ],
+            "related": "addNetworkDevice",
+            "response": [
+                {
+                    "description": "the ID of the network device",
+                    "name": "id",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Update a Storage network IP range, only allowed when no IPs in this range have been allocated.",
+            "isasync": true,
+            "name": "updateStorageNetworkIpRange",
+            "params": [
+                {
+                    "description": "UUID of storage network ip range",
+                    "length": 255,
+                    "name": "id",
+                    "related": "createStorageNetworkIpRange,listStorageNetworkIpRange,updateStorageNetworkIpRange",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "Optional. the vlan the ip range sits on",
+                    "length": 255,
+                    "name": "vlan",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "the beginning IP address",
+                    "length": 255,
+                    "name": "startip",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the netmask for storage network",
+                    "length": 255,
+                    "name": "netmask",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the ending IP address",
+                    "length": 255,
+                    "name": "endip",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "createStorageNetworkIpRange,listStorageNetworkIpRange",
+            "response": [
+                {
+                    "description": "the start ip of the storage network IP range",
+                    "name": "startip",
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone uuid of the storage network IP range",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the uuid of storage network IP range.",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the end ip of the storage network IP range",
+                    "name": "endip",
+                    "type": "string"
+                },
+                {
+                    "description": "the gateway of the storage network IP range",
+                    "name": "gateway",
+                    "type": "string"
+                },
+                {
+                    "description": "the netmask of the storage network IP range",
+                    "name": "netmask",
+                    "type": "string"
+                },
+                {
+                    "description": "the Pod uuid for the storage network IP range",
+                    "name": "podid",
+                    "type": "string"
+                },
+                {
+                    "description": "the network uuid of storage network IP range",
+                    "name": "networkid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID or VID of the VLAN.",
+                    "name": "vlan",
+                    "type": "integer"
+                }
+            ],
+            "since": "3.0.0"
+        },
+        {
+            "description": "Removes an OpenDyalight controler",
+            "isasync": true,
+            "name": "deleteOpenDaylightController",
+            "params": [
+                {
+                    "description": "OpenDaylight Controller ID",
+                    "length": 255,
+                    "name": "id",
+                    "related": "addOpenDaylightController,deleteOpenDaylightController",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "addOpenDaylightController",
+            "response": [
+                {
+                    "description": "the name assigned to the controller",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the url of the controller api",
+                    "name": "url",
+                    "type": "string"
+                },
+                {
+                    "description": "the physical network to which this controller belongs to",
+                    "name": "physicalnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "device id of the controller",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the username to authenticate to the controller",
+                    "name": "username",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Updates attributes of a template.",
+            "isasync": false,
+            "name": "updateTemplate",
+            "params": [
+                {
+                    "description": "true if the image supports the password reset feature; default is false",
+                    "length": 255,
+                    "name": "passwordenabled",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if the template requres HVM, false otherwise; available only for updateTemplate API",
+                    "length": 255,
+                    "name": "requireshvm",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "the display text of the image",
+                    "length": 4096,
+                    "name": "displaytext",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the OS type that best represents the OS of this image.",
+                    "length": 255,
+                    "name": "ostypeid",
+                    "related": "addGuestOs,listOsTypes",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "true if image is bootable, false otherwise; available only for updateIso API",
+                    "length": 255,
+                    "name": "bootable",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "the name of the image file",
+                    "length": 255,
+                    "name": "name",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the image file",
+                    "length": 255,
+                    "name": "id",
+                    "related": "registerTemplate,listIsos,copyTemplate,registerTemplate,listTemplates,createTemplate,registerIso,registerIso,listIsos,updateTemplate,createTemplate,copyIso",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "true if the template type is routing i.e., if template is used to deploy router",
+                    "length": 255,
+                    "name": "isrouting",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "Details in key/value pairs using format details[i].keyname=keyvalue. Example: details[0].hypervisortoolsversion=xenserver61",
+                    "length": 255,
+                    "name": "details",
+                    "required": false,
+                    "type": "map"
+                },
+                {
+                    "description": "the format for the image",
+                    "length": 255,
+                    "name": "format",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "sort key of the template, integer",
+                    "length": 255,
+                    "name": "sortkey",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "true if template/ISO contains XS/VMWare tools inorder to support dynamic scaling of VM cpu/memory",
+                    "length": 255,
+                    "name": "isdynamicallyscalable",
+                    "required": false,
+                    "type": "boolean"
+                }
+            ],
+            "related": "registerTemplate,listIsos,copyTemplate,registerTemplate,listTemplates,createTemplate,registerIso,registerIso,listIsos,createTemplate,copyIso",
+            "response": [
+                {
+                    "description": "the hypervisor on which the template runs",
+                    "name": "hypervisor",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the secondary storage host for the template",
+                    "name": "hostname",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the OS type for this template.",
+                    "name": "ostypename",
+                    "type": "string"
+                },
+                {
+                    "description": "checksum of the template",
+                    "name": "checksum",
+                    "type": "string"
+                },
+                {
+                    "description": "the size of the template",
+                    "name": "size",
+                    "type": "long"
+                },
+                {
+                    "description": "the tag of this template",
+                    "name": "templatetag",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the template",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the template display text",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "the template name",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "true if this template is a featured template, false otherwise",
+                    "name": "isfeatured",
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if the template is managed across all Zones, false otherwise",
+                    "name": "crossZones",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the date this template was removed",
+                    "name": "removed",
+                    "type": "date"
+                },
+                {
+                    "description": "the ID of the zone for this template",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "true if template contains XS/VMWare tools inorder to support dynamic scaling of VM cpu/memory",
+                    "name": "isdynamicallyscalable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if the template is extractable, false otherwise",
+                    "name": "isextractable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if template is sshkey enabled, false otherwise",
+                    "name": "sshkeyenabled",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the date this template was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the account id to which the template belongs",
+                    "name": "accountid",
+                    "type": "string"
+                },
+                {
+                    "description": "true if the reset password feature is enabled, false otherwise",
+                    "name": "passwordenabled",
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if this template is a public template, false otherwise",
+                    "name": "ispublic",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the ID of the domain to which the template belongs",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the template ID of the parent template if present",
+                    "name": "sourcetemplateid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the zone for this template",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the status of the template",
+                    "name": "status",
+                    "type": "string"
+                },
+                {
+                    "description": "the type of the template",
+                    "name": "templatetype",
+                    "type": "string"
+                },
+                {
+                    "description": "additional key/value details tied with template",
+                    "name": "details",
+                    "type": "map"
+                },
+                {
+                    "description": "the ID of the secondary storage host for the template",
+                    "name": "hostid",
+                    "type": "string"
+                },
+                {
+                    "description": "the template ID",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the format of the template.",
+                    "name": "format",
+                    "type": "imageformat"
+                },
+                {
+                    "description": "the project name of the template",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "true if the ISO is bootable, false otherwise",
+                    "name": "bootable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the account name to which the template belongs",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the OS type for this template.",
+                    "name": "ostypeid",
+                    "type": "string"
+                },
+                {
+                    "description": "true if the template is ready to be deployed from, false otherwise.",
+                    "name": "isready",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the name of the domain to which the template belongs",
+                    "name": "domain",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Creates a VLAN IP range.",
+            "isasync": false,
+            "name": "createVlanIpRange",
+            "params": [
+                {
+                    "description": "the ending IPv6 address in the IPv6 network range",
+                    "length": 255,
+                    "name": "endipv6",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "project who will own the VLAN. If VLAN is Zone wide, this parameter should be ommited",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "listProjectAccounts,suspendProject,activateProject,updateProject,listProjects",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the Zone ID of the VLAN IP range",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones,listZones,createZone,updateZone",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the ending IP address in the VLAN IP range",
+                    "length": 255,
+                    "name": "endip",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "optional parameter. Have to be specified for Direct Untagged vlan only.",
+                    "length": 255,
+                    "name": "podid",
+                    "related": "updatePod",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the beginning IPv6 address in the IPv6 network range",
+                    "length": 255,
+                    "name": "startipv6",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "true if VLAN is of Virtual type, false if Direct",
+                    "length": 255,
+                    "name": "forvirtualnetwork",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "the gateway of the IPv6 network. Required for Shared networks and Isolated networks when it belongs to VPC",
+                    "length": 255,
+                    "name": "ip6gateway",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "account who will own the VLAN. If VLAN is Zone wide, this parameter should be ommited",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the physical network id",
+                    "length": 255,
+                    "name": "physicalnetworkid",
+                    "related": "createPhysicalNetwork",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the beginning IP address in the VLAN IP range",
+                    "length": 255,
+                    "name": "startip",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the netmask of the VLAN IP range",
+                    "length": 255,
+                    "name": "netmask",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "domain ID of the account owning a VLAN",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "listDomains,listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the network id",
+                    "length": 255,
+                    "name": "networkid",
+                    "related": "createNetwork,updateNetwork,listSrxFirewallNetworks,updateNetwork,listBrocadeVcsDeviceNetworks,createNetwork,listNetworks,listNetscalerLoadBalancerNetworks,listF5LoadBalancerNetworks,listPaloAltoFirewallNetworks",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the gateway of the VLAN IP range",
+                    "length": 255,
+                    "name": "gateway",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the CIDR of IPv6 network, must be at least /64",
+                    "length": 255,
+                    "name": "ip6cidr",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the ID or VID of the VLAN. If not specified, will be defaulted to the vlan of the network or if vlan of the network is null - to Untagged",
+                    "length": 255,
+                    "name": "vlan",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "listVlanIpRanges,dedicatePublicIpRange",
+            "response": [
+                {
+                    "description": "the virtual network for the VLAN IP range",
+                    "name": "forvirtualnetwork",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the end ip of the VLAN IP range",
+                    "name": "endip",
+                    "type": "string"
+                },
+                {
+                    "description": "the Pod ID for the VLAN IP range",
+                    "name": "podid",
+                    "type": "string"
+                },
+                {
+                    "description": "the description of the VLAN IP range",
+                    "name": "description",
+                    "type": "string"
+                },
+                {
+                    "description": "the Pod name for the VLAN IP range",
+                    "name": "podname",
+                    "type": "string"
+                },
+                {
+                    "description": "the network id of vlan range",
+                    "name": "networkid",
+                    "type": "string"
+                },
+                {
+                    "description": "the start ip of the VLAN IP range",
+                    "name": "startip",
+                    "type": "string"
+                },
+                {
+                    "description": "the end ipv6 of the VLAN IP range",
+                    "name": "endipv6",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the vlan range",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the physical network this belongs to",
+                    "name": "physicalnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "the gateway of IPv6 network",
+                    "name": "ip6gateway",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID or VID of the VLAN.",
+                    "name": "vlan",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain name of the VLAN IP range",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the cidr of IPv6 network",
+                    "name": "ip6cidr",
+                    "type": "string"
+                },
+                {
+                    "description": "the netmask of the VLAN IP range",
+                    "name": "netmask",
+                    "type": "string"
+                },
+                {
+                    "description": "the start ipv6 of the VLAN IP range",
+                    "name": "startipv6",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the VLAN IP range",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone ID of the VLAN IP range",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the gateway of the VLAN IP range",
+                    "name": "gateway",
+                    "type": "string"
+                },
+                {
+                    "description": "the account of the VLAN IP range",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain ID of the VLAN IP range",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the vlan range",
+                    "name": "projectid",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Updates site to site vpn connection",
+            "isasync": true,
+            "name": "updateVpnConnection",
+            "params": [
+                {
+                    "description": "an optional field, in case you want to set a custom id to the resource. Allowed to Root Admins only",
+                    "length": 255,
+                    "name": "customid",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "string"
+                },
+                {
+                    "description": "an optional field, whether to the display the vpn to the end user or not",
+                    "length": 255,
+                    "name": "fordisplay",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "boolean"
+                },
+                {
+                    "description": "id of vpn connection",
+                    "length": 255,
+                    "name": "id",
+                    "related": "createVpnConnection,listVpnConnections,updateVpnConnection",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "createVpnConnection,listVpnConnections",
+            "response": [
+                {
+                    "description": "the vpn gateway ID",
+                    "name": "s2svpngatewayid",
+                    "type": "string"
+                },
+                {
+                    "description": "the connection ID",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "if DPD is enabled for customer gateway",
+                    "name": "dpd",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the owner",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "Lifetime of IKE SA of customer gateway",
+                    "name": "ikelifetime",
+                    "type": "long"
+                },
+                {
+                    "description": "the date and time the host was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "ESP policy of the customer gateway",
+                    "name": "esppolicy",
+                    "type": "string"
+                },
+                {
+                    "description": "if Force NAT Encapsulation is enabled for customer gateway",
+                    "name": "forceencap",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the public IP address",
+                    "name": "publicip",
+                    "type": "string"
+                },
+                {
+                    "description": "guest cidr list of the customer gateway",
+                    "name": "cidrlist",
+                    "type": "string"
+                },
+                {
+                    "description": "the date and time the host was removed",
+                    "name": "removed",
+                    "type": "date"
+                },
+                {
+                    "description": "public ip address id of the customer gateway",
+                    "name": "gateway",
+                    "type": "string"
+                },
+                {
+                    "description": "IKE policy of the customer gateway",
+                    "name": "ikepolicy",
+                    "type": "string"
+                },
+                {
+                    "description": "the customer gateway ID",
+                    "name": "s2scustomergatewayid",
+                    "type": "string"
+                },
+                {
+                    "description": "State of vpn connection",
+                    "name": "passive",
+                    "type": "boolean"
+                },
+                {
+                    "description": "is connection for display to the regular user",
+                    "name": "fordisplay",
+                    "type": "boolean"
+                },
+                {
+                    "description": "Lifetime of ESP SA of customer gateway",
+                    "name": "esplifetime",
+                    "type": "long"
+                },
+                {
+                    "description": "the domain name of the owner",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "IPsec Preshared-Key of the customer gateway",
+                    "name": "ipsecpsk",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain id of the owner",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "State of vpn connection",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id",
+                    "name": "projectid",
+                    "type": "string"
+                }
+            ],
+            "since": "4.4"
+        },
+        {
+            "description": "lists network that are using Palo Alto firewall device",
+            "isasync": false,
+            "name": "listPaloAltoFirewallNetworks",
+            "params": [
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "palo alto balancer device ID",
+                    "length": 255,
+                    "name": "lbdeviceid",
+                    "related": "configurePaloAltoFirewall,listPaloAltoFirewalls,addPaloAltoFirewall",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                }
+            ],
+            "related": "createNetwork,updateNetwork,listSrxFirewallNetworks,updateNetwork,listBrocadeVcsDeviceNetworks,createNetwork,listNetworks,listNetscalerLoadBalancerNetworks,listF5LoadBalancerNetworks",
+            "response": [
+                {
+                    "description": "the first DNS for the network",
+                    "name": "dns1",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the ipaddress",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the displaytext of the network",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "the physical network id",
+                    "name": "physicalnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "availability of the network offering the network is created from",
+                    "name": "networkofferingavailability",
+                    "type": "string"
+                },
+                {
+                    "description": "list networks that are persistent",
+                    "name": "ispersistent",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the domain name of the network owner",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "an optional field, whether to the display the network to the end user or not.",
+                    "name": "displaynetwork",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the name of the network",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "name of the network offering the network is created from",
+                    "name": "networkofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the address",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the cidr of IPv6 network",
+                    "name": "ip6cidr",
+                    "type": "string"
+                },
+                {
+                    "description": "Cloudstack managed address space, all CloudStack managed VMs get IP address from CIDR",
+                    "name": "cidr",
+                    "type": "string"
+                },
+                {
+                    "description": "the owner of the network",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain id of the network owner",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the network domain",
+                    "name": "networkdomain",
+                    "type": "string"
+                },
+                {
+                    "description": "the network's netmask",
+                    "name": "netmask",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of resource tags associated with network",
+                    "name": "tags",
+                    "response": [
+                        {
+                            "description": "the account associated with the tag",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag key name",
+                            "name": "key",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the domain associated with the tag",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag value",
+                            "name": "value",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project id the tag belongs to",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain associated with the tag",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "customer associated with the tag",
+                            "name": "customer",
+                            "type": "string"
+                        },
+                        {
+                            "description": "id of the resource",
+                            "name": "resourceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name where tag belongs to",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "resource type",
+                            "name": "resourcetype",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "The vlan of the network. This parameter is visible to ROOT admins only",
+                    "name": "vlan",
+                    "type": "string"
+                },
+                {
+                    "description": "display text of the network offering the network is created from",
+                    "name": "networkofferingdisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "the id of the network",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "true if network offering is ip conserve mode enabled",
+                    "name": "networkofferingconservemode",
+                    "type": "boolean"
+                },
+                {
+                    "description": "list networks available for vm deployment",
+                    "name": "canusefordeploy",
+                    "type": "boolean"
+                },
+                {
+                    "description": "acl type - access type to the network",
+                    "name": "acltype",
+                    "type": "string"
+                },
+                {
+                    "description": "the second DNS for the network",
+                    "name": "dns2",
+                    "type": "string"
+                },
+                {
+                    "description": "the gateway of IPv6 network",
+                    "name": "ip6gateway",
+                    "type": "string"
+                },
+                {
+                    "description": "true if network can span multiple zones",
+                    "name": "strechedl2subnet",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the traffic type of the network",
+                    "name": "traffictype",
+                    "type": "string"
+                },
+                {
+                    "description": "true if network is system, false otherwise",
+                    "name": "issystem",
+                    "type": "boolean"
+                },
+                {
+                    "description": "Broadcast domain type of the network",
+                    "name": "broadcastdomaintype",
+                    "type": "string"
+                },
+                {
+                    "description": "related to what other network configuration",
+                    "name": "related",
+                    "type": "string"
+                },
+                {
+                    "description": "ACL Id associated with the VPC network",
+                    "name": "aclid",
+                    "type": "string"
+                },
+                {
+                    "description": "the network CIDR of the guest network configured with IP reservation. It is the summation of CIDR and RESERVED_IP_RANGE",
+                    "name": "networkcidr",
+                    "type": "string"
+                },
+                {
+                    "description": "state of the network",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "true if network supports specifying ip ranges, false otherwise",
+                    "name": "specifyipranges",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the type of the network",
+                    "name": "type",
+                    "type": "string"
+                },
+                {
+                    "description": "network offering id the network is created from",
+                    "name": "networkofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "true if users from subdomains can access the domain level network",
+                    "name": "subdomainaccess",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the list of services",
+                    "name": "service",
+                    "response": [
+                        {
+                            "description": "the service name",
+                            "name": "name",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the service provider name",
+                            "name": "provider",
+                            "response": [
+                                {
+                                    "description": "services for this provider",
+                                    "name": "servicelist",
+                                    "type": "list"
+                                },
+                                {
+                                    "description": "the provider name",
+                                    "name": "name",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the destination physical network",
+                                    "name": "destinationphysicalnetworkid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the physical network this belongs to",
+                                    "name": "physicalnetworkid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "state of the network provider",
+                                    "name": "state",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "uuid of the network provider",
+                                    "name": "id",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "true if individual services can be enabled/disabled",
+                                    "name": "canenableindividualservice",
+                                    "type": "boolean"
+                                }
+                            ],
+                            "type": "list"
+                        },
+                        {
+                            "description": "the list of capabilities",
+                            "name": "capability",
+                            "response": [
+                                {
+                                    "description": "the capability value",
+                                    "name": "value",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "can this service capability value can be choosable while creatine network offerings",
+                                    "name": "canchooseservicecapability",
+                                    "type": "boolean"
+                                },
+                                {
+                                    "description": "the capability name",
+                                    "name": "name",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "list"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "zone id of the network",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the zone the network belongs to",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the network's IP range not to be used by CloudStack guest VMs and can be used for non CloudStack purposes",
+                    "name": "reservediprange",
+                    "type": "string"
+                },
+                {
+                    "description": "If a network is enabled for 'streched l2 subnet' then represents zones on which network currently spans",
+                    "name": "zonesnetworkspans",
+                    "type": "set"
+                },
+                {
+                    "description": "the network's gateway",
+                    "name": "gateway",
+                    "type": "string"
+                },
+                {
+                    "description": "broadcast uri of the network. This parameter is visible to ROOT admins only",
+                    "name": "broadcasturi",
+                    "type": "string"
+                },
+                {
+                    "description": "true if network is default, false otherwise",
+                    "name": "isdefault",
+                    "type": "boolean"
+                },
+                {
+                    "description": "true network requires restart",
+                    "name": "restartrequired",
+                    "type": "boolean"
+                },
+                {
+                    "description": "VPC the network belongs to",
+                    "name": "vpcid",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Get the path associated with the provided volume UUID",
+            "isasync": false,
+            "name": "getPathForVolume",
+            "params": [
+                {
+                    "description": "CloudStack Volume UUID",
+                    "length": 255,
+                    "name": "volumeid",
+                    "required": true,
+                    "type": "string"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "The path field for the volume",
+                    "name": "path",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Updates a vm group",
+            "isasync": false,
+            "name": "updateInstanceGroup",
+            "params": [
+                {
+                    "description": "new instance group name",
+                    "length": 255,
+                    "name": "name",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "Instance group ID",
+                    "length": 255,
+                    "name": "id",
+                    "related": "createInstanceGroup,updateInstanceGroup",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "createInstanceGroup",
+            "response": [
+                {
+                    "description": "the account owning the instance group",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain ID of the instance group",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the project ID of the instance group",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the instance group",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain name of the instance group",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the instance group",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the instance group",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "time and date the instance group was created",
+                    "name": "created",
+                    "type": "date"
+                }
+            ]
+        },
+        {
+            "description": "List ucs manager",
+            "isasync": false,
+            "name": "listUcsManagers",
+            "params": [
+                {
+                    "description": "the zone id",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones,listZones,createZone,updateZone",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "the ID of the ucs manager",
+                    "length": 255,
+                    "name": "id",
+                    "related": "addUcsManager,listUcsManagers",
+                    "required": false,
+                    "type": "uuid"
+                }
+            ],
+            "related": "addUcsManager",
+            "response": [
+                {
+                    "description": "the name of ucs manager",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the zone ID of ucs manager",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the url of ucs manager",
+                    "name": "url",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the ucs manager",
+                    "name": "id",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Upgrades domain router to a new service offering",
+            "isasync": false,
+            "name": "changeServiceForRouter",
+            "params": [
+                {
+                    "description": "the service offering ID to apply to the domain router",
+                    "length": 255,
+                    "name": "serviceofferingid",
+                    "related": "updateServiceOffering,listServiceOfferings",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "The ID of the router",
+                    "length": 255,
+                    "name": "id",
+                    "related": "listInternalLoadBalancerVMs,changeServiceForRouter,destroyRouter,listRouters",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "listInternalLoadBalancerVMs,destroyRouter,listRouters",
+            "response": [
+                {
+                    "description": "the public IP address for the router",
+                    "name": "publicip",
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone ID for the router",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the public netmask for the router",
+                    "name": "publicnetmask",
+                    "type": "string"
+                },
+                {
+                    "description": "if this router is an redundant virtual router",
+                    "name": "isredundantrouter",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the second IPv6 DNS for the router",
+                    "name": "ip6dns2",
+                    "type": "string"
+                },
+                {
+                    "description": "true if the router template requires upgrader",
+                    "name": "requiresupgrade",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the name of the corresponding guest network",
+                    "name": "guestnetworkname",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the service offering of the virtual machine",
+                    "name": "serviceofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the service offering of the virtual machine",
+                    "name": "serviceofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of VPC the router belongs to",
+                    "name": "vpcname",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of nics associated with the router",
+                    "name": "nic",
+                    "response": [
+                        {
+                            "description": "the broadcast uri of the nic",
+                            "name": "broadcasturi",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the NSX Logical Switch Port (if NSX based), null otherwise",
+                            "name": "nsxlogicalswitchport",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the Secondary ipv4 addr of nic",
+                            "name": "secondaryip",
+                            "type": "list"
+                        },
+                        {
+                            "description": "true if nic is default, false otherwise",
+                            "name": "macaddress",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the netmask of the nic",
+                            "name": "netmask",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the vm to which the nic belongs",
+                            "name": "virtualmachineid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the gateway of IPv6 network",
+                            "name": "ip6gateway",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the type of the nic",
+                            "name": "type",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the NSX Logical Switch (if NSX based), null otherwise",
+                            "name": "nsxlogicalswitch",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the name of the corresponding network",
+                            "name": "networkname",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the cidr of IPv6 network",
+                            "name": "ip6cidr",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the gateway of the nic",
+                            "name": "gateway",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if nic is default, false otherwise",
+                            "name": "isdefault",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "the ID of the corresponding network",
+                            "name": "networkid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ip address of the nic",
+                            "name": "ipaddress",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the isolation uri of the nic",
+                            "name": "isolationuri",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the traffic type of the nic",
+                            "name": "traffictype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "device id for the network when plugged into the virtual machine",
+                            "name": "deviceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the nic",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the IPv6 address of network",
+                            "name": "ip6address",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "the state of the router",
+                    "name": "state",
+                    "type": "state"
+                },
+                {
+                    "description": "role of the domain router",
+                    "name": "role",
+                    "type": "string"
+                },
+                {
+                    "description": "the second DNS for the router",
+                    "name": "dns2",
+                    "type": "string"
+                },
+                {
+                    "description": "the link local MAC address for the router",
+                    "name": "linklocalmacaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the public MAC address for the router",
+                    "name": "publicmacaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the gateway for the router",
+                    "name": "gateway",
+                    "type": "string"
+                },
+                {
+                    "description": "the hostname for the router",
+                    "name": "hostname",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the corresponding link local network",
+                    "name": "linklocalnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "the first DNS for the router",
+                    "name": "dns1",
+                    "type": "string"
+                },
+                {
+                    "description": "the network domain for the router",
+                    "name": "networkdomain",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the address",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the guest IP address for the router",
+                    "name": "guestipaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the corresponding public network",
+                    "name": "publicnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "the version of template",
+                    "name": "version",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the router",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the Pod ID for the router",
+                    "name": "podid",
+                    "type": "string"
+                },
+                {
+                    "description": "the template ID for the router",
+                    "name": "templateid",
+                    "type": "string"
+                },
+                {
+                    "description": "the guest netmask for the router",
+                    "name": "guestnetmask",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the ipaddress",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "VPC the router belongs to",
+                    "name": "vpcid",
+                    "type": "string"
+                },
+                {
+                    "description": "the host ID for the router",
+                    "name": "hostid",
+                    "type": "string"
+                },
+                {
+                    "description": "the link local IP address for the router",
+                    "name": "linklocalip",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain ID associated with the router",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the id of the router",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the date and time the router was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the domain associated with the router",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the version of scripts",
+                    "name": "scriptsversion",
+                    "type": "string"
+                },
+                {
+                    "description": "the link local netmask for the router",
+                    "name": "linklocalnetmask",
+                    "type": "string"
+                },
+                {
+                    "description": "the guest MAC address for the router",
+                    "name": "guestmacaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of redundant virtual router",
+                    "name": "redundantstate",
+                    "type": "string"
+                },
+                {
+                    "description": "the first IPv6 DNS for the router",
+                    "name": "ip6dns1",
+                    "type": "string"
+                },
+                {
+                    "description": "the hypervisor on which the template runs",
+                    "name": "hypervisor",
+                    "type": "string"
+                },
+                {
+                    "description": "the account associated with the router",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone name for the router",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the corresponding guest network",
+                    "name": "guestnetworkid",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Remove an Ldap Configuration",
+            "isasync": false,
+            "name": "deleteLdapConfiguration",
+            "params": [
+                {
+                    "description": "Hostname",
+                    "length": 255,
+                    "name": "hostname",
+                    "required": true,
+                    "type": "string"
+                }
+            ],
+            "related": "addLdapConfiguration",
+            "response": [
+                {
+                    "description": "hostname",
+                    "name": "hostname",
+                    "type": "string"
+                },
+                {
+                    "description": "port",
+                    "name": "port",
+                    "type": "int"
+                }
+            ],
+            "since": "4.2.0"
+        },
+        {
+            "description": "Updates the volume.",
+            "isasync": true,
+            "name": "updateVolume",
+            "params": [
+                {
+                    "description": "The path of the volume",
+                    "length": 255,
+                    "name": "path",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "The state of the volume",
+                    "length": 255,
+                    "name": "state",
+                    "required": false,
+                    "since": "4.3",
+                    "type": "string"
+                },
+                {
+                    "description": "Destination storage pool UUID for the volume",
+                    "length": 255,
+                    "name": "storageid",
+                    "related": "createStoragePool,findStoragePoolsForMigration,enableStorageMaintenance,cancelStorageMaintenance",
+                    "required": false,
+                    "since": "4.3",
+                    "type": "uuid"
+                },
+                {
+                    "description": "the ID of the disk volume",
+                    "length": 255,
+                    "name": "id",
+                    "related": "listVolumes,updateVolume,attachVolume,updateVolume,migrateVolume,createVolume,listVolumes,uploadVolume,attachVolume,detachVolume,resizeVolume,migrateVolume,createVolume",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "an optional field, in case you want to set a custom id to the resource. Allowed to Root Admins only",
+                    "length": 255,
+                    "name": "customid",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "string"
+                },
+                {
+                    "description": "an optional field, whether to the display the volume to the end user or not.",
+                    "length": 255,
+                    "name": "displayvolume",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "The chain info of the volume",
+                    "length": 255,
+                    "name": "chaininfo",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "string"
+                }
+            ],
+            "related": "listVolumes,attachVolume,updateVolume,migrateVolume,createVolume,listVolumes,uploadVolume,attachVolume,detachVolume,resizeVolume,migrateVolume,createVolume",
+            "response": [
+                {
+                    "description": "the path of the volume",
+                    "name": "path",
+                    "type": "string"
+                },
+                {
+                    "description": "the date the disk volume was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": " an alternate display text of the template for the virtual machine",
+                    "name": "templatedisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "io requests read rate of the disk volume",
+                    "name": "diskIopsReadRate",
+                    "type": "long"
+                },
+                {
+                    "description": "name of the primary storage hosting the disk volume",
+                    "name": "storage",
+                    "type": "string"
+                },
+                {
+                    "description": "true if the volume is extractable, false otherwise",
+                    "name": "isextractable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "ID of the disk offering",
+                    "name": "diskofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the vpn",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain associated with the disk volume",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "Hypervisor the volume belongs to",
+                    "name": "hypervisor",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the ISO attached to the virtual machine",
+                    "name": "isoid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the domain associated with the disk volume",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the display text of the service offering for root disk",
+                    "name": "serviceofferingdisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the ISO attached to the virtual machine",
+                    "name": "isoname",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the template for the virtual machine",
+                    "name": "templatename",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the vpn",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the chain info of the volume",
+                    "name": "chaininfo",
+                    "type": "string"
+                },
+                {
+                    "description": "type of the disk volume (ROOT or DATADISK)",
+                    "name": "type",
+                    "type": "string"
+                },
+                {
+                    "description": "the display text of the disk offering",
+                    "name": "diskofferingdisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "ID of the service offering for root disk",
+                    "name": "serviceofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "state of the virtual machine",
+                    "name": "vmstate",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of the disk volume",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "min iops of the disk volume",
+                    "name": "miniops",
+                    "type": "long"
+                },
+                {
+                    "description": "max iops of the disk volume",
+                    "name": "maxiops",
+                    "type": "long"
+                },
+                {
+                    "description": "size of the disk volume",
+                    "name": "size",
+                    "type": "long"
+                },
+                {
+                    "description": "name of the service offering for root disk",
+                    "name": "serviceofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "name of the disk offering",
+                    "name": "diskofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "io requests write rate of the disk volume",
+                    "name": "diskIopsWriteRate",
+                    "type": "long"
+                },
+                {
+                    "description": "the ID of the template for the virtual machine. A -1 is returned if the virtual machine was created from an ISO file.",
+                    "name": "templateid",
+                    "type": "string"
+                },
+                {
+                    "description": "id of the primary storage hosting the disk volume; returned to admin user only",
+                    "name": "storageid",
+                    "type": "string"
+                },
+                {
+                    "description": "name of the availability zone",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "provisioning type used to create volumes.",
+                    "name": "provisioningtype",
+                    "type": "string"
+                },
+                {
+                    "description": "ID of the disk volume",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the date the volume was attached to a VM instance",
+                    "name": "attached",
+                    "type": "date"
+                },
+                {
+                    "description": "name of the disk volume",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "an optional field whether to the display the volume to the end user or not.",
+                    "name": "displayvolume",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the account associated with the disk volume",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "ID of the snapshot from which this volume was created",
+                    "name": "snapshotid",
+                    "type": "string"
+                },
+                {
+                    "description": "shared or local storage",
+                    "name": "storagetype",
+                    "type": "string"
+                },
+                {
+                    "description": "ID of the availability zone",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the device on user vm the volume is attahed to. This tag is not returned when the volume is detached.",
+                    "name": "deviceid",
+                    "type": "long"
+                },
+                {
+                    "description": "need quiesce vm or not when taking snapshot",
+                    "name": "quiescevm",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the status of the volume",
+                    "name": "status",
+                    "type": "string"
+                },
+                {
+                    "description": "an alternate display text of the ISO attached to the virtual machine",
+                    "name": "isodisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "bytes read rate of the disk volume",
+                    "name": "diskBytesReadRate",
+                    "type": "long"
+                },
+                {
+                    "description": "the boolean state of whether the volume is destroyed or not",
+                    "name": "destroyed",
+                    "type": "boolean"
+                },
+                {
+                    "description": "id of the virtual machine",
+                    "name": "virtualmachineid",
+                    "type": "string"
+                },
+                {
+                    "description": "bytes write rate of the disk volume",
+                    "name": "diskBytesWriteRate",
+                    "type": "long"
+                },
+                {
+                    "description": "name of the virtual machine",
+                    "name": "vmname",
+                    "type": "string"
+                },
+                {
+                    "description": "display name of the virtual machine",
+                    "name": "vmdisplayname",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Lists traffic types of a given physical network.",
+            "isasync": false,
+            "name": "listTrafficTypes",
+            "params": [
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "the Physical Network ID",
+                    "length": 255,
+                    "name": "physicalnetworkid",
+                    "related": "createPhysicalNetwork",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "listNetworkServiceProviders",
+            "response": [
+                {
+                    "description": "true if individual services can be enabled/disabled",
+                    "name": "canenableindividualservice",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the physical network this belongs to",
+                    "name": "physicalnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "services for this provider",
+                    "name": "servicelist",
+                    "type": "list"
+                },
+                {
+                    "description": "the destination physical network",
+                    "name": "destinationphysicalnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "state of the network provider",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "uuid of the network provider",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the provider name",
+                    "name": "name",
+                    "type": "string"
+                }
+            ],
+            "since": "3.0.0"
+        },
+        {
+            "description": "Adds secondary storage.",
+            "isasync": false,
+            "name": "addSecondaryStorage",
+            "params": [
+                {
+                    "description": "the Zone ID for the secondary storage",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones,listZones,createZone,updateZone",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the URL for the secondary storage",
+                    "length": 255,
+                    "name": "url",
+                    "required": true,
+                    "type": "string"
+                }
+            ],
+            "related": "addImageStoreS3,updateCloudToUseObjectStore,listSwifts,listImageStores",
+            "response": [
+                {
+                    "description": "the protocol of the image store",
+                    "name": "protocol",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the image store",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the url of the image store",
+                    "name": "url",
+                    "type": "string"
+                },
+                {
+                    "description": "the scope of the image store",
+                    "name": "scope",
+                    "type": "scopetype"
+                },
+                {
+                    "description": "the provider name of the image store",
+                    "name": "providername",
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone name of the image store",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the image store",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the details of the image store",
+                    "name": "details",
+                    "type": "set"
+                },
+                {
+                    "description": "the Zone ID of the image store",
+                    "name": "zoneid",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Updates properties of a virtual machine. The VM has to be stopped and restarted for the new properties to take effect. UpdateVirtualMachine does not first check whether the VM is stopped. Therefore, stop the VM manually before issuing this call.",
+            "isasync": false,
+            "name": "updateVirtualMachine",
+            "params": [
+                {
+                    "description": "group of the virtual machine",
+                    "length": 255,
+                    "name": "group",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "comma separated list of security groups names that going to be applied to the virtual machine. Should be passed only when vm is created from a zone with Basic Network support. Mutually exclusive with securitygroupids parameter",
+                    "length": 255,
+                    "name": "securitygroupnames",
+                    "related": "createSecurityGroup",
+                    "required": false,
+                    "type": "list"
+                },
+                {
+                    "description": "user generated name",
+                    "length": 255,
+                    "name": "displayname",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "an optional binary data that can be sent to the virtual machine upon a successful deployment. This binary data must be base64 encoded before adding it to the request. Using HTTP GET (via querystring), you can send up to 2KB of data after base64 encoding. Using HTTP POST(via POST body), you can send up to 32K of data after base64 encoding.",
+                    "length": 32768,
+                    "name": "userdata",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the OS type that best represents this VM.",
+                    "length": 255,
+                    "name": "ostypeid",
+                    "related": "addGuestOs,listOsTypes",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "new host name of the vm. The VM has to be stopped/started for this update to take affect",
+                    "length": 255,
+                    "name": "name",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "string"
+                },
+                {
+                    "description": "true if high-availability is enabled for the virtual machine, false otherwise",
+                    "length": 255,
+                    "name": "haenable",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "an optional field, whether to the display the vm to the end user or not.",
+                    "length": 255,
+                    "name": "displayvm",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "Details in key/value pairs.",
+                    "length": 255,
+                    "name": "details",
+                    "required": false,
+                    "type": "map"
+                },
+                {
+                    "description": "an optional field, in case you want to set a custom id to the resource. Allowed to Root Admins only",
+                    "length": 255,
+                    "name": "customid",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "string"
+                },
+                {
+                    "description": "instance name of the user vm",
+                    "length": 255,
+                    "name": "instancename",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "string"
+                },
+                {
+                    "description": "The ID of the virtual machine",
+                    "length": 255,
+                    "name": "id",
+                    "related": "updateVMAffinityGroup,detachIso,resetSSHKeyForVirtualMachine,resetSSHKeyForVirtualMachine,migrateVirtualMachineWithVolume,attachIso,removeNicFromVirtualMachine,updateVirtualMachine,recoverVirtualMachine,migrateVirtualMachine,resetPasswordForVirtualMachine,revertToVMSnapshot,updateVMAffinityGroup,listVirtualMachines,rebootVirtualMachine,restoreVirtualMachine,destroyVirtualMachine,stopVirtualMachine,deployVirtualMachine,detachIso,deployVirtualMachine,updateVirtualMachine,revertToVMSnapshot,resetPasswordForVirtualMachine,startVirtualMachine,updateDefaultNicForVirtualMachine,startVirtualMachine,attachIso,listVirtualMachines,addNicToVirtualMachine,stopVirtualMachine,destroyVirtualMachine,removeNicFromVirtualMachine,changeServiceForVirtualMachine",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list of security group ids to be applied on the virtual machine.",
+                    "length": 255,
+                    "name": "securitygroupids",
+                    "related": "createSecurityGroup",
+                    "required": false,
+                    "type": "list"
+                },
+                {
+                    "description": "true if VM contains XS/VMWare tools inorder to support dynamic scaling of VM cpu/memory",
+                    "length": 255,
+                    "name": "isdynamicallyscalable",
+                    "required": false,
+                    "type": "boolean"
+                }
+            ],
+            "related": "updateVMAffinityGroup,detachIso,resetSSHKeyForVirtualMachine,resetSSHKeyForVirtualMachine,migrateVirtualMachineWithVolume,attachIso,removeNicFromVirtualMachine,recoverVirtualMachine,migrateVirtualMachine,resetPasswordForVirtualMachine,revertToVMSnapshot,updateVMAffinityGroup,listVirtualMachines,rebootVirtualMachine,restoreVirtualMachine,destroyVirtualMachine,stopVirtualMachine,deployVirtualMachine,detachIso,deployVirtualMachine,updateVirtualMachine,revertToVMSnapshot,resetPasswordForVirtualMachine,startVirtualMachine,updateDefaultNicForVirtualMachine,startVirtualMachine,attachIso,listVirtualMachines,addNicToVirtualMachine,stopVirtualMachine,destroyVirtualMachine,removeNicFromVirtualMachine,changeServiceForVirtualMachine",
+            "response": [
+                {
+                    "description": "the state of the virtual machine",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the amount of the vm's CPU currently used",
+                    "name": "cpuused",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the service offering of the virtual machine",
+                    "name": "serviceofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "the user's ID who deployed the virtual machine",
+                    "name": "userid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the virtual machine",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the ISO attached to the virtual machine",
+                    "name": "isoname",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the availablility zone for the virtual machine",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "device type of the root volume",
+                    "name": "rootdevicetype",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the domain in which the virtual machine exists",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the date when this virtual machine was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the outgoing network traffic on the host",
+                    "name": "networkkbswrite",
+                    "type": "long"
+                },
+                {
+                    "description": "the name of the disk offering of the virtual machine",
+                    "name": "diskofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "the group ID of the virtual machine",
+                    "name": "groupid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the virtual machine",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "ssh key-pair",
+                    "name": "keypair",
+                    "type": "string"
+                },
+                {
+                    "description": "true if the password rest feature is enabled, false otherwise",
+                    "name": "passwordenabled",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the memory allocated for the virtual machine",
+                    "name": "memory",
+                    "type": "integer"
+                },
+                {
+                    "description": "OS type id of the vm",
+                    "name": "ostypeid",
+                    "type": "long"
+                },
+                {
+                    "description": "the number of cpu this virtual machine is running with",
+                    "name": "cpunumber",
+                    "type": "integer"
+                },
+                {
+                    "description": "true if vm contains XS/VMWare tools inorder to support dynamic scaling of VM cpu/memory.",
+                    "name": "isdynamicallyscalable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the read (io) of disk on the vm",
+                    "name": "diskioread",
+                    "type": "long"
+                },
+                {
+                    "description": "the ID of the disk offering of the virtual machine",
+                    "name": "diskofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "true if high-availability is enabled, false otherwise",
+                    "name": "haenable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "an optional field whether to the display the vm to the end user or not.",
+                    "name": "displayvm",
+                    "type": "boolean"
+                },
+                {
+                    "description": "State of the Service from LB rule",
+                    "name": "servicestate",
+                    "type": "string"
+                },
+                {
+                    "description": "the account associated with the virtual machine",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the internal memory thats free in vm",
+                    "name": "memoryintfreekbs",
+                    "type": "long"
+                },
+                {
+                    "description": "the ID of the template for the virtual machine. A -1 is returned if the virtual machine was created from an ISO file.",
+                    "name": "templateid",
+                    "type": "string"
+                },
+                {
+                    "description": "the target memory in vm",
+                    "name": "memorytargetkbs",
+                    "type": "long"
+                },
+                {
+                    "description": "user generated name. The name of the virtual machine is returned if no displayname exists.",
+                    "name": "displayname",
+                    "type": "string"
+                },
+                {
+                    "description": "public IP address id associated with vm via Static nat rule",
+                    "name": "publicipid",
+                    "type": "string"
+                },
+                {
+                    "description": "the speed of each cpu",
+                    "name": "cpuspeed",
+                    "type": "integer"
+                },
+                {
+                    "description": "the ID of the domain in which the virtual machine exists",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of nics associated with vm",
+                    "name": "nic",
+                    "response": [
+                        {
+                            "description": "true if nic is default, false otherwise",
+                            "name": "macaddress",
+                            "type": "string"
+                        },
+                        {
+                            "description": "device id for the network when plugged into the virtual machine",
+                            "name": "deviceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ip address of the nic",
+                            "name": "ipaddress",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the IPv6 address of network",
+                            "name": "ip6address",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the name of the corresponding network",
+                            "name": "networkname",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the traffic type of the nic",
+                            "name": "traffictype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the broadcast uri of the nic",
+                            "name": "broadcasturi",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the gateway of the nic",
+                            "name": "gateway",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the cidr of IPv6 network",
+                            "name": "ip6cidr",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the netmask of the nic",
+                            "name": "netmask",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the vm to which the nic belongs",
+                            "name": "virtualmachineid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the NSX Logical Switch (if NSX based), null otherwise",
+                            "name": "nsxlogicalswitch",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the gateway of IPv6 network",
+                            "name": "ip6gateway",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the isolation uri of the nic",
+                            "name": "isolationuri",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the type of the nic",
+                            "name": "type",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if nic is default, false otherwise",
+                            "name": "isdefault",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "Id of the NSX Logical Switch Port (if NSX based), null otherwise",
+                            "name": "nsxlogicalswitchport",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the nic",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the corresponding network",
+                            "name": "networkid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the Secondary ipv4 addr of nic",
+                            "name": "secondaryip",
+                            "type": "list"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "the name of the host for the virtual machine",
+                    "name": "hostname",
+                    "type": "string"
+                },
+                {
+                    "description": "the write (io) of disk on the vm",
+                    "name": "diskiowrite",
+                    "type": "long"
+                },
+                {
+                    "description": "Vm details in key/value pairs.",
+                    "name": "details",
+                    "type": "map"
+                },
+                {
+                    "description": "the memory used by the vm",
+                    "name": "memorykbs",
+                    "type": "long"
+                },
+                {
+                    "description": "the user's name who deployed the virtual machine",
+                    "name": "username",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the vm",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the availability zone for the virtual machine",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "list of affinity groups associated with the virtual machine",
+                    "name": "affinitygroup",
+                    "response": [
+                        {
+                            "description": "the type of the affinity group",
+                            "name": "type",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the affinity group",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain ID of the affinity group",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the name of the affinity group",
+                            "name": "name",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the description of the affinity group",
+                            "name": "description",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain name of the affinity group",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project ID of the affinity group",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "virtual machine IDs associated with this affinity group",
+                            "name": "virtualmachineIds",
+                            "type": "list"
+                        },
+                        {
+                            "description": "the project name of the affinity group",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account owning the affinity group",
+                            "name": "account",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "the project id of the vm",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the template for the virtual machine",
+                    "name": "templatename",
+                    "type": "string"
+                },
+                {
+                    "description": "device ID of the root volume",
+                    "name": "rootdeviceid",
+                    "type": "long"
+                },
+                {
+                    "description": "list of security groups associated with the virtual machine",
+                    "name": "securitygroup",
+                    "response": [
+                        {
+                            "description": "the list of egress rules associated with the security group",
+                            "name": "egressrule",
+                            "response": [
+                                {
+                                    "description": "the code for the ICMP message response",
+                                    "name": "icmpcode",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "account owning the security group rule",
+                                    "name": "account",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the list of resource tags associated with the rule",
+                                    "name": "tags",
+                                    "response": [
+                                        {
+                                            "description": "the domain associated with the tag",
+                                            "name": "domain",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "id of the resource",
+                                            "name": "resourceid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project id the tag belongs to",
+                                            "name": "projectid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project name where tag belongs to",
+                                            "name": "project",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "customer associated with the tag",
+                                            "name": "customer",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the account associated with the tag",
+                                            "name": "account",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the ID of the domain associated with the tag",
+                                            "name": "domainid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag key name",
+                                            "name": "key",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "resource type",
+                                            "name": "resourcetype",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag value",
+                                            "name": "value",
+                                            "type": "string"
+                                        }
+                                    ],
+                                    "type": "set"
+                                },
+                                {
+                                    "description": "the id of the security group rule",
+                                    "name": "ruleid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the ending IP of the security group rule ",
+                                    "name": "endport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the starting IP of the security group rule",
+                                    "name": "startport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the protocol of the security group rule",
+                                    "name": "protocol",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the type of the ICMP message response",
+                                    "name": "icmptype",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "security group name",
+                                    "name": "securitygroupname",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the CIDR notation for the base IP address of the security group rule",
+                                    "name": "cidr",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "set"
+                        },
+                        {
+                            "description": "the domain name of the security group",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project id of the group",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the name of the security group",
+                            "name": "name",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of ingress rules associated with the security group",
+                            "name": "ingressrule",
+                            "response": [
+                                {
+                                    "description": "the list of resource tags associated with the rule",
+                                    "name": "tags",
+                                    "response": [
+                                        {
+                                            "description": "resource type",
+                                            "name": "resourcetype",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "id of the resource",
+                                            "name": "resourceid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project id the tag belongs to",
+                                            "name": "projectid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "customer associated with the tag",
+                                            "name": "customer",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the ID of the domain associated with the tag",
+                                            "name": "domainid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project name where tag belongs to",
+                                            "name": "project",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the account associated with the tag",
+                                            "name": "account",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag key name",
+                                            "name": "key",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the domain associated with the tag",
+                                            "name": "domain",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag value",
+                                            "name": "value",
+                                            "type": "string"
+                                        }
+                                    ],
+                                    "type": "set"
+                                },
+                                {
+                                    "description": "the ending IP of the security group rule ",
+                                    "name": "endport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the protocol of the security group rule",
+                                    "name": "protocol",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the code for the ICMP message response",
+                                    "name": "icmpcode",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the CIDR notation for the base IP address of the security group rule",
+                                    "name": "cidr",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "account owning the security group rule",
+                                    "name": "account",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the starting IP of the security group rule",
+                                    "name": "startport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the type of the ICMP message response",
+                                    "name": "icmptype",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "security group name",
+                                    "name": "securitygroupname",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the id of the security group rule",
+                                    "name": "ruleid",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "set"
+                        },
+                        {
+                            "description": "the description of the security group",
+                            "name": "description",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the number of virtualmachines associated with this securitygroup",
+                            "name": "virtualmachinecount",
+                            "type": "integer"
+                        },
+                        {
+                            "description": "the ID of the security group",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of virtualmachine ids associated with this securitygroup",
+                            "name": "virtualmachineids",
+                            "type": "set"
+                        },
+                        {
+                            "description": "the project name of the group",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account owning the security group",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain ID of the security group",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of resource tags associated with the rule",
+                            "name": "tags",
+                            "response": [
+                                {
+                                    "description": "tag value",
+                                    "name": "value",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "id of the resource",
+                                    "name": "resourceid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "resource type",
+                                    "name": "resourcetype",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the domain associated with the tag",
+                                    "name": "domain",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the account associated with the tag",
+                                    "name": "account",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the project name where tag belongs to",
+                                    "name": "project",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "tag key name",
+                                    "name": "key",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "customer associated with the tag",
+                                    "name": "customer",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the project id the tag belongs to",
+                                    "name": "projectid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the ID of the domain associated with the tag",
+                                    "name": "domainid",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "set"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "the virtual network for the service offering",
+                    "name": "forvirtualnetwork",
+                    "type": "boolean"
+                },
+                {
+                    "description": "Os type ID of the virtual machine",
+                    "name": "guestosid",
+                    "type": "string"
+                },
+                {
+                    "description": "the vgpu type used by the virtual machine",
+                    "name": "vgpu",
+                    "type": "string"
+                },
+                {
+                    "description": " an alternate display text of the template for the virtual machine",
+                    "name": "templatedisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "public IP address id associated with vm via Static nat rule",
+                    "name": "publicip",
+                    "type": "string"
+                },
+                {
+
+                },
+                {
+                    "description": "the ID of the ISO attached to the virtual machine",
+                    "name": "isoid",
+                    "type": "string"
+                },
+                {
+                    "description": "the hypervisor on which the template runs",
+                    "name": "hypervisor",
+                    "type": "string"
+                },
+                {
+                    "description": "the write (bytes) of disk on the vm",
+                    "name": "diskkbswrite",
+                    "type": "long"
+                },
+                {
+                    "description": "the incoming network traffic on the vm",
+                    "name": "networkkbsread",
+                    "type": "long"
+                },
+                {
+                    "description": "instance name of the user vm; this parameter is returned to the ROOT admin only",
+                    "name": "instancename",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the service offering of the virtual machine",
+                    "name": "serviceofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "an alternate display text of the ISO attached to the virtual machine",
+                    "name": "isodisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the host for the virtual machine",
+                    "name": "hostid",
+                    "type": "string"
+                },
+                {
+                    "description": "the group name of the virtual machine",
+                    "name": "group",
+                    "type": "string"
+                },
+                {
+                    "description": "the read (bytes) of disk on the vm",
+                    "name": "diskkbsread",
+                    "type": "long"
+                },
+                {
+                    "description": "the password (if exists) of the virtual machine",
+                    "name": "password",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Updates account information for the authenticated user",
+            "isasync": false,
+            "name": "updateAccount",
+            "params": [
+                {
+                    "description": "details for account used to store specific parameters",
+                    "length": 255,
+                    "name": "accountdetails",
+                    "required": false,
+                    "type": "map"
+                },
+                {
+                    "description": "Account id",
+                    "length": 255,
+                    "name": "id",
+                    "related": "disableAccount,listAccounts,listAccounts,enableAccount,updateAccount,createAccount",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "Network domain for the account's networks; empty string will update domainName with NULL value",
+                    "length": 255,
+                    "name": "networkdomain",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the current account name",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the domain where the account exists",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "listDomains,listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "new name for the account",
+                    "length": 255,
+                    "name": "newname",
+                    "required": true,
+                    "type": "string"
+                }
+            ],
+            "related": "disableAccount,listAccounts,listAccounts,enableAccount,createAccount",
+            "response": [
+                {
+                    "description": "the total number of snapshots available for this account",
+                    "name": "snapshotavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total memory (in MB) available to be created for this account",
+                    "name": "memoryavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of networks available to be created for this account",
+                    "name": "networkavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total secondary storage space (in GiB) owned by account",
+                    "name": "secondarystoragetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the network domain",
+                    "name": "networkdomain",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of templates which can be created by this account",
+                    "name": "templatelimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total volume being used by this account",
+                    "name": "volumetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of projects being administrated by this account",
+                    "name": "projecttotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of templates available to be created by this account",
+                    "name": "templateavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of virtual machines stopped for this account",
+                    "name": "vmstopped",
+                    "type": "integer"
+                },
+                {
+                    "description": "the total number of network traffic bytes received",
+                    "name": "receivedbytes",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of network traffic bytes sent",
+                    "name": "sentbytes",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of vpcs owned by account",
+                    "name": "vpctotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total primary storage space (in GiB) the account can own",
+                    "name": "primarystoragelimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the role",
+                    "name": "roleid",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of networks the account can own",
+                    "name": "networklimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the id of the account",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of public ip addresses allocated for this account",
+                    "name": "iptotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of cpu cores the account can own",
+                    "name": "cpulimit",
+                    "type": "string"
+                },
+                {
+                    "description": "true if the account requires cleanup",
+                    "name": "iscleanuprequired",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the total number of cpu cores available to be created for this account",
+                    "name": "cpuavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of virtual machines that can be deployed by this account",
+                    "name": "vmlimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of templates which have been created by this account",
+                    "name": "templatetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total primary storage space (in GiB) owned by account",
+                    "name": "primarystoragetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "account type (admin, domain-admin, user)",
+                    "name": "accounttype",
+                    "type": "short"
+                },
+                {
+                    "description": "the total number of virtual machines deployed by this account",
+                    "name": "vmtotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the list of acl groups that account belongs to",
+                    "name": "groups",
+                    "type": "list"
+                },
+                {
+                    "description": "id of the Domain the account belongs too",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of snapshots which can be stored by this account",
+                    "name": "snapshotlimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of virtual machines available for this account to acquire",
+                    "name": "vmavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the type of the role (Admin, ResourceAdmin, DomainAdmin, User)",
+                    "name": "roletype",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of projects available for administration by this account",
+                    "name": "projectavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of the account",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the role",
+                    "name": "rolename",
+                    "type": "string"
+                },
+                {
+                    "description": "the total volume available for this account",
+                    "name": "volumeavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of virtual machines running for this account",
+                    "name": "vmrunning",
+                    "type": "integer"
+                },
+                {
+                    "description": "the total number of cpu cores owned by account",
+                    "name": "cputotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the name of the account",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of vpcs available to be created for this account",
+                    "name": "vpcavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of public ip addresses available for this account to acquire",
+                    "name": "ipavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of public ip addresses this account can acquire",
+                    "name": "iplimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of projects the account can own",
+                    "name": "projectlimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total memory (in MB) owned by account",
+                    "name": "memorytotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total secondary storage space (in GiB) available to be used for this account",
+                    "name": "secondarystorageavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total primary storage space (in GiB) available to be used for this account",
+                    "name": "primarystorageavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of vpcs the account can own",
+                    "name": "vpclimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total memory (in MB) the account can own",
+                    "name": "memorylimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total volume which can be used by this account",
+                    "name": "volumelimit",
+                    "type": "string"
+                },
+                {
+                    "description": "true if account is default, false otherwise",
+                    "name": "isdefault",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the list of users associated with account",
+                    "name": "user",
+                    "response": [
+                        {
+                            "description": "the date and time the user account was created",
+                            "name": "created",
+                            "type": "date"
+                        },
+                        {
+                            "description": "the name of the role",
+                            "name": "rolename",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the boolean value representing if the updating target is in caller's child domain",
+                            "name": "iscallerchilddomain",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "the user name",
+                            "name": "username",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain ID of the user",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the secret key of the user",
+                            "name": "secretkey",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account ID of the user",
+                            "name": "accountid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain name of the user",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the user firstname",
+                            "name": "firstname",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account name of the user",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the api key of the user",
+                            "name": "apikey",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the user state",
+                            "name": "state",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the user email address",
+                            "name": "email",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the timezone user was created in",
+                            "name": "timezone",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the role",
+                            "name": "roleid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the user lastname",
+                            "name": "lastname",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if user is default, false otherwise",
+                            "name": "isdefault",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "the user ID",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account type of the user",
+                            "name": "accounttype",
+                            "type": "short"
+                        },
+                        {
+                            "description": "the type of the role",
+                            "name": "roletype",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "name of the Domain the account belongs too",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the default zone of the account",
+                    "name": "defaultzoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the total secondary storage space (in GiB) the account can own",
+                    "name": "secondarystoragelimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of networks owned by account",
+                    "name": "networktotal",
+                    "type": "long"
+                },
+                {
+                    "description": "details for the account",
+                    "name": "accountdetails",
+                    "type": "map"
+                },
+                {
+                    "description": "the total number of snapshots stored by this account",
+                    "name": "snapshottotal",
+                    "type": "long"
+                }
+            ]
+        },
+        {
+            "description": "Disables an account",
+            "isasync": true,
+            "name": "disableAccount",
+            "params": [
+                {
+                    "description": "Account id",
+                    "length": 255,
+                    "name": "id",
+                    "related": "disableAccount,listAccounts,listAccounts,enableAccount,createAccount",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "Disables specified account.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "If true, only lock the account; else disable the account",
+                    "length": 255,
+                    "name": "lock",
+                    "required": true,
+                    "type": "boolean"
+                },
+                {
+                    "description": "Disables specified account in this domain.",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "listDomains,listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                }
+            ],
+            "related": "listAccounts,listAccounts,enableAccount,createAccount",
+            "response": [
+                {
+                    "description": "the total number of virtual machines running for this account",
+                    "name": "vmrunning",
+                    "type": "integer"
+                },
+                {
+                    "description": "the total primary storage space (in GiB) available to be used for this account",
+                    "name": "primarystorageavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total secondary storage space (in GiB) owned by account",
+                    "name": "secondarystoragetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total volume being used by this account",
+                    "name": "volumetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of projects the account can own",
+                    "name": "projectlimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total primary storage space (in GiB) the account can own",
+                    "name": "primarystoragelimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total primary storage space (in GiB) owned by account",
+                    "name": "primarystoragetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of public ip addresses available for this account to acquire",
+                    "name": "ipavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of public ip addresses this account can acquire",
+                    "name": "iplimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of networks owned by account",
+                    "name": "networktotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of vpcs the account can own",
+                    "name": "vpclimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of virtual machines available for this account to acquire",
+                    "name": "vmavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of the account",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "name of the Domain the account belongs too",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "true if the account requires cleanup",
+                    "name": "iscleanuprequired",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the total number of cpu cores the account can own",
+                    "name": "cpulimit",
+                    "type": "string"
+                },
+                {
+                    "description": "true if account is default, false otherwise",
+                    "name": "isdefault",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the total number of templates available to be created by this account",
+                    "name": "templateavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of networks available to be created for this account",
+                    "name": "networkavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of users associated with account",
+                    "name": "user",
+                    "response": [
+                        {
+                            "description": "the user state",
+                            "name": "state",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the user ID",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the user name",
+                            "name": "username",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the boolean value representing if the updating target is in caller's child domain",
+                            "name": "iscallerchilddomain",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "the user lastname",
+                            "name": "lastname",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the user firstname",
+                            "name": "firstname",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account name of the user",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the role",
+                            "name": "roleid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account type of the user",
+                            "name": "accounttype",
+                            "type": "short"
+                        },
+                        {
+                            "description": "the account ID of the user",
+                            "name": "accountid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the timezone user was created in",
+                            "name": "timezone",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the name of the role",
+                            "name": "rolename",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the date and time the user account was created",
+                            "name": "created",
+                            "type": "date"
+                        },
+                        {
+                            "description": "the domain ID of the user",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the secret key of the user",
+                            "name": "secretkey",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if user is default, false otherwise",
+                            "name": "isdefault",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "the api key of the user",
+                            "name": "apikey",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the user email address",
+                            "name": "email",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the type of the role",
+                            "name": "roletype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain name of the user",
+                            "name": "domain",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "the name of the role",
+                    "name": "rolename",
+                    "type": "string"
+                },
+                {
+                    "description": "the type of the role (Admin, ResourceAdmin, DomainAdmin, User)",
+                    "name": "roletype",
+                    "type": "string"
+                },
+                {
+                    "description": "the total volume available for this account",
+                    "name": "volumeavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of network traffic bytes sent",
+                    "name": "sentbytes",
+                    "type": "long"
+                },
+                {
+                    "description": "the list of acl groups that account belongs to",
+                    "name": "groups",
+                    "type": "list"
+                },
+                {
+                    "description": "the default zone of the account",
+                    "name": "defaultzoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of public ip addresses allocated for this account",
+                    "name": "iptotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the name of the account",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the total memory (in MB) owned by account",
+                    "name": "memorytotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total volume which can be used by this account",
+                    "name": "volumelimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the network domain",
+                    "name": "networkdomain",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of templates which have been created by this account",
+                    "name": "templatetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the id of the account",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the role",
+                    "name": "roleid",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of networks the account can own",
+                    "name": "networklimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total memory (in MB) the account can own",
+                    "name": "memorylimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of virtual machines deployed by this account",
+                    "name": "vmtotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of network traffic bytes received",
+                    "name": "receivedbytes",
+                    "type": "long"
+                },
+                {
+                    "description": "details for the account",
+                    "name": "accountdetails",
+                    "type": "map"
+                },
+                {
+                    "description": "the total number of templates which can be created by this account",
+                    "name": "templatelimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of snapshots available for this account",
+                    "name": "snapshotavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total secondary storage space (in GiB) available to be used for this account",
+                    "name": "secondarystorageavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of snapshots which can be stored by this account",
+                    "name": "snapshotlimit",
+                    "type": "string"
+                },
+                {
+                    "description": "account type (admin, domain-admin, user)",
+                    "name": "accounttype",
+                    "type": "short"
+                },
+                {
+                    "description": "the total number of cpu cores available to be created for this account",
+                    "name": "cpuavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of projects available for administration by this account",
+                    "name": "projectavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of virtual machines stopped for this account",
+                    "name": "vmstopped",
+                    "type": "integer"
+                },
+                {
+                    "description": "the total number of vpcs owned by account",
+                    "name": "vpctotal",
+                    "type": "long"
+                },
+                {
+                    "description": "id of the Domain the account belongs too",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of cpu cores owned by account",
+                    "name": "cputotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of virtual machines that can be deployed by this account",
+                    "name": "vmlimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of projects being administrated by this account",
+                    "name": "projecttotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of snapshots stored by this account",
+                    "name": "snapshottotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total secondary storage space (in GiB) the account can own",
+                    "name": "secondarystoragelimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total memory (in MB) available to be created for this account",
+                    "name": "memoryavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of vpcs available to be created for this account",
+                    "name": "vpcavailable",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Lists domains and provides detailed information for listed domains",
+            "isasync": false,
+            "name": "listDomains",
+            "params": [
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "List domain by domain name.",
+                    "length": 255,
+                    "name": "name",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "List domains by domain level.",
+                    "length": 255,
+                    "name": "level",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "List domain by domain ID.",
+                    "length": 255,
+                    "name": "id",
+                    "related": "listDomains,listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "If set to false, list only resources belonging to the command's caller; if set to true - list resources that the caller is authorized to see. Default value is false",
+                    "length": 255,
+                    "name": "listall",
+                    "required": false,
+                    "type": "boolean"
+                }
+            ],
+            "related": "listDomainChildren,listDomains",
+            "response": [
+                {
+                    "description": "the total number of projects available for administration by this domain",
+                    "name": "projectavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of vpcs the domain can own",
+                    "name": "vpclimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total primary storage space (in GiB) the domain can own",
+                    "name": "primarystoragelimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of templates available to be created by this domain",
+                    "name": "templateavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the domain",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of projects being administrated by this domain",
+                    "name": "projecttotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the state of the domain",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of public ip addresses available for this domain to acquire",
+                    "name": "ipavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of cpu cores the domain can own",
+                    "name": "cpulimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of virtual machines deployed by this domain",
+                    "name": "vmtotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of networks the domain can own",
+                    "name": "networklimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of snapshots which can be stored by this domain",
+                    "name": "snapshotlimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of templates which have been created by this domain",
+                    "name": "templatetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of vpcs available to be created for this domain",
+                    "name": "vpcavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total memory (in MB) the domain can own",
+                    "name": "memorylimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total primary storage space (in GiB) owned by domain",
+                    "name": "primarystoragetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total secondary storage space (in GiB) the domain can own",
+                    "name": "secondarystoragelimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of vpcs owned by domain",
+                    "name": "vpctotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total memory (in MB) owned by domain",
+                    "name": "memorytotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the name of the domain",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the total secondary storage space (in GiB) available to be used for this domain",
+                    "name": "secondarystorageavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the network domain",
+                    "name": "networkdomain",
+                    "type": "string"
+                },
+                {
+                    "description": "the level of the domain",
+                    "name": "level",
+                    "type": "integer"
+                },
+                {
+                    "description": "the total volume being used by this domain",
+                    "name": "volumetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of virtual machines that can be deployed by this domain",
+                    "name": "vmlimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total primary storage space (in GiB) available to be used for this domain",
+                    "name": "primarystorageavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain ID of the parent domain",
+                    "name": "parentdomainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the total volume available for this domain",
+                    "name": "volumeavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of networks owned by domain",
+                    "name": "networktotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total secondary storage space (in GiB) owned by domain",
+                    "name": "secondarystoragetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of virtual machines available for this domain to acquire",
+                    "name": "vmavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of projects the domain can own",
+                    "name": "projectlimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of public ip addresses this domain can acquire",
+                    "name": "iplimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of networks available to be created for this domain",
+                    "name": "networkavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of templates which can be created by this domain",
+                    "name": "templatelimit",
+                    "type": "string"
+                },
+                {
+                    "description": "whether the domain has one or more sub-domains",
+                    "name": "haschild",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the total memory (in MB) available to be created for this domain",
+                    "name": "memoryavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of snapshots stored by this domain",
+                    "name": "snapshottotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of cpu cores owned by domain",
+                    "name": "cputotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the path of the domain",
+                    "name": "path",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of cpu cores available to be created for this domain",
+                    "name": "cpuavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of snapshots available for this domain",
+                    "name": "snapshotavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of public ip addresses allocated for this domain",
+                    "name": "iptotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total volume which can be used by this domain",
+                    "name": "volumelimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain name of the parent domain",
+                    "name": "parentdomainname",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Updates a network",
+            "isasync": true,
+            "name": "updateNetwork",
+            "params": [
+                {
+                    "description": "network domain",
+                    "length": 255,
+                    "name": "networkdomain",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "Force update even if CIDR type is different",
+                    "length": 255,
+                    "name": "changecidr",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "an optional field, whether to the display the network to the end user or not.",
+                    "length": 255,
+                    "name": "displaynetwork",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "network offering ID",
+                    "length": 255,
+                    "name": "networkofferingid",
+                    "related": "listNetworkOfferings",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the ID of the network",
+                    "length": 255,
+                    "name": "id",
+                    "related": "createNetwork,updateNetwork,listSrxFirewallNetworks,updateNetwork,listBrocadeVcsDeviceNetworks,createNetwork,listNetworks,listNetscalerLoadBalancerNetworks,listF5LoadBalancerNetworks",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the new display text for the network",
+                    "length": 255,
+                    "name": "displaytext",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the new name for the network",
+                    "length": 255,
+                    "name": "name",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "CIDR for guest VMs, CloudStack allocates IPs to guest VMs only from this CIDR",
+                    "length": 255,
+                    "name": "guestvmcidr",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "an optional field, in case you want to set a custom id to the resource. Allowed to Root Admins only",
+                    "length": 255,
+                    "name": "customid",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "string"
+                }
+            ],
+            "related": "createNetwork,listSrxFirewallNetworks,updateNetwork,listBrocadeVcsDeviceNetworks,createNetwork,listNetworks,listNetscalerLoadBalancerNetworks,listF5LoadBalancerNetworks",
+            "response": [
+                {
+                    "description": "network offering id the network is created from",
+                    "name": "networkofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "availability of the network offering the network is created from",
+                    "name": "networkofferingavailability",
+                    "type": "string"
+                },
+                {
+                    "description": "the id of the network",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "The vlan of the network. This parameter is visible to ROOT admins only",
+                    "name": "vlan",
+                    "type": "string"
+                },
+                {
+                    "description": "name of the network offering the network is created from",
+                    "name": "networkofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "an optional field, whether to the display the network to the end user or not.",
+                    "name": "displaynetwork",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the domain id of the network owner",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "true if network is system, false otherwise",
+                    "name": "issystem",
+                    "type": "boolean"
+                },
+                {
+                    "description": "display text of the network offering the network is created from",
+                    "name": "networkofferingdisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the ipaddress",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the physical network id",
+                    "name": "physicalnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "VPC the network belongs to",
+                    "name": "vpcid",
+                    "type": "string"
+                },
+                {
+                    "description": "true if network offering is ip conserve mode enabled",
+                    "name": "networkofferingconservemode",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the second DNS for the network",
+                    "name": "dns2",
+                    "type": "string"
+                },
+                {
+                    "description": "the displaytext of the network",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "ACL Id associated with the VPC network",
+                    "name": "aclid",
+                    "type": "string"
+                },
+                {
+                    "description": "the network's netmask",
+                    "name": "netmask",
+                    "type": "string"
+                },
+                {
+                    "description": "zone id of the network",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the network",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the address",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "true if network is default, false otherwise",
+                    "name": "isdefault",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the network domain",
+                    "name": "networkdomain",
+                    "type": "string"
+                },
+                {
+                    "description": "true network requires restart",
+                    "name": "restartrequired",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the network's gateway",
+                    "name": "gateway",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of resource tags associated with network",
+                    "name": "tags",
+                    "response": [
+                        {
+                            "description": "tag value",
+                            "name": "value",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account associated with the tag",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "resource type",
+                            "name": "resourcetype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name where tag belongs to",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag key name",
+                            "name": "key",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the domain associated with the tag",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project id the tag belongs to",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "customer associated with the tag",
+                            "name": "customer",
+                            "type": "string"
+                        },
+                        {
+                            "description": "id of the resource",
+                            "name": "resourceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain associated with the tag",
+                            "name": "domain",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "true if network can span multiple zones",
+                    "name": "strechedl2subnet",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the type of the network",
+                    "name": "type",
+                    "type": "string"
+                },
+                {
+                    "description": "broadcast uri of the network. This parameter is visible to ROOT admins only",
+                    "name": "broadcasturi",
+                    "type": "string"
+                },
+                {
+                    "description": "the gateway of IPv6 network",
+                    "name": "ip6gateway",
+                    "type": "string"
+                },
+                {
+                    "description": "Cloudstack managed address space, all CloudStack managed VMs get IP address from CIDR",
+                    "name": "cidr",
+                    "type": "string"
+                },
+                {
+                    "description": "state of the network",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the owner of the network",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the cidr of IPv6 network",
+                    "name": "ip6cidr",
+                    "type": "string"
+                },
+                {
+                    "description": "the first DNS for the network",
+                    "name": "dns1",
+                    "type": "string"
+                },
+                {
+                    "description": "list networks that are persistent",
+                    "name": "ispersistent",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the domain name of the network owner",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the network CIDR of the guest network configured with IP reservation. It is the summation of CIDR and RESERVED_IP_RANGE",
+                    "name": "networkcidr",
+                    "type": "string"
+                },
+                {
+                    "description": "acl type - access type to the network",
+                    "name": "acltype",
+                    "type": "string"
+                },
+                {
+                    "description": "the traffic type of the network",
+                    "name": "traffictype",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the zone the network belongs to",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "related to what other network configuration",
+                    "name": "related",
+                    "type": "string"
+                },
+                {
+                    "description": "If a network is enabled for 'streched l2 subnet' then represents zones on which network currently spans",
+                    "name": "zonesnetworkspans",
+                    "type": "set"
+                },
+                {
+                    "description": "true if network supports specifying ip ranges, false otherwise",
+                    "name": "specifyipranges",
+                    "type": "boolean"
+                },
+                {
+                    "description": "Broadcast domain type of the network",
+                    "name": "broadcastdomaintype",
+                    "type": "string"
+                },
+                {
+                    "description": "the network's IP range not to be used by CloudStack guest VMs and can be used for non CloudStack purposes",
+                    "name": "reservediprange",
+                    "type": "string"
+                },
+                {
+                    "description": "true if users from subdomains can access the domain level network",
+                    "name": "subdomainaccess",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the list of services",
+                    "name": "service",
+                    "response": [
+                        {
+                            "description": "the service provider name",
+                            "name": "provider",
+                            "response": [
+                                {
+                                    "description": "the physical network this belongs to",
+                                    "name": "physicalnetworkid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "uuid of the network provider",
+                                    "name": "id",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "true if individual services can be enabled/disabled",
+                                    "name": "canenableindividualservice",
+                                    "type": "boolean"
+                                },
+                                {
+                                    "description": "the provider name",
+                                    "name": "name",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "services for this provider",
+                                    "name": "servicelist",
+                                    "type": "list"
+                                },
+                                {
+                                    "description": "the destination physical network",
+                                    "name": "destinationphysicalnetworkid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "state of the network provider",
+                                    "name": "state",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "list"
+                        },
+                        {
+                            "description": "the list of capabilities",
+                            "name": "capability",
+                            "response": [
+                                {
+                                    "description": "can this service capability value can be choosable while creatine network offerings",
+                                    "name": "canchooseservicecapability",
+                                    "type": "boolean"
+                                },
+                                {
+                                    "description": "the capability value",
+                                    "name": "value",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the capability name",
+                                    "name": "name",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "list"
+                        },
+                        {
+                            "description": "the service name",
+                            "name": "name",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "list networks available for vm deployment",
+                    "name": "canusefordeploy",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "List Usage Types",
+            "isasync": false,
+            "name": "listUsageTypes",
+            "params": [
+
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "usage type",
+                    "name": "usagetypeid",
+                    "type": "integer"
+                },
+                {
+                    "description": "description of usage type",
+                    "name": "description",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Lists all network ACLs",
+            "isasync": false,
+            "name": "listNetworkACLLists",
+            "params": [
+                {
+                    "description": "list resources by display flag; only ROOT admin is eligible to pass this parameter",
+                    "length": 255,
+                    "name": "fordisplay",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "boolean"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "list only resources belonging to the domain specified",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list resources by account. Must be used with the domainId parameter.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "Lists network ACL with the specified ID.",
+                    "length": 255,
+                    "name": "id",
+                    "related": "createNetworkACLList,listNetworkACLLists",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "If set to false, list only resources belonging to the command's caller; if set to true - list resources that the caller is authorized to see. Default value is false",
+                    "length": 255,
+                    "name": "listall",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "list network ACLs by specified name",
+                    "length": 255,
+                    "name": "name",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "list objects by project",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "listProjectAccounts,suspendProject,activateProject,updateProject,listProjects",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list network ACLs by network ID",
+                    "length": 255,
+                    "name": "networkid",
+                    "related": "createNetwork,listSrxFirewallNetworks,updateNetwork,listBrocadeVcsDeviceNetworks,createNetwork,listNetworks,listNetscalerLoadBalancerNetworks,listF5LoadBalancerNetworks",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list network ACLs by VPC ID",
+                    "length": 255,
+                    "name": "vpcid",
+                    "related": "restartVPC,listVPCs,createVPC,updateVPC,listVPCs,createVPC",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.",
+                    "length": 255,
+                    "name": "isrecursive",
+                    "required": false,
+                    "type": "boolean"
+                }
+            ],
+            "related": "createNetworkACLList",
+            "response": [
+                {
+                    "description": "Description of the ACL",
+                    "name": "description",
+                    "type": "string"
+                },
+                {
+                    "description": "the Name of the ACL",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "is ACL for display to the regular user",
+                    "name": "fordisplay",
+                    "type": "boolean"
+                },
+                {
+                    "description": "Id of the VPC this ACL is associated with",
+                    "name": "vpcid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the ACL",
+                    "name": "id",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Deletes a template from the system. All virtual machines using the deleted template will not be affected.",
+            "isasync": true,
+            "name": "deleteTemplate",
+            "params": [
+                {
+                    "description": "the ID of zone of the template",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones,listZones,createZone,updateZone",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the ID of the template",
+                    "length": 255,
+                    "name": "id",
+                    "related": "registerTemplate,listIsos,copyTemplate,registerTemplate,listTemplates,createTemplate,registerIso,registerIso,listIsos,createTemplate,copyIso",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                },
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Deletes a VPC",
+            "isasync": true,
+            "name": "deleteVPC",
+            "params": [
+                {
+                    "description": "the ID of the VPC",
+                    "length": 255,
+                    "name": "id",
+                    "related": "restartVPC,listVPCs,createVPC,updateVPC,listVPCs,createVPC",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                },
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Updates site to site vpn local gateway",
+            "isasync": true,
+            "name": "updateVpnGateway",
+            "params": [
+                {
+                    "description": "id of customer gateway",
+                    "length": 255,
+                    "name": "id",
+                    "related": "listVpnGateways,updateVpnGateway,createVpnGateway",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "an optional field, in case you want to set a custom id to the resource. Allowed to Root Admins only",
+                    "length": 255,
+                    "name": "customid",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "string"
+                },
+                {
+                    "description": "an optional field, whether to the display the vpn to the end user or not",
+                    "length": 255,
+                    "name": "fordisplay",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "boolean"
+                }
+            ],
+            "related": "listVpnGateways,createVpnGateway",
+            "response": [
+                {
+                    "description": "is vpn gateway for display to the regular user",
+                    "name": "fordisplay",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the owner",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the date and time the host was removed",
+                    "name": "removed",
+                    "type": "date"
+                },
+                {
+                    "description": "the vpn gateway ID",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain name of the owner",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the public IP address",
+                    "name": "publicip",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain id of the owner",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the vpc id of this gateway",
+                    "name": "vpcid",
+                    "type": "string"
+                }
+            ],
+            "since": "4.4"
+        },
+        {
+            "description": "Releases a dedicated guest vlan range to the system",
+            "isasync": true,
+            "name": "releaseDedicatedGuestVlanRange",
+            "params": [
+                {
+                    "description": "the ID of the dedicated guest vlan range",
+                    "length": 255,
+                    "name": "id",
+                    "related": "",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                },
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Deletes security group",
+            "isasync": false,
+            "name": "deleteSecurityGroup",
+            "params": [
+                {
+                    "description": "The ID of the security group. Mutually exclusive with name parameter",
+                    "length": 255,
+                    "name": "id",
+                    "related": "createSecurityGroup",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the account of the security group. Must be specified with domain ID",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the domain ID of account owning the security group",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "The ID of the security group. Mutually exclusive with id parameter",
+                    "length": 255,
+                    "name": "name",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the project of the security group",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "listProjectAccounts,suspendProject,activateProject,updateProject,listProjects",
+                    "required": false,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                },
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Attempts Migration of a VM to a different host or Root volume of the vm to a different storage pool",
+            "isasync": true,
+            "name": "migrateVirtualMachine",
+            "params": [
+                {
+                    "description": "Destination Host ID to migrate VM to. Required for live migrating a VM from host to host",
+                    "length": 255,
+                    "name": "hostid",
+                    "related": "addBaremetalHost,prepareHostForMaintenance,reconnectHost,addHost,cancelHostMaintenance",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the ID of the virtual machine",
+                    "length": 255,
+                    "name": "virtualmachineid",
+                    "related": "updateVMAffinityGroup,detachIso,resetSSHKeyForVirtualMachine,resetSSHKeyForVirtualMachine,migrateVirtualMachineWithVolume,attachIso,removeNicFromVirtualMachine,recoverVirtualMachine,migrateVirtualMachine,resetPasswordForVirtualMachine,revertToVMSnapshot,updateVMAffinityGroup,listVirtualMachines,rebootVirtualMachine,restoreVirtualMachine,destroyVirtualMachine,stopVirtualMachine,deployVirtualMachine,detachIso,deployVirtualMachine,updateVirtualMachine,revertToVMSnapshot,resetPasswordForVirtualMachine,startVirtualMachine,updateDefaultNicForVirtualMachine,startVirtualMachine,attachIso,listVirtualMachines,addNicToVirtualMachine,stopVirtualMachine,destroyVirtualMachine,removeNicFromVirtualMachine,changeServiceForVirtualMachine",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "Destination storage pool ID to migrate VM volumes to. Required for migrating the root disk volume",
+                    "length": 255,
+                    "name": "storageid",
+                    "related": "createStoragePool,findStoragePoolsForMigration,enableStorageMaintenance,cancelStorageMaintenance",
+                    "required": false,
+                    "type": "uuid"
+                }
+            ],
+            "related": "updateVMAffinityGroup,detachIso,resetSSHKeyForVirtualMachine,resetSSHKeyForVirtualMachine,migrateVirtualMachineWithVolume,attachIso,removeNicFromVirtualMachine,recoverVirtualMachine,resetPasswordForVirtualMachine,revertToVMSnapshot,updateVMAffinityGroup,listVirtualMachines,rebootVirtualMachine,restoreVirtualMachine,destroyVirtualMachine,stopVirtualMachine,deployVirtualMachine,detachIso,deployVirtualMachine,updateVirtualMachine,revertToVMSnapshot,resetPasswordForVirtualMachine,startVirtualMachine,updateDefaultNicForVirtualMachine,startVirtualMachine,attachIso,listVirtualMachines,addNicToVirtualMachine,stopVirtualMachine,destroyVirtualMachine,removeNicFromVirtualMachine,changeServiceForVirtualMachine",
+            "response": [
+                {
+                    "description": "user generated name. The name of the virtual machine is returned if no displayname exists.",
+                    "name": "displayname",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the service offering of the virtual machine",
+                    "name": "serviceofferingname",
+                    "type": "string"
+                },
+                {
+
+                },
+                {
+                    "description": "the vgpu type used by the virtual machine",
+                    "name": "vgpu",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the vm",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the ISO attached to the virtual machine",
+                    "name": "isoname",
+                    "type": "string"
+                },
+                {
+                    "description": "list of affinity groups associated with the virtual machine",
+                    "name": "affinitygroup",
+                    "response": [
+                        {
+                            "description": "the ID of the affinity group",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the name of the affinity group",
+                            "name": "name",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the type of the affinity group",
+                            "name": "type",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the description of the affinity group",
+                            "name": "description",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name of the affinity group",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project ID of the affinity group",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain name of the affinity group",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain ID of the affinity group",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account owning the affinity group",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "virtual machine IDs associated with this affinity group",
+                            "name": "virtualmachineIds",
+                            "type": "list"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "the ID of the virtual machine",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the amount of the vm's CPU currently used",
+                    "name": "cpuused",
+                    "type": "string"
+                },
+                {
+                    "description": "the internal memory thats free in vm",
+                    "name": "memoryintfreekbs",
+                    "type": "long"
+                },
+                {
+                    "description": "the number of cpu this virtual machine is running with",
+                    "name": "cpunumber",
+                    "type": "integer"
+                },
+                {
+                    "description": "the date when this virtual machine was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the name of the domain in which the virtual machine exists",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "Os type ID of the virtual machine",
+                    "name": "guestosid",
+                    "type": "string"
+                },
+                {
+                    "description": "the hypervisor on which the template runs",
+                    "name": "hypervisor",
+                    "type": "string"
+                },
+                {
+                    "description": "the read (bytes) of disk on the vm",
+                    "name": "diskkbsread",
+                    "type": "long"
+                },
+                {
+                    "description": "the memory used by the vm",
+                    "name": "memorykbs",
+                    "type": "long"
+                },
+                {
+                    "description": "the name of the disk offering of the virtual machine",
+                    "name": "diskofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "true if vm contains XS/VMWare tools inorder to support dynamic scaling of VM cpu/memory.",
+                    "name": "isdynamicallyscalable",
+                    "type": "boolean"
+                },
+                {
+                    "description": " an alternate display text of the template for the virtual machine",
+                    "name": "templatedisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "the speed of each cpu",
+                    "name": "cpuspeed",
+                    "type": "integer"
+                },
+                {
+                    "description": "the ID of the ISO attached to the virtual machine",
+                    "name": "isoid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the service offering of the virtual machine",
+                    "name": "serviceofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the template for the virtual machine. A -1 is returned if the virtual machine was created from an ISO file.",
+                    "name": "templateid",
+                    "type": "string"
+                },
+                {
+                    "description": "the write (bytes) of disk on the vm",
+                    "name": "diskkbswrite",
+                    "type": "long"
+                },
+                {
+                    "description": "instance name of the user vm; this parameter is returned to the ROOT admin only",
+                    "name": "instancename",
+                    "type": "string"
+                },
+                {
+                    "description": "the target memory in vm",
+                    "name": "memorytargetkbs",
+                    "type": "long"
+                },
+                {
+                    "description": "the virtual network for the service offering",
+                    "name": "forvirtualnetwork",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the user's name who deployed the virtual machine",
+                    "name": "username",
+                    "type": "string"
+                },
+                {
+                    "description": "public IP address id associated with vm via Static nat rule",
+                    "name": "publicip",
+                    "type": "string"
+                },
+                {
+                    "description": "the account associated with the virtual machine",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "an alternate display text of the ISO attached to the virtual machine",
+                    "name": "isodisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the domain in which the virtual machine exists",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the memory allocated for the virtual machine",
+                    "name": "memory",
+                    "type": "integer"
+                },
+                {
+                    "description": "the read (io) of disk on the vm",
+                    "name": "diskioread",
+                    "type": "long"
+                },
+                {
+                    "description": "the ID of the host for the virtual machine",
+                    "name": "hostid",
+                    "type": "string"
+                },
+                {
+                    "description": "Vm details in key/value pairs.",
+                    "name": "details",
+                    "type": "map"
+                },
+                {
+                    "description": "the name of the virtual machine",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "public IP address id associated with vm via Static nat rule",
+                    "name": "publicipid",
+                    "type": "string"
+                },
+                {
+                    "description": "device ID of the root volume",
+                    "name": "rootdeviceid",
+                    "type": "long"
+                },
+                {
+                    "description": "the group name of the virtual machine",
+                    "name": "group",
+                    "type": "string"
+                },
+                {
+                    "description": "list of security groups associated with the virtual machine",
+                    "name": "securitygroup",
+                    "response": [
+                        {
+                            "description": "the domain ID of the security group",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the number of virtualmachines associated with this securitygroup",
+                            "name": "virtualmachinecount",
+                            "type": "integer"
+                        },
+                        {
+                            "description": "the domain name of the security group",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project id of the group",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the name of the security group",
+                            "name": "name",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of virtualmachine ids associated with this securitygroup",
+                            "name": "virtualmachineids",
+                            "type": "set"
+                        },
+                        {
+                            "description": "the account owning the security group",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the security group",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name of the group",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of egress rules associated with the security group",
+                            "name": "egressrule",
+                            "response": [
+                                {
+                                    "description": "the protocol of the security group rule",
+                                    "name": "protocol",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the starting IP of the security group rule",
+                                    "name": "startport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "security group name",
+                                    "name": "securitygroupname",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the type of the ICMP message response",
+                                    "name": "icmptype",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the code for the ICMP message response",
+                                    "name": "icmpcode",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the id of the security group rule",
+                                    "name": "ruleid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the CIDR notation for the base IP address of the security group rule",
+                                    "name": "cidr",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the list of resource tags associated with the rule",
+                                    "name": "tags",
+                                    "response": [
+                                        {
+                                            "description": "customer associated with the tag",
+                                            "name": "customer",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the domain associated with the tag",
+                                            "name": "domain",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag key name",
+                                            "name": "key",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the ID of the domain associated with the tag",
+                                            "name": "domainid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project name where tag belongs to",
+                                            "name": "project",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the account associated with the tag",
+                                            "name": "account",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "id of the resource",
+                                            "name": "resourceid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "resource type",
+                                            "name": "resourcetype",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project id the tag belongs to",
+                                            "name": "projectid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag value",
+                                            "name": "value",
+                                            "type": "string"
+                                        }
+                                    ],
+                                    "type": "set"
+                                },
+                                {
+                                    "description": "the ending IP of the security group rule ",
+                                    "name": "endport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "account owning the security group rule",
+                                    "name": "account",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "set"
+                        },
+                        {
+                            "description": "the description of the security group",
+                            "name": "description",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of ingress rules associated with the security group",
+                            "name": "ingressrule",
+                            "response": [
+                                {
+                                    "description": "the list of resource tags associated with the rule",
+                                    "name": "tags",
+                                    "response": [
+                                        {
+                                            "description": "the account associated with the tag",
+                                            "name": "account",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag value",
+                                            "name": "value",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the ID of the domain associated with the tag",
+                                            "name": "domainid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "customer associated with the tag",
+                                            "name": "customer",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project name where tag belongs to",
+                                            "name": "project",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag key name",
+                                            "name": "key",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "resource type",
+                                            "name": "resourcetype",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "id of the resource",
+                                            "name": "resourceid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project id the tag belongs to",
+                                            "name": "projectid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the domain associated with the tag",
+                                            "name": "domain",
+                                            "type": "string"
+                                        }
+                                    ],
+                                    "type": "set"
+                                },
+                                {
+                                    "description": "account owning the security group rule",
+                                    "name": "account",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the starting IP of the security group rule",
+                                    "name": "startport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the ending IP of the security group rule ",
+                                    "name": "endport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the protocol of the security group rule",
+                                    "name": "protocol",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the type of the ICMP message response",
+                                    "name": "icmptype",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the code for the ICMP message response",
+                                    "name": "icmpcode",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "security group name",
+                                    "name": "securitygroupname",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the CIDR notation for the base IP address of the security group rule",
+                                    "name": "cidr",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the id of the security group rule",
+                                    "name": "ruleid",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "set"
+                        },
+                        {
+                            "description": "the list of resource tags associated with the rule",
+                            "name": "tags",
+                            "response": [
+                                {
+                                    "description": "id of the resource",
+                                    "name": "resourceid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the domain associated with the tag",
+                                    "name": "domain",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "tag key name",
+                                    "name": "key",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the account associated with the tag",
+                                    "name": "account",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the project id the tag belongs to",
+                                    "name": "projectid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "customer associated with the tag",
+                                    "name": "customer",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "resource type",
+                                    "name": "resourcetype",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "tag value",
+                                    "name": "value",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the project name where tag belongs to",
+                                    "name": "project",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the ID of the domain associated with the tag",
+                                    "name": "domainid",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "set"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "State of the Service from LB rule",
+                    "name": "servicestate",
+                    "type": "string"
+                },
+                {
+                    "description": "ssh key-pair",
+                    "name": "keypair",
+                    "type": "string"
+                },
+                {
+                    "description": "the group ID of the virtual machine",
+                    "name": "groupid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the availablility zone for the virtual machine",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the availability zone for the virtual machine",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "true if the password rest feature is enabled, false otherwise",
+                    "name": "passwordenabled",
+                    "type": "boolean"
+                },
+                {
+                    "description": "OS type id of the vm",
+                    "name": "ostypeid",
+                    "type": "long"
+                },
+                {
+                    "description": "the name of the host for the virtual machine",
+                    "name": "hostname",
+                    "type": "string"
+                },
+                {
+                    "description": "the password (if exists) of the virtual machine",
+                    "name": "password",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of nics associated with vm",
+                    "name": "nic",
+                    "response": [
+                        {
+                            "description": "the gateway of IPv6 network",
+                            "name": "ip6gateway",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the gateway of the nic",
+                            "name": "gateway",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ip address of the nic",
+                            "name": "ipaddress",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if nic is default, false otherwise",
+                            "name": "macaddress",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the vm to which the nic belongs",
+                            "name": "virtualmachineid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the Secondary ipv4 addr of nic",
+                            "name": "secondaryip",
+                            "type": "list"
+                        },
+                        {
+                            "description": "the name of the corresponding network",
+                            "name": "networkname",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the netmask of the nic",
+                            "name": "netmask",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the NSX Logical Switch Port (if NSX based), null otherwise",
+                            "name": "nsxlogicalswitchport",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if nic is default, false otherwise",
+                            "name": "isdefault",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "device id for the network when plugged into the virtual machine",
+                            "name": "deviceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the isolation uri of the nic",
+                            "name": "isolationuri",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the nic",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the traffic type of the nic",
+                            "name": "traffictype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the type of the nic",
+                            "name": "type",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the IPv6 address of network",
+                            "name": "ip6address",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the cidr of IPv6 network",
+                            "name": "ip6cidr",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the corresponding network",
+                            "name": "networkid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the broadcast uri of the nic",
+                            "name": "broadcasturi",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the NSX Logical Switch (if NSX based), null otherwise",
+                            "name": "nsxlogicalswitch",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "the write (io) of disk on the vm",
+                    "name": "diskiowrite",
+                    "type": "long"
+                },
+                {
+                    "description": "device type of the root volume",
+                    "name": "rootdevicetype",
+                    "type": "string"
+                },
+                {
+                    "description": "the incoming network traffic on the vm",
+                    "name": "networkkbsread",
+                    "type": "long"
+                },
+                {
+                    "description": "the state of the virtual machine",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the disk offering of the virtual machine",
+                    "name": "diskofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "the outgoing network traffic on the host",
+                    "name": "networkkbswrite",
+                    "type": "long"
+                },
+                {
+                    "description": "the project id of the vm",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "an optional field whether to the display the vm to the end user or not.",
+                    "name": "displayvm",
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if high-availability is enabled, false otherwise",
+                    "name": "haenable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the name of the template for the virtual machine",
+                    "name": "templatename",
+                    "type": "string"
+                },
+                {
+                    "description": "the user's ID who deployed the virtual machine",
+                    "name": "userid",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Creates a template of a virtual machine. The virtual machine must be in a STOPPED state. A template created from this command is automatically designated as a private template visible to the account that created it.",
+            "isasync": true,
+            "name": "createTemplate",
+            "params": [
+                {
+                    "description": "32 or 64 bit",
+                    "length": 255,
+                    "name": "bits",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "Optional, VM ID. If this presents, it is going to create a baremetal template for VM this ID refers to. This is only for VM whose hypervisor type is BareMetal",
+                    "length": 255,
+                    "name": "virtualmachineid",
+                    "related": "updateVMAffinityGroup,detachIso,resetSSHKeyForVirtualMachine,resetSSHKeyForVirtualMachine,migrateVirtualMachineWithVolume,attachIso,removeNicFromVirtualMachine,recoverVirtualMachine,resetPasswordForVirtualMachine,revertToVMSnapshot,updateVMAffinityGroup,listVirtualMachines,rebootVirtualMachine,restoreVirtualMachine,destroyVirtualMachine,stopVirtualMachine,deployVirtualMachine,detachIso,deployVirtualMachine,updateVirtualMachine,revertToVMSnapshot,resetPasswordForVirtualMachine,startVirtualMachine,updateDefaultNicForVirtualMachine,startVirtualMachine,attachIso,listVirtualMachines,addNicToVirtualMachine,stopVirtualMachine,destroyVirtualMachine,removeNicFromVirtualMachine,changeServiceForVirtualMachine",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "true if the template supports the password reset feature; default is false",
+                    "length": 255,
+                    "name": "passwordenabled",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "create template for the project",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "listProjectAccounts,suspendProject,activateProject,updateProject,listProjects",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "Optional, only for baremetal hypervisor. The directory name where template stored on CIFS server",
+                    "length": 2048,
+                    "name": "url",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the template",
+                    "length": 255,
+                    "name": "name",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the snapshot the template is being created from. Either this parameter, or volumeId has to be passed in",
+                    "length": 255,
+                    "name": "snapshotid",
+                    "related": "revertSnapshot",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "true if the template requres HVM, false otherwise",
+                    "length": 255,
+                    "name": "requireshvm",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "the tag for this template.",
+                    "length": 255,
+                    "name": "templatetag",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "true if template contains XS/VMWare tools inorder to support dynamic scaling of VM cpu/memory",
+                    "length": 255,
+                    "name": "isdynamicallyscalable",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "Template details in key/value pairs using format details[i].keyname=keyvalue. Example: details[0].hypervisortoolsversion=xenserver61",
+                    "length": 255,
+                    "name": "details",
+                    "required": false,
+                    "type": "map"
+                },
+                {
+                    "description": "the ID of the OS Type that best represents the OS of this template.",
+                    "length": 255,
+                    "name": "ostypeid",
+                    "related": "addGuestOs,listOsTypes",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "true if this template is a featured template, false otherwise",
+                    "length": 255,
+                    "name": "isfeatured",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "the display text of the template. This is usually used for display purposes.",
+                    "length": 4096,
+                    "name": "displaytext",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "true if this template is a public template, false otherwise",
+                    "length": 255,
+                    "name": "ispublic",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "the ID of the disk volume the template is being created from. Either this parameter, or snapshotId has to be passed in",
+                    "length": 255,
+                    "name": "volumeid",
+                    "related": "listVolumes,attachVolume,updateVolume,migrateVolume,createVolume,listVolumes,uploadVolume,attachVolume,detachVolume,resizeVolume,migrateVolume,createVolume",
+                    "required": false,
+                    "type": "uuid"
+                }
+            ],
+            "related": "registerTemplate,listIsos,copyTemplate,registerTemplate,listTemplates,registerIso,registerIso,listIsos,createTemplate,copyIso",
+            "response": [
+                {
+                    "description": "the date this template was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the size of the template",
+                    "name": "size",
+                    "type": "long"
+                },
+                {
+                    "description": "the account name to which the template belongs",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "true if the reset password feature is enabled, false otherwise",
+                    "name": "passwordenabled",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the template ID",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the template ID of the parent template if present",
+                    "name": "sourcetemplateid",
+                    "type": "string"
+                },
+                {
+                    "description": "the status of the template",
+                    "name": "status",
+                    "type": "string"
+                },
+                {
+                    "description": "the template display text",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "the type of the template",
+                    "name": "templatetype",
+                    "type": "string"
+                },
+                {
+                    "description": "true if the template is managed across all Zones, false otherwise",
+                    "name": "crossZones",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the name of the OS type for this template.",
+                    "name": "ostypename",
+                    "type": "string"
+                },
+                {
+                    "description": "the account id to which the template belongs",
+                    "name": "accountid",
+                    "type": "string"
+                },
+                {
+                    "description": "the format of the template.",
+                    "name": "format",
+                    "type": "imageformat"
+                },
+                {
+                    "description": "the date this template was removed",
+                    "name": "removed",
+                    "type": "date"
+                },
+                {
+                    "description": "the hypervisor on which the template runs",
+                    "name": "hypervisor",
+                    "type": "string"
+                },
+                {
+                    "description": "true if this template is a public template, false otherwise",
+                    "name": "ispublic",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the name of the domain to which the template belongs",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the secondary storage host for the template",
+                    "name": "hostid",
+                    "type": "string"
+                },
+                {
+                    "description": "checksum of the template",
+                    "name": "checksum",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the template",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the template name",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "true if this template is a featured template, false otherwise",
+                    "name": "isfeatured",
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if the template is extractable, false otherwise",
+                    "name": "isextractable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if the ISO is bootable, false otherwise",
+                    "name": "bootable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the ID of the domain to which the template belongs",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the secondary storage host for the template",
+                    "name": "hostname",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the template",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "true if template is sshkey enabled, false otherwise",
+                    "name": "sshkeyenabled",
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if the template is ready to be deployed from, false otherwise.",
+                    "name": "isready",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the ID of the OS type for this template.",
+                    "name": "ostypeid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the zone for this template",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "true if template contains XS/VMWare tools inorder to support dynamic scaling of VM cpu/memory",
+                    "name": "isdynamicallyscalable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "additional key/value details tied with template",
+                    "name": "details",
+                    "type": "map"
+                },
+                {
+                    "description": "the tag of this template",
+                    "name": "templatetag",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the zone for this template",
+                    "name": "zoneid",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "list baremetal rack configuration",
+            "isasync": false,
+            "name": "listBaremetalRct",
+            "params": [
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                }
+            ],
+            "related": "addBaremetalRct",
+            "response": [
+                {
+                    "description": "url",
+                    "name": "url",
+                    "type": "string"
+                },
+                {
+                    "description": "id of rct",
+                    "name": "id",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Lists dedicated clusters.",
+            "isasync": false,
+            "name": "listDedicatedClusters",
+            "params": [
+                {
+                    "description": "list dedicated clusters by affinity group",
+                    "length": 255,
+                    "name": "affinitygroupid",
+                    "related": "",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "the name of the account associated with the cluster. Must be used with domainId.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the domain associated with the cluster",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "the ID of the cluster",
+                    "length": 255,
+                    "name": "clusterid",
+                    "related": "addCluster,updateCluster",
+                    "required": false,
+                    "type": "uuid"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the ID of the dedicated resource",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the Account ID of the cluster",
+                    "name": "accountid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the cluster",
+                    "name": "clusterid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the cluster",
+                    "name": "clustername",
+                    "type": "string"
+                },
+                {
+                    "description": "the Dedication Affinity Group ID of the cluster",
+                    "name": "affinitygroupid",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain ID of the cluster",
+                    "name": "domainid",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Uploads a custom certificate for the console proxy VMs to use for SSL. Can be used to upload a single certificate signed by a known CA. Can also be used, through multiple calls, to upload a chain of certificates from CA to the custom certificate itself.",
+            "isasync": true,
+            "name": "uploadCustomCertificate",
+            "params": [
+                {
+                    "description": "An integer providing the location in a chain that the certificate will hold. Usually, this can be left empty. When creating a chain, the top level certificate should have an ID of 1, with each step in the chain incrementing by one. Example, CA with id = 1, Intermediate CA with id = 2, Site certificate with ID = 3",
+                    "length": 255,
+                    "name": "id",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "The private key for the attached certificate.",
+                    "length": 65535,
+                    "name": "privatekey",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "DNS domain suffix that the certificate is granted for.",
+                    "length": 255,
+                    "name": "domainsuffix",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "The certificate to be uploaded.",
+                    "length": 65535,
+                    "name": "certificate",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "A name / alias for the certificate.",
+                    "length": 255,
+                    "name": "name",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "message of the certificate upload operation",
+                    "name": "message",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Delete site to site vpn customer gateway",
+            "isasync": true,
+            "name": "deleteVpnCustomerGateway",
+            "params": [
+                {
+                    "description": "id of customer gateway",
+                    "length": 255,
+                    "name": "id",
+                    "related": "createVpnCustomerGateway,listVpnCustomerGateways",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                },
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Enables out-of-band management for a cluster",
+            "isasync": true,
+            "name": "enableOutOfBandManagementForCluster",
+            "params": [
+                {
+                    "description": "the ID of the cluster",
+                    "length": 255,
+                    "name": "clusterid",
+                    "related": "addCluster,updateCluster",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "disableOutOfBandManagementForCluster,disableOutOfBandManagementForHost,enableOutOfBandManagementForHost",
+            "response": [
+                {
+                    "description": "the out-of-band management interface address",
+                    "name": "address",
+                    "type": "string"
+                },
+                {
+                    "description": "the out-of-band management driver for the host",
+                    "name": "driver",
+                    "type": "string"
+                },
+                {
+                    "description": "true if out-of-band management is enabled for the host",
+                    "name": "enabled",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the out-of-band management interface username",
+                    "name": "username",
+                    "type": "string"
+                },
+                {
+                    "description": "the out-of-band management interface port",
+                    "name": "port",
+                    "type": "string"
+                },
+                {
+                    "description": "the out-of-band management interface password",
+                    "name": "password",
+                    "type": "string"
+                },
+                {
+                    "description": "the out-of-band management action (if issued)",
+                    "name": "action",
+                    "type": "string"
+                },
+                {
+                    "description": "the operation result",
+                    "name": "status",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the ID of the host",
+                    "name": "hostid",
+                    "type": "string"
+                },
+                {
+                    "description": "the out-of-band management interface powerState of the host",
+                    "name": "powerstate",
+                    "type": "powerstate"
+                },
+                {
+                    "description": "the operation result description",
+                    "name": "description",
+                    "type": "string"
+                }
+            ],
+            "since": "4.9.0"
+        },
+        {
+            "description": "Lists all port forwarding rules for an IP address.",
+            "isasync": false,
+            "name": "listPortForwardingRules",
+            "params": [
+                {
+                    "description": "list only resources belonging to the domain specified",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list port forwarding rules for certain network",
+                    "length": 255,
+                    "name": "networkid",
+                    "related": "createNetwork,listSrxFirewallNetworks,updateNetwork,listBrocadeVcsDeviceNetworks,createNetwork,listNetworks,listNetscalerLoadBalancerNetworks,listF5LoadBalancerNetworks",
+                    "required": false,
+                    "since": "4.3",
+                    "type": "uuid"
+                },
+                {
+                    "description": "list objects by project",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "listProjectAccounts,suspendProject,activateProject,updateProject,listProjects",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.",
+                    "length": 255,
+                    "name": "isrecursive",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "list resources by account. Must be used with the domainId parameter.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "Lists rule with the specified ID.",
+                    "length": 255,
+                    "name": "id",
+                    "related": "updatePortForwardingRule,listPortForwardingRules",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "list resources by display flag; only ROOT admin is eligible to pass this parameter",
+                    "length": 255,
+                    "name": "fordisplay",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "boolean"
+                },
+                {
+                    "description": "List resources by tags (key/value pairs)",
+                    "length": 255,
+                    "name": "tags",
+                    "required": false,
+                    "type": "map"
+                },
+                {
+                    "description": "the ID of IP address of the port forwarding services",
+                    "length": 255,
+                    "name": "ipaddressid",
+                    "related": "associateIpAddress,updateIpAddress,associateIpAddress,listPublicIpAddresses",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "If set to false, list only resources belonging to the command's caller; if set to true - list resources that the caller is authorized to see. Default value is false",
+                    "length": 255,
+                    "name": "listall",
+                    "required": false,
+                    "type": "boolean"
+                }
+            ],
+            "related": "updatePortForwardingRule",
+            "response": [
+                {
+                    "description": "the protocol of the port forwarding rule",
+                    "name": "protocol",
+                    "type": "string"
+                },
+                {
+                    "description": "the ending port of port forwarding rule's private port range",
+                    "name": "privateendport",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of the rule",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the cidr list to forward traffic from",
+                    "name": "cidrlist",
+                    "type": "string"
+                },
+                {
+                    "description": "the id of the guest network the port forwarding rule belongs to",
+                    "name": "networkid",
+                    "type": "string"
+                },
+                {
+                    "description": "the VM name for the port forwarding rule",
+                    "name": "virtualmachinename",
+                    "type": "string"
+                },
+                {
+                    "description": "the vm ip address for the port forwarding rule",
+                    "name": "vmguestip",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of resource tags associated with the rule",
+                    "name": "tags",
+                    "response": [
+                        {
+                            "description": "the domain associated with the tag",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "customer associated with the tag",
+                            "name": "customer",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account associated with the tag",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the domain associated with the tag",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "resource type",
+                            "name": "resourcetype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name where tag belongs to",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag key name",
+                            "name": "key",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag value",
+                            "name": "value",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project id the tag belongs to",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "id of the resource",
+                            "name": "resourceid",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "the VM display name for the port forwarding rule",
+                    "name": "virtualmachinedisplayname",
+                    "type": "string"
+                },
+                {
+                    "description": "the public ip address id for the port forwarding rule",
+                    "name": "ipaddressid",
+                    "type": "string"
+                },
+                {
+                    "description": "is firewall for display to the regular user",
+                    "name": "fordisplay",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the VM ID for the port forwarding rule",
+                    "name": "virtualmachineid",
+                    "type": "string"
+                },
+                {
+                    "description": "the public ip address for the port forwarding rule",
+                    "name": "ipaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the ending port of port forwarding rule's private port range",
+                    "name": "publicendport",
+                    "type": "string"
+                },
+                {
+                    "description": "the starting port of port forwarding rule's private port range",
+                    "name": "privateport",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the port forwarding rule",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the starting port of port forwarding rule's public port range",
+                    "name": "publicport",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Updates a template visibility permissions. A public template is visible to all accounts within the same domain. A private template is visible only to the owner of the template. A priviledged template is a private template with account permissions added. Only accounts specified under the template permissions are visible to them.",
+            "isasync": false,
+            "name": "updateTemplatePermissions",
+            "params": [
+                {
+                    "description": "true if the template/iso is extractable, false other wise. Can be set only by root admin",
+                    "length": 255,
+                    "name": "isextractable",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "a comma delimited list of accounts. If specified, \"op\" parameter has to be passed in.",
+                    "length": 255,
+                    "name": "accounts",
+                    "required": false,
+                    "type": "list"
+                },
+                {
+                    "description": "permission operator (add, remove, reset)",
+                    "length": 255,
+                    "name": "op",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "true for featured template/iso, false otherwise",
+                    "length": 255,
+                    "name": "isfeatured",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "true for public template/iso, false for private templates/isos",
+                    "length": 255,
+                    "name": "ispublic",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "a comma delimited list of projects. If specified, \"op\" parameter has to be passed in.",
+                    "length": 255,
+                    "name": "projectids",
+                    "related": "listProjectAccounts,suspendProject,activateProject,updateProject,listProjects",
+                    "required": false,
+                    "type": "list"
+                },
+                {
+                    "description": "the template ID",
+                    "length": 255,
+                    "name": "id",
+                    "related": "registerTemplate,listIsos,copyTemplate,registerTemplate,listTemplates,registerIso,registerIso,listIsos,createTemplate,copyIso",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "List traffic monitor Hosts.",
+            "isasync": false,
+            "name": "listTrafficMonitors",
+            "params": [
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "zone Id",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones,listZones,createZone,updateZone",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                }
+            ],
+            "related": "addTrafficMonitor",
+            "response": [
+                {
+                    "description": "the timeout (in seconds) for requests to the external firewall",
+                    "name": "timeout",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the external firewall",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the number of times to retry requests to the external firewall",
+                    "name": "numretries",
+                    "type": "string"
+                },
+                {
+                    "description": "the management IP address of the external firewall",
+                    "name": "ipaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the zone ID of the external firewall",
+                    "name": "zoneid",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Resets the password for virtual machine. The virtual machine must be in a \"Stopped\" state and the template must already support this feature for this command to take effect. [async]",
+            "isasync": true,
+            "name": "resetPasswordForVirtualMachine",
+            "params": [
+                {
+                    "description": "The ID of the virtual machine",
+                    "length": 255,
+                    "name": "id",
+                    "related": "updateVMAffinityGroup,detachIso,resetSSHKeyForVirtualMachine,resetSSHKeyForVirtualMachine,migrateVirtualMachineWithVolume,attachIso,removeNicFromVirtualMachine,recoverVirtualMachine,resetPasswordForVirtualMachine,revertToVMSnapshot,updateVMAffinityGroup,listVirtualMachines,rebootVirtualMachine,restoreVirtualMachine,destroyVirtualMachine,stopVirtualMachine,deployVirtualMachine,detachIso,deployVirtualMachine,updateVirtualMachine,revertToVMSnapshot,resetPasswordForVirtualMachine,startVirtualMachine,updateDefaultNicForVirtualMachine,startVirtualMachine,attachIso,listVirtualMachines,addNicToVirtualMachine,stopVirtualMachine,destroyVirtualMachine,removeNicFromVirtualMachine,changeServiceForVirtualMachine",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "updateVMAffinityGroup,detachIso,resetSSHKeyForVirtualMachine,resetSSHKeyForVirtualMachine,migrateVirtualMachineWithVolume,attachIso,removeNicFromVirtualMachine,recoverVirtualMachine,revertToVMSnapshot,updateVMAffinityGroup,listVirtualMachines,rebootVirtualMachine,restoreVirtualMachine,destroyVirtualMachine,stopVirtualMachine,deployVirtualMachine,detachIso,deployVirtualMachine,updateVirtualMachine,revertToVMSnapshot,resetPasswordForVirtualMachine,startVirtualMachine,updateDefaultNicForVirtualMachine,startVirtualMachine,attachIso,listVirtualMachines,addNicToVirtualMachine,stopVirtualMachine,destroyVirtualMachine,removeNicFromVirtualMachine,changeServiceForVirtualMachine",
+            "response": [
+                {
+                    "description": "the user's ID who deployed the virtual machine",
+                    "name": "userid",
+                    "type": "string"
+                },
+                {
+                    "description": "the memory used by the vm",
+                    "name": "memorykbs",
+                    "type": "long"
+                },
+                {
+                    "description": "instance name of the user vm; this parameter is returned to the ROOT admin only",
+                    "name": "instancename",
+                    "type": "string"
+                },
+                {
+                    "description": "State of the Service from LB rule",
+                    "name": "servicestate",
+                    "type": "string"
+                },
+                {
+
+                },
+                {
+                    "description": "the name of the ISO attached to the virtual machine",
+                    "name": "isoname",
+                    "type": "string"
+                },
+                {
+                    "description": "the password (if exists) of the virtual machine",
+                    "name": "password",
+                    "type": "string"
+                },
+                {
+                    "description": "the speed of each cpu",
+                    "name": "cpuspeed",
+                    "type": "integer"
+                },
+                {
+                    "description": "the amount of the vm's CPU currently used",
+                    "name": "cpuused",
+                    "type": "string"
+                },
+                {
+                    "description": "OS type id of the vm",
+                    "name": "ostypeid",
+                    "type": "long"
+                },
+                {
+                    "description": "true if high-availability is enabled, false otherwise",
+                    "name": "haenable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "Os type ID of the virtual machine",
+                    "name": "guestosid",
+                    "type": "string"
+                },
+                {
+                    "description": "the hypervisor on which the template runs",
+                    "name": "hypervisor",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the virtual machine",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the vm",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the availablility zone for the virtual machine",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the write (bytes) of disk on the vm",
+                    "name": "diskkbswrite",
+                    "type": "long"
+                },
+                {
+                    "description": "the vgpu type used by the virtual machine",
+                    "name": "vgpu",
+                    "type": "string"
+                },
+                {
+                    "description": "true if the password rest feature is enabled, false otherwise",
+                    "name": "passwordenabled",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the date when this virtual machine was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the read (io) of disk on the vm",
+                    "name": "diskioread",
+                    "type": "long"
+                },
+                {
+                    "description": "the name of the disk offering of the virtual machine",
+                    "name": "diskofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the disk offering of the virtual machine",
+                    "name": "diskofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "the internal memory thats free in vm",
+                    "name": "memoryintfreekbs",
+                    "type": "long"
+                },
+                {
+                    "description": "the target memory in vm",
+                    "name": "memorytargetkbs",
+                    "type": "long"
+                },
+                {
+                    "description": "an optional field whether to the display the vm to the end user or not.",
+                    "name": "displayvm",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the project id of the vm",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the availability zone for the virtual machine",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": " an alternate display text of the template for the virtual machine",
+                    "name": "templatedisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the virtual machine",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the outgoing network traffic on the host",
+                    "name": "networkkbswrite",
+                    "type": "long"
+                },
+                {
+                    "description": "device type of the root volume",
+                    "name": "rootdevicetype",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the host for the virtual machine",
+                    "name": "hostid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the service offering of the virtual machine",
+                    "name": "serviceofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "the read (bytes) of disk on the vm",
+                    "name": "diskkbsread",
+                    "type": "long"
+                },
+                {
+                    "description": "the write (io) of disk on the vm",
+                    "name": "diskiowrite",
+                    "type": "long"
+                },
+                {
+                    "description": "the number of cpu this virtual machine is running with",
+                    "name": "cpunumber",
+                    "type": "integer"
+                },
+                {
+                    "description": "the name of the domain in which the virtual machine exists",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "true if vm contains XS/VMWare tools inorder to support dynamic scaling of VM cpu/memory.",
+                    "name": "isdynamicallyscalable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the state of the virtual machine",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "Vm details in key/value pairs.",
+                    "name": "details",
+                    "type": "map"
+                },
+                {
+                    "description": "the ID of the ISO attached to the virtual machine",
+                    "name": "isoid",
+                    "type": "string"
+                },
+                {
+                    "description": "the virtual network for the service offering",
+                    "name": "forvirtualnetwork",
+                    "type": "boolean"
+                },
+                {
+                    "description": "ssh key-pair",
+                    "name": "keypair",
+                    "type": "string"
+                },
+                {
+                    "description": "the group name of the virtual machine",
+                    "name": "group",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the host for the virtual machine",
+                    "name": "hostname",
+                    "type": "string"
+                },
+                {
+                    "description": "the memory allocated for the virtual machine",
+                    "name": "memory",
+                    "type": "integer"
+                },
+                {
+                    "description": "the group ID of the virtual machine",
+                    "name": "groupid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the template for the virtual machine",
+                    "name": "templatename",
+                    "type": "string"
+                },
+                {
+                    "description": "an alternate display text of the ISO attached to the virtual machine",
+                    "name": "isodisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "the incoming network traffic on the vm",
+                    "name": "networkkbsread",
+                    "type": "long"
+                },
+                {
+                    "description": "the list of nics associated with vm",
+                    "name": "nic",
+                    "response": [
+                        {
+                            "description": "the gateway of IPv6 network",
+                            "name": "ip6gateway",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the name of the corresponding network",
+                            "name": "networkname",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if nic is default, false otherwise",
+                            "name": "macaddress",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the traffic type of the nic",
+                            "name": "traffictype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the IPv6 address of network",
+                            "name": "ip6address",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the type of the nic",
+                            "name": "type",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the netmask of the nic",
+                            "name": "netmask",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the NSX Logical Switch Port (if NSX based), null otherwise",
+                            "name": "nsxlogicalswitchport",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the vm to which the nic belongs",
+                            "name": "virtualmachineid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the corresponding network",
+                            "name": "networkid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the nic",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the isolation uri of the nic",
+                            "name": "isolationuri",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ip address of the nic",
+                            "name": "ipaddress",
+                            "type": "string"
+                        },
+                        {
+                            "description": "device id for the network when plugged into the virtual machine",
+                            "name": "deviceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the NSX Logical Switch (if NSX based), null otherwise",
+                            "name": "nsxlogicalswitch",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the gateway of the nic",
+                            "name": "gateway",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the Secondary ipv4 addr of nic",
+                            "name": "secondaryip",
+                            "type": "list"
+                        },
+                        {
+                            "description": "the broadcast uri of the nic",
+                            "name": "broadcasturi",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if nic is default, false otherwise",
+                            "name": "isdefault",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "the cidr of IPv6 network",
+                            "name": "ip6cidr",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "list of affinity groups associated with the virtual machine",
+                    "name": "affinitygroup",
+                    "response": [
+                        {
+                            "description": "the project ID of the affinity group",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain ID of the affinity group",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the name of the affinity group",
+                            "name": "name",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the affinity group",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the type of the affinity group",
+                            "name": "type",
+                            "type": "string"
+                        },
+                        {
+                            "description": "virtual machine IDs associated with this affinity group",
+                            "name": "virtualmachineIds",
+                            "type": "list"
+                        },
+                        {
+                            "description": "the project name of the affinity group",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain name of the affinity group",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the description of the affinity group",
+                            "name": "description",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account owning the affinity group",
+                            "name": "account",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "the user's name who deployed the virtual machine",
+                    "name": "username",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the service offering of the virtual machine",
+                    "name": "serviceofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "user generated name. The name of the virtual machine is returned if no displayname exists.",
+                    "name": "displayname",
+                    "type": "string"
+                },
+                {
+                    "description": "the account associated with the virtual machine",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "device ID of the root volume",
+                    "name": "rootdeviceid",
+                    "type": "long"
+                },
+                {
+                    "description": "the ID of the template for the virtual machine. A -1 is returned if the virtual machine was created from an ISO file.",
+                    "name": "templateid",
+                    "type": "string"
+                },
+                {
+                    "description": "list of security groups associated with the virtual machine",
+                    "name": "securitygroup",
+                    "response": [
+                        {
+                            "description": "the domain ID of the security group",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the number of virtualmachines associated with this securitygroup",
+                            "name": "virtualmachinecount",
+                            "type": "integer"
+                        },
+                        {
+                            "description": "the list of ingress rules associated with the security group",
+                            "name": "ingressrule",
+                            "response": [
+                                {
+                                    "description": "the ending IP of the security group rule ",
+                                    "name": "endport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the list of resource tags associated with the rule",
+                                    "name": "tags",
+                                    "response": [
+                                        {
+                                            "description": "tag value",
+                                            "name": "value",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the account associated with the tag",
+                                            "name": "account",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "resource type",
+                                            "name": "resourcetype",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project id the tag belongs to",
+                                            "name": "projectid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the ID of the domain associated with the tag",
+                                            "name": "domainid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project name where tag belongs to",
+                                            "name": "project",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "customer associated with the tag",
+                                            "name": "customer",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the domain associated with the tag",
+                                            "name": "domain",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "id of the resource",
+                                            "name": "resourceid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag key name",
+                                            "name": "key",
+                                            "type": "string"
+                                        }
+                                    ],
+                                    "type": "set"
+                                },
+                                {
+                                    "description": "the code for the ICMP message response",
+                                    "name": "icmpcode",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "security group name",
+                                    "name": "securitygroupname",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the CIDR notation for the base IP address of the security group rule",
+                                    "name": "cidr",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the id of the security group rule",
+                                    "name": "ruleid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the protocol of the security group rule",
+                                    "name": "protocol",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the type of the ICMP message response",
+                                    "name": "icmptype",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the starting IP of the security group rule",
+                                    "name": "startport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "account owning the security group rule",
+                                    "name": "account",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "set"
+                        },
+                        {
+                            "description": "the list of virtualmachine ids associated with this securitygroup",
+                            "name": "virtualmachineids",
+                            "type": "set"
+                        },
+                        {
+                            "description": "the description of the security group",
+                            "name": "description",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project id of the group",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name of the group",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of egress rules associated with the security group",
+                            "name": "egressrule",
+                            "response": [
+                                {
+                                    "description": "security group name",
+                                    "name": "securitygroupname",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the CIDR notation for the base IP address of the security group rule",
+                                    "name": "cidr",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the starting IP of the security group rule",
+                                    "name": "startport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "account owning the security group rule",
+                                    "name": "account",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the code for the ICMP message response",
+                                    "name": "icmpcode",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the list of resource tags associated with the rule",
+                                    "name": "tags",
+                                    "response": [
+                                        {
+                                            "description": "the ID of the domain associated with the tag",
+                                            "name": "domainid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag value",
+                                            "name": "value",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "id of the resource",
+                                            "name": "resourceid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag key name",
+                                            "name": "key",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project name where tag belongs to",
+                                            "name": "project",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the domain associated with the tag",
+                                            "name": "domain",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the account associated with the tag",
+                                            "name": "account",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project id the tag belongs to",
+                                            "name": "projectid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "customer associated with the tag",
+                                            "name": "customer",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "resource type",
+                                            "name": "resourcetype",
+                                            "type": "string"
+                                        }
+                                    ],
+                                    "type": "set"
+                                },
+                                {
+                                    "description": "the protocol of the security group rule",
+                                    "name": "protocol",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the id of the security group rule",
+                                    "name": "ruleid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the type of the ICMP message response",
+                                    "name": "icmptype",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the ending IP of the security group rule ",
+                                    "name": "endport",
+                                    "type": "integer"
+                                }
+                            ],
+                            "type": "set"
+                        },
+                        {
+                            "description": "the list of resource tags associated with the rule",
+                            "name": "tags",
+                            "response": [
+                                {
+                                    "description": "customer associated with the tag",
+                                    "name": "customer",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "tag key name",
+                                    "name": "key",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "resource type",
+                                    "name": "resourcetype",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the project name where tag belongs to",
+                                    "name": "project",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the account associated with the tag",
+                                    "name": "account",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the project id the tag belongs to",
+                                    "name": "projectid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "id of the resource",
+                                    "name": "resourceid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the domain associated with the tag",
+                                    "name": "domain",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "tag value",
+                                    "name": "value",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the ID of the domain associated with the tag",
+                                    "name": "domainid",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "set"
+                        },
+                        {
+                            "description": "the name of the security group",
+                            "name": "name",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain name of the security group",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account owning the security group",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the security group",
+                            "name": "id",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "the ID of the domain in which the virtual machine exists",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "public IP address id associated with vm via Static nat rule",
+                    "name": "publicipid",
+                    "type": "string"
+                },
+                {
+                    "description": "public IP address id associated with vm via Static nat rule",
+                    "name": "publicip",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Updates a port forwarding rule. Only the private port and the virtual machine can be updated.",
+            "isasync": true,
+            "name": "updatePortForwardingRule",
+            "params": [
+                {
+                    "description": "an optional field, in case you want to set a custom id to the resource. Allowed to Root Admins only",
+                    "length": 255,
+                    "name": "customid",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "string"
+                },
+                {
+                    "description": "an optional field, whether to the display the rule to the end user or not",
+                    "length": 255,
+                    "name": "fordisplay",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the private port of the port forwarding rule",
+                    "length": 255,
+                    "name": "privateport",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "VM guest nic Secondary ip address for the port forwarding rule",
+                    "length": 255,
+                    "name": "vmguestip",
+                    "required": false,
+                    "since": "4.5",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the virtual machine for the port forwarding rule",
+                    "length": 255,
+                    "name": "virtualmachineid",
+                    "related": "updateVMAffinityGroup,detachIso,resetSSHKeyForVirtualMachine,resetSSHKeyForVirtualMachine,migrateVirtualMachineWithVolume,attachIso,removeNicFromVirtualMachine,recoverVirtualMachine,revertToVMSnapshot,updateVMAffinityGroup,listVirtualMachines,rebootVirtualMachine,restoreVirtualMachine,destroyVirtualMachine,stopVirtualMachine,deployVirtualMachine,detachIso,deployVirtualMachine,updateVirtualMachine,revertToVMSnapshot,resetPasswordForVirtualMachine,startVirtualMachine,updateDefaultNicForVirtualMachine,startVirtualMachine,attachIso,listVirtualMachines,addNicToVirtualMachine,stopVirtualMachine,destroyVirtualMachine,removeNicFromVirtualMachine,changeServiceForVirtualMachine",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the ID of the port forwarding rule",
+                    "length": 255,
+                    "name": "id",
+                    "related": "updatePortForwardingRule",
+                    "required": true,
+                    "since": "4.4",
+                    "type": "uuid"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the starting port of port forwarding rule's private port range",
+                    "name": "privateport",
+                    "type": "string"
+                },
+                {
+                    "description": "the cidr list to forward traffic from",
+                    "name": "cidrlist",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of resource tags associated with the rule",
+                    "name": "tags",
+                    "response": [
+                        {
+                            "description": "customer associated with the tag",
+                            "name": "customer",
+                            "type": "string"
+                        },
+                        {
+                            "description": "resource type",
+                            "name": "resourcetype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "id of the resource",
+                            "name": "resourceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account associated with the tag",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the domain associated with the tag",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag key name",
+                            "name": "key",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain associated with the tag",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag value",
+                            "name": "value",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name where tag belongs to",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project id the tag belongs to",
+                            "name": "projectid",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "the ending port of port forwarding rule's private port range",
+                    "name": "privateendport",
+                    "type": "string"
+                },
+                {
+                    "description": "is firewall for display to the regular user",
+                    "name": "fordisplay",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the public ip address id for the port forwarding rule",
+                    "name": "ipaddressid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the port forwarding rule",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the VM ID for the port forwarding rule",
+                    "name": "virtualmachineid",
+                    "type": "string"
+                },
+                {
+                    "description": "the vm ip address for the port forwarding rule",
+                    "name": "vmguestip",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of the rule",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the starting port of port forwarding rule's public port range",
+                    "name": "publicport",
+                    "type": "string"
+                },
+                {
+                    "description": "the ending port of port forwarding rule's private port range",
+                    "name": "publicendport",
+                    "type": "string"
+                },
+                {
+                    "description": "the VM name for the port forwarding rule",
+                    "name": "virtualmachinename",
+                    "type": "string"
+                },
+                {
+                    "description": "the VM display name for the port forwarding rule",
+                    "name": "virtualmachinedisplayname",
+                    "type": "string"
+                },
+                {
+                    "description": "the protocol of the port forwarding rule",
+                    "name": "protocol",
+                    "type": "string"
+                },
+                {
+                    "description": "the public ip address for the port forwarding rule",
+                    "name": "ipaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the id of the guest network the port forwarding rule belongs to",
+                    "name": "networkid",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Lists Brocade VCS Switches",
+            "isasync": false,
+            "name": "listBrocadeVcsDevices",
+            "params": [
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "the Physical Network ID",
+                    "length": 255,
+                    "name": "physicalnetworkid",
+                    "related": "createPhysicalNetwork",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "Brocade VCS switch ID",
+                    "length": 255,
+                    "name": "vcsdeviceid",
+                    "related": "listBrocadeVcsDevices",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "device name",
+                    "name": "brocadedevicename",
+                    "type": "string"
+                },
+                {
+                    "description": "device id of the Brocade Vcs",
+                    "name": "vcsdeviceid",
+                    "type": "string"
+                },
+                {
+                    "description": "the principal switch Ip address",
+                    "name": "hostname",
+                    "type": "string"
+                },
+                {
+                    "description": "name of the provider",
+                    "name": "provider",
+                    "type": "string"
+                },
+                {
+                    "description": "the physical Network to which this Brocade VCS belongs to",
+                    "name": "physicalnetworkid",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "link an existing cloudstack domain to group or OU in ldap",
+            "isasync": false,
+            "name": "linkDomainToLdap",
+            "params": [
+                {
+                    "description": "domain admin username in LDAP ",
+                    "length": 255,
+                    "name": "admin",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "The id of the domain which has to be linked to LDAP.",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "listDomainChildren,listDomains",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "type of the ldap name. GROUP or OU",
+                    "length": 255,
+                    "name": "type",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "Type of the account to auto import. Specify 0 for user and 2 for domain admin",
+                    "length": 255,
+                    "name": "accounttype",
+                    "required": true,
+                    "type": "short"
+                },
+                {
+                    "description": "name of the group or OU in LDAP",
+                    "length": 255,
+                    "name": "name",
+                    "required": true,
+                    "type": "string"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "id of the Domain which is linked to LDAP",
+                    "name": "domainid",
+                    "type": "long"
+                },
+                {
+                    "description": "type of the name in LDAP which is linke to the domain",
+                    "name": "type",
+                    "type": "string"
+                },
+                {
+                    "description": "Domain Admin accountId that is created",
+                    "name": "accountid",
+                    "type": "string"
+                },
+                {
+                    "description": "Type of the account to auto import",
+                    "name": "accounttype",
+                    "type": "short"
+                },
+                {
+                    "description": "name of the group or OU in LDAP which is linked to the domain",
+                    "name": "name",
+                    "type": "string"
+                }
+            ],
+            "since": "4.6.0"
+        },
+        {
+            "description": "Acquires and associates a public IP to an account.",
+            "isasync": true,
+            "name": "associateIpAddress",
+            "params": [
+                {
+                    "description": "an optional field, whether to the display the IP to the end user or not",
+                    "length": 255,
+                    "name": "fordisplay",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the VPC you want the IP address to be associated with",
+                    "length": 255,
+                    "name": "vpcid",
+                    "related": "restartVPC,listVPCs,createVPC,updateVPC,listVPCs,createVPC",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the account to associate with this IP address",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "Deploy VM for the project",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "listProjectAccounts,suspendProject,activateProject,updateProject,listProjects",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "should be set to true if public IP is required to be transferable across zones, if not specified defaults to false",
+                    "length": 255,
+                    "name": "isportable",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "the ID of the domain to associate with this IP address",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "region ID from where portable IP is to be associated.",
+                    "length": 255,
+                    "name": "regionid",
+                    "related": "addRegion,listRegions",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "The network this IP address should be associated to.",
+                    "length": 255,
+                    "name": "networkid",
+                    "related": "createNetwork,listSrxFirewallNetworks,updateNetwork,listBrocadeVcsDeviceNetworks,createNetwork,listNetworks,listNetscalerLoadBalancerNetworks,listF5LoadBalancerNetworks",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the ID of the availability zone you want to acquire an public IP address from",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones,listZones,createZone,updateZone",
+                    "required": false,
+                    "type": "uuid"
+                }
+            ],
+            "related": "updateIpAddress,associateIpAddress,listPublicIpAddresses",
+            "response": [
+                {
+                    "description": "the project name of the address",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "State of the ip address. Can be: Allocatin, Allocated and Releasing",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "is public ip for display to the regular user",
+                    "name": "fordisplay",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the ID of the Network where ip belongs to",
+                    "name": "networkid",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain the public IP address is associated with",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the Network associated with the IP address",
+                    "name": "associatednetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "is public IP portable across the zones",
+                    "name": "isportable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the name of the zone the public IP address belongs to",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "public IP address id",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the virtual network for the IP address",
+                    "name": "forvirtualnetwork",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the ID of the zone the public IP address belongs to",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "true if this ip is system ip (was allocated as a part of deployVm or createLbRule)",
+                    "name": "issystem",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the domain ID the public IP address is associated with",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the account the public IP address is associated with",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "public IP address",
+                    "name": "ipaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "true if this ip is for static nat, false otherwise",
+                    "name": "isstaticnat",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the list of resource tags associated with ip address",
+                    "name": "tags",
+                    "response": [
+                        {
+                            "description": "id of the resource",
+                            "name": "resourceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "resource type",
+                            "name": "resourcetype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project id the tag belongs to",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "customer associated with the tag",
+                            "name": "customer",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag key name",
+                            "name": "key",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain associated with the tag",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag value",
+                            "name": "value",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name where tag belongs to",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the domain associated with the tag",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account associated with the tag",
+                            "name": "account",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "the project id of the ipaddress",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "virutal machine (dnat) ip address (not null only for static nat Ip)",
+                    "name": "vmipaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "true if the IP address is a source nat address, false otherwise",
+                    "name": "issourcenat",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the physical network this belongs to",
+                    "name": "physicalnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the Network associated with the IP address",
+                    "name": "associatednetworkname",
+                    "type": "string"
+                },
+                {
+                    "description": "VPC the ip belongs to",
+                    "name": "vpcid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the VLAN associated with the IP address. This parameter is visible to ROOT admins only",
+                    "name": "vlanid",
+                    "type": "string"
+                },
+                {
+                    "description": "purpose of the IP address. In Acton this value is not null for Ips with isSystem=true, and can have either StaticNat or LB value",
+                    "name": "purpose",
+                    "type": "string"
+                },
+                {
+                    "description": "virutal machine name the ip address is assigned to (not null only for static nat Ip)",
+                    "name": "virtualmachinename",
+                    "type": "string"
+                },
+                {
+                    "description": "the VLAN associated with the IP address",
+                    "name": "vlanname",
+                    "type": "string"
+                },
+                {
+                    "description": "virutal machine id the ip address is assigned to (not null only for static nat Ip)",
+                    "name": "virtualmachineid",
+                    "type": "string"
+                },
+                {
+                    "description": "date the public IP address was acquired",
+                    "name": "allocated",
+                    "type": "date"
+                },
+                {
+                    "description": "virutal machine display name the ip address is assigned to (not null only for static nat Ip)",
+                    "name": "virtualmachinedisplayname",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Delete site to site vpn connection",
+            "isasync": true,
+            "name": "deleteVpnConnection",
+            "params": [
+                {
+                    "description": "id of vpn connection",
+                    "length": 255,
+                    "name": "id",
+                    "related": "createVpnConnection,listVpnConnections",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                },
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": " delete a F5 load balancer device",
+            "isasync": true,
+            "name": "deleteF5LoadBalancer",
+            "params": [
+                {
+                    "description": "netscaler load balancer device ID",
+                    "length": 255,
+                    "name": "lbdeviceid",
+                    "related": "addF5LoadBalancer",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "Creates a ACL rule in the given network (the network has to belong to VPC)",
+            "isasync": true,
+            "name": "createNetworkACL",
+            "params": [
+                {
+                    "description": "the protocol for the ACL rule. Valid values are TCP/UDP/ICMP/ALL or valid protocol number",
+                    "length": 255,
+                    "name": "protocol",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the CIDR list to allow traffic from/to",
+                    "length": 255,
+                    "name": "cidrlist",
+                    "required": false,
+                    "type": "list"
+                },
+                {
+                    "description": "error code for this ICMP message",
+                    "length": 255,
+                    "name": "icmpcode",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "scl entry action, allow or deny",
+                    "length": 255,
+                    "name": "action",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "The network of the VM the ACL will be created for",
+                    "length": 255,
+                    "name": "networkid",
+                    "related": "createNetwork,listSrxFirewallNetworks,updateNetwork,listBrocadeVcsDeviceNetworks,createNetwork,listNetworks,listNetscalerLoadBalancerNetworks,listF5LoadBalancerNetworks",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the ending port of ACL",
+                    "length": 255,
+                    "name": "endport",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "The network of the VM the ACL will be created for",
+                    "length": 255,
+                    "name": "aclid",
+                    "related": "createNetworkACLList",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the starting port of ACL",
+                    "length": 255,
+                    "name": "startport",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "The network of the VM the ACL will be created for",
+                    "length": 255,
+                    "name": "number",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "type of the ICMP message being sent",
+                    "length": 255,
+                    "name": "icmptype",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "an optional field, whether to the display the rule to the end user or not",
+                    "length": 255,
+                    "name": "fordisplay",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the traffic type for the ACL,can be ingress or egress, defaulted to ingress if not specified",
+                    "length": 255,
+                    "name": "traffictype",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "updateNetworkACLItem",
+            "response": [
+                {
+                    "description": "Number of the ACL Item",
+                    "name": "number",
+                    "type": "integer"
+                },
+                {
+                    "description": "the starting port of ACL's port range",
+                    "name": "startport",
+                    "type": "string"
+                },
+                {
+                    "description": "the traffic type for the ACL",
+                    "name": "traffictype",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the ACL this item belongs to",
+                    "name": "aclid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ending port of ACL's port range",
+                    "name": "endport",
+                    "type": "string"
+                },
+                {
+                    "description": "the cidr list to forward traffic from",
+                    "name": "cidrlist",
+                    "type": "string"
+                },
+                {
+                    "description": "is rule for display to the regular user",
+                    "name": "fordisplay",
+                    "type": "boolean"
+                },
+                {
+                    "description": "Action of ACL Item. Allow/Deny",
+                    "name": "action",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of the rule",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "type of the icmp message being sent",
+                    "name": "icmptype",
+                    "type": "integer"
+                },
+                {
+                    "description": "the protocol of the ACL",
+                    "name": "protocol",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of resource tags associated with the network ACLs",
+                    "name": "tags",
+                    "response": [
+                        {
+                            "description": "the project id the tag belongs to",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "id of the resource",
+                            "name": "resourceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the domain associated with the tag",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain associated with the tag",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag key name",
+                            "name": "key",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name where tag belongs to",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "resource type",
+                            "name": "resourcetype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account associated with the tag",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "customer associated with the tag",
+                            "name": "customer",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag value",
+                            "name": "value",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "the ID of the ACL Item",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "error code for this icmp message",
+                    "name": "icmpcode",
+                    "type": "integer"
+                }
+            ]
+        },
+        {
+            "description": "Resets the SSH Key for virtual machine. The virtual machine must be in a \"Stopped\" state. [async]",
+            "isasync": true,
+            "name": "resetSSHKeyForVirtualMachine",
+            "params": [
+                {
+                    "description": "an optional domainId for the virtual machine. If the account parameter is used, domainId must also be used.",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "an optional project for the ssh key",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "listProjectAccounts,suspendProject,activateProject,updateProject,listProjects",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "an optional account for the ssh key. Must be used with domainId.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "name of the ssh key pair used to login to the virtual machine",
+                    "length": 255,
+                    "name": "keypair",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "The ID of the virtual machine",
+                    "length": 255,
+                    "name": "id",
+                    "related": "updateVMAffinityGroup,detachIso,resetSSHKeyForVirtualMachine,resetSSHKeyForVirtualMachine,migrateVirtualMachineWithVolume,attachIso,removeNicFromVirtualMachine,recoverVirtualMachine,revertToVMSnapshot,updateVMAffinityGroup,listVirtualMachines,rebootVirtualMachine,restoreVirtualMachine,destroyVirtualMachine,stopVirtualMachine,deployVirtualMachine,detachIso,deployVirtualMachine,updateVirtualMachine,revertToVMSnapshot,resetPasswordForVirtualMachine,startVirtualMachine,updateDefaultNicForVirtualMachine,startVirtualMachine,attachIso,listVirtualMachines,addNicToVirtualMachine,stopVirtualMachine,destroyVirtualMachine,removeNicFromVirtualMachine,changeServiceForVirtualMachine",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "updateVMAffinityGroup,detachIso,resetSSHKeyForVirtualMachine,migrateVirtualMachineWithVolume,attachIso,removeNicFromVirtualMachine,recoverVirtualMachine,revertToVMSnapshot,updateVMAffinityGroup,listVirtualMachines,rebootVirtualMachine,restoreVirtualMachine,destroyVirtualMachine,stopVirtualMachine,deployVirtualMachine,detachIso,deployVirtualMachine,updateVirtualMachine,revertToVMSnapshot,resetPasswordForVirtualMachine,startVirtualMachine,updateDefaultNicForVirtualMachine,startVirtualMachine,attachIso,listVirtualMachines,addNicToVirtualMachine,stopVirtualMachine,destroyVirtualMachine,removeNicFromVirtualMachine,changeServiceForVirtualMachine",
+            "response": [
+                {
+                    "description": "the ID of the disk offering of the virtual machine",
+                    "name": "diskofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "device type of the root volume",
+                    "name": "rootdevicetype",
+                    "type": "string"
+                },
+                {
+                    "description": "the password (if exists) of the virtual machine",
+                    "name": "password",
+                    "type": "string"
+                },
+                {
+                    "description": "ssh key-pair",
+                    "name": "keypair",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the vm",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "Vm details in key/value pairs.",
+                    "name": "details",
+                    "type": "map"
+                },
+                {
+                    "description": "OS type id of the vm",
+                    "name": "ostypeid",
+                    "type": "long"
+                },
+                {
+                    "description": "the number of cpu this virtual machine is running with",
+                    "name": "cpunumber",
+                    "type": "integer"
+                },
+                {
+                    "description": "user generated name. The name of the virtual machine is returned if no displayname exists.",
+                    "name": "displayname",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the domain in which the virtual machine exists",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "public IP address id associated with vm via Static nat rule",
+                    "name": "publicip",
+                    "type": "string"
+                },
+                {
+                    "description": "the incoming network traffic on the vm",
+                    "name": "networkkbsread",
+                    "type": "long"
+                },
+                {
+                    "description": "the date when this virtual machine was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the read (bytes) of disk on the vm",
+                    "name": "diskkbsread",
+                    "type": "long"
+                },
+                {
+                    "description": "the name of the virtual machine",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "an alternate display text of the ISO attached to the virtual machine",
+                    "name": "isodisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "the virtual network for the service offering",
+                    "name": "forvirtualnetwork",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the memory allocated for the virtual machine",
+                    "name": "memory",
+                    "type": "integer"
+                },
+                {
+                    "description": "the ID of the domain in which the virtual machine exists",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "instance name of the user vm; this parameter is returned to the ROOT admin only",
+                    "name": "instancename",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the service offering of the virtual machine",
+                    "name": "serviceofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "the write (io) of disk on the vm",
+                    "name": "diskiowrite",
+                    "type": "long"
+                },
+                {
+                    "description": "State of the Service from LB rule",
+                    "name": "servicestate",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the ISO attached to the virtual machine",
+                    "name": "isoname",
+                    "type": "string"
+                },
+                {
+                    "description": "list of affinity groups associated with the virtual machine",
+                    "name": "affinitygroup",
+                    "response": [
+                        {
+                            "description": "the account owning the affinity group",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "virtual machine IDs associated with this affinity group",
+                            "name": "virtualmachineIds",
+                            "type": "list"
+                        },
+                        {
+                            "description": "the domain ID of the affinity group",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the description of the affinity group",
+                            "name": "description",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain name of the affinity group",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the affinity group",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the type of the affinity group",
+                            "name": "type",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the name of the affinity group",
+                            "name": "name",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project ID of the affinity group",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name of the affinity group",
+                            "name": "project",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "the vgpu type used by the virtual machine",
+                    "name": "vgpu",
+                    "type": "string"
+                },
+                {
+                    "description": "the speed of each cpu",
+                    "name": "cpuspeed",
+                    "type": "integer"
+                },
+                {
+                    "description": " an alternate display text of the template for the virtual machine",
+                    "name": "templatedisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "the group ID of the virtual machine",
+                    "name": "groupid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the host for the virtual machine",
+                    "name": "hostname",
+                    "type": "string"
+                },
+                {
+                    "description": "the user's name who deployed the virtual machine",
+                    "name": "username",
+                    "type": "string"
+                },
+                {
+                    "description": "true if high-availability is enabled, false otherwise",
+                    "name": "haenable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the amount of the vm's CPU currently used",
+                    "name": "cpuused",
+                    "type": "string"
+                },
+                {
+
+                },
+                {
+                    "description": "the group name of the virtual machine",
+                    "name": "group",
+                    "type": "string"
+                },
+                {
+                    "description": "the account associated with the virtual machine",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the vm",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of nics associated with vm",
+                    "name": "nic",
+                    "response": [
+                        {
+                            "description": "true if nic is default, false otherwise",
+                            "name": "macaddress",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the isolation uri of the nic",
+                            "name": "isolationuri",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ip address of the nic",
+                            "name": "ipaddress",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the corresponding network",
+                            "name": "networkid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the netmask of the nic",
+                            "name": "netmask",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the cidr of IPv6 network",
+                            "name": "ip6cidr",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the type of the nic",
+                            "name": "type",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the Secondary ipv4 addr of nic",
+                            "name": "secondaryip",
+                            "type": "list"
+                        },
+                        {
+                            "description": "the IPv6 address of network",
+                            "name": "ip6address",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the broadcast uri of the nic",
+                            "name": "broadcasturi",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the traffic type of the nic",
+                            "name": "traffictype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the nic",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the gateway of IPv6 network",
+                            "name": "ip6gateway",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the NSX Logical Switch Port (if NSX based), null otherwise",
+                            "name": "nsxlogicalswitchport",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the gateway of the nic",
+                            "name": "gateway",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if nic is default, false otherwise",
+                            "name": "isdefault",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "device id for the network when plugged into the virtual machine",
+                            "name": "deviceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the name of the corresponding network",
+                            "name": "networkname",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the NSX Logical Switch (if NSX based), null otherwise",
+                            "name": "nsxlogicalswitch",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the vm to which the nic belongs",
+                            "name": "virtualmachineid",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "list of security groups associated with the virtual machine",
+                    "name": "securitygroup",
+                    "response": [
+                        {
+                            "description": "the ID of the security group",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the number of virtualmachines associated with this securitygroup",
+                            "name": "virtualmachinecount",
+                            "type": "integer"
+                        },
+                        {
+                            "description": "the list of virtualmachine ids associated with this securitygroup",
+                            "name": "virtualmachineids",
+                            "type": "set"
+                        },
+                        {
+                            "description": "the list of ingress rules associated with the security group",
+                            "name": "ingressrule",
+                            "response": [
+                                {
+                                    "description": "the type of the ICMP message response",
+                                    "name": "icmptype",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the code for the ICMP message response",
+                                    "name": "icmpcode",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the CIDR notation for the base IP address of the security group rule",
+                                    "name": "cidr",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the protocol of the security group rule",
+                                    "name": "protocol",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the ending IP of the security group rule ",
+                                    "name": "endport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the id of the security group rule",
+                                    "name": "ruleid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "security group name",
+                                    "name": "securitygroupname",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the starting IP of the security group rule",
+                                    "name": "startport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "account owning the security group rule",
+                                    "name": "account",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the list of resource tags associated with the rule",
+                                    "name": "tags",
+                                    "response": [
+                                        {
+                                            "description": "tag value",
+                                            "name": "value",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "customer associated with the tag",
+                                            "name": "customer",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the ID of the domain associated with the tag",
+                                            "name": "domainid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project id the tag belongs to",
+                                            "name": "projectid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "id of the resource",
+                                            "name": "resourceid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project name where tag belongs to",
+                                            "name": "project",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "resource type",
+                                            "name": "resourcetype",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the domain associated with the tag",
+                                            "name": "domain",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the account associated with the tag",
+                                            "name": "account",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag key name",
+                                            "name": "key",
+                                            "type": "string"
+                                        }
+                                    ],
+                                    "type": "set"
+                                }
+                            ],
+                            "type": "set"
+                        },
+                        {
+                            "description": "the description of the security group",
+                            "name": "description",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account owning the security group",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain ID of the security group",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the name of the security group",
+                            "name": "name",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of egress rules associated with the security group",
+                            "name": "egressrule",
+                            "response": [
+                                {
+                                    "description": "the CIDR notation for the base IP address of the security group rule",
+                                    "name": "cidr",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the protocol of the security group rule",
+                                    "name": "protocol",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the starting IP of the security group rule",
+                                    "name": "startport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the code for the ICMP message response",
+                                    "name": "icmpcode",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the id of the security group rule",
+                                    "name": "ruleid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the type of the ICMP message response",
+                                    "name": "icmptype",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "account owning the security group rule",
+                                    "name": "account",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the list of resource tags associated with the rule",
+                                    "name": "tags",
+                                    "response": [
+                                        {
+                                            "description": "id of the resource",
+                                            "name": "resourceid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project id the tag belongs to",
+                                            "name": "projectid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the ID of the domain associated with the tag",
+                                            "name": "domainid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "resource type",
+                                            "name": "resourcetype",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag key name",
+                                            "name": "key",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project name where tag belongs to",
+                                            "name": "project",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag value",
+                                            "name": "value",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "customer associated with the tag",
+                                            "name": "customer",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the domain associated with the tag",
+                                            "name": "domain",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the account associated with the tag",
+                                            "name": "account",
+                                            "type": "string"
+                                        }
+                                    ],
+                                    "type": "set"
+                                },
+                                {
+                                    "description": "the ending IP of the security group rule ",
+                                    "name": "endport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "security group name",
+                                    "name": "securitygroupname",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "set"
+                        },
+                        {
+                            "description": "the project name of the group",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project id of the group",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain name of the security group",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of resource tags associated with the rule",
+                            "name": "tags",
+                            "response": [
+                                {
+                                    "description": "the ID of the domain associated with the tag",
+                                    "name": "domainid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "resource type",
+                                    "name": "resourcetype",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "tag value",
+                                    "name": "value",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the domain associated with the tag",
+                                    "name": "domain",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "tag key name",
+                                    "name": "key",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the project id the tag belongs to",
+                                    "name": "projectid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the project name where tag belongs to",
+                                    "name": "project",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "id of the resource",
+                                    "name": "resourceid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the account associated with the tag",
+                                    "name": "account",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "customer associated with the tag",
+                                    "name": "customer",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "set"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "the name of the template for the virtual machine",
+                    "name": "templatename",
+                    "type": "string"
+                },
+                {
+                    "description": "an optional field whether to the display the vm to the end user or not.",
+                    "name": "displayvm",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the ID of the ISO attached to the virtual machine",
+                    "name": "isoid",
+                    "type": "string"
+                },
+                {
+                    "description": "the target memory in vm",
+                    "name": "memorytargetkbs",
+                    "type": "long"
+                },
+                {
+                    "description": "the user's ID who deployed the virtual machine",
+                    "name": "userid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the service offering of the virtual machine",
+                    "name": "serviceofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "public IP address id associated with vm via Static nat rule",
+                    "name": "publicipid",
+                    "type": "string"
+                },
+                {
+                    "description": "the read (io) of disk on the vm",
+                    "name": "diskioread",
+                    "type": "long"
+                },
+                {
+                    "description": "the ID of the host for the virtual machine",
+                    "name": "hostid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the disk offering of the virtual machine",
+                    "name": "diskofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the virtual machine",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the availability zone for the virtual machine",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "true if vm contains XS/VMWare tools inorder to support dynamic scaling of VM cpu/memory.",
+                    "name": "isdynamicallyscalable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the ID of the availablility zone for the virtual machine",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the hypervisor on which the template runs",
+                    "name": "hypervisor",
+                    "type": "string"
+                },
+                {
+                    "description": "the internal memory thats free in vm",
+                    "name": "memoryintfreekbs",
+                    "type": "long"
+                },
+                {
+                    "description": "Os type ID of the virtual machine",
+                    "name": "guestosid",
+                    "type": "string"
+                },
+                {
+                    "description": "the outgoing network traffic on the host",
+                    "name": "networkkbswrite",
+                    "type": "long"
+                },
+                {
+                    "description": "the write (bytes) of disk on the vm",
+                    "name": "diskkbswrite",
+                    "type": "long"
+                },
+                {
+                    "description": "true if the password rest feature is enabled, false otherwise",
+                    "name": "passwordenabled",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the memory used by the vm",
+                    "name": "memorykbs",
+                    "type": "long"
+                },
+                {
+                    "description": "the state of the virtual machine",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the template for the virtual machine. A -1 is returned if the virtual machine was created from an ISO file.",
+                    "name": "templateid",
+                    "type": "string"
+                },
+                {
+                    "description": "device ID of the root volume",
+                    "name": "rootdeviceid",
+                    "type": "long"
+                }
+            ]
+        },
+        {
+            "description": "Lists site to site vpn customer gateways",
+            "isasync": false,
+            "name": "listVpnCustomerGateways",
+            "params": [
+                {
+                    "description": "If set to false, list only resources belonging to the command's caller; if set to true - list resources that the caller is authorized to see. Default value is false",
+                    "length": 255,
+                    "name": "listall",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "list objects by project",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "listProjectAccounts,suspendProject,activateProject,updateProject,listProjects",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.",
+                    "length": 255,
+                    "name": "isrecursive",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "list only resources belonging to the domain specified",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list resources by account. Must be used with the domainId parameter.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "id of the customer gateway",
+                    "length": 255,
+                    "name": "id",
+                    "related": "createVpnCustomerGateway,listVpnCustomerGateways",
+                    "required": false,
+                    "type": "uuid"
+                }
+            ],
+            "related": "createVpnCustomerGateway",
+            "response": [
+                {
+                    "description": "the domain name of the owner",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "IKE policy of customer gateway",
+                    "name": "ikepolicy",
+                    "type": "string"
+                },
+                {
+                    "description": "IPsec policy of customer gateway",
+                    "name": "esppolicy",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the owner",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "IPsec preshared-key of customer gateway",
+                    "name": "ipsecpsk",
+                    "type": "string"
+                },
+                {
+                    "description": "the date and time the host was removed",
+                    "name": "removed",
+                    "type": "date"
+                },
+                {
+                    "description": "public ip address id of the customer gateway",
+                    "name": "gateway",
+                    "type": "string"
+                },
+                {
+                    "description": "the vpn gateway ID",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "guest cidr list of the customer gateway",
+                    "name": "cidrlist",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain id of the owner",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "if DPD is enabled for customer gateway",
+                    "name": "dpd",
+                    "type": "boolean"
+                },
+                {
+                    "description": "Lifetime of IKE SA of customer gateway",
+                    "name": "ikelifetime",
+                    "type": "long"
+                },
+                {
+                    "description": "if Force NAT Encapsulation is enabled for customer gateway",
+                    "name": "forceencap",
+                    "type": "boolean"
+                },
+                {
+                    "description": "name of the customer gateway",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "guest ip of the customer gateway",
+                    "name": "ipaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "Lifetime of ESP SA of customer gateway",
+                    "name": "esplifetime",
+                    "type": "long"
+                }
+            ]
+        },
+        {
+            "description": "Creates a global load balancer rule",
+            "isasync": true,
+            "name": "createGlobalLoadBalancerRule",
+            "params": [
+                {
+                    "description": "the domain ID associated with the load balancer",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "name of the load balancer rule",
+                    "length": 255,
+                    "name": "name",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the account associated with the global load balancer. Must be used with the domainId parameter.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "region where the global load balancer is going to be created.",
+                    "length": 255,
+                    "name": "regionid",
+                    "related": "addRegion,listRegions",
+                    "required": true,
+                    "type": "integer"
+                },
+                {
+                    "description": "domain name for the GSLB service.",
+                    "length": 255,
+                    "name": "gslbdomainname",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "session sticky method (sourceip) if not specified defaults to sourceip",
+                    "length": 255,
+                    "name": "gslbstickysessionmethodname",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the description of the load balancer rule",
+                    "length": 4096,
+                    "name": "description",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "load balancer algorithm (roundrobin, leastconn, proximity) that method is used to distribute traffic across the zones participating in global server load balancing, if not specified defaults to 'round robin'",
+                    "length": 255,
+                    "name": "gslblbmethod",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "GSLB service type (tcp, udp, http)",
+                    "length": 255,
+                    "name": "gslbservicetype",
+                    "required": true,
+                    "type": "string"
+                }
+            ],
+            "related": "updateGlobalLoadBalancerRule,listGlobalLoadBalancerRules",
+            "response": [
+                {
+                    "description": "name of the global load balancer rule",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "GSLB service type",
+                    "name": "gslbservicetype",
+                    "type": "string"
+                },
+                {
+                    "description": "session persistence method used for the global load balancer",
+                    "name": "gslbstickysessionmethodname",
+                    "type": "string"
+                },
+                {
+                    "description": "Region Id in which global load balancer is created",
+                    "name": "regionid",
+                    "type": "integer"
+                },
+                {
+                    "description": "the domain of the load balancer rule",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the account of the load balancer rule",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "global load balancer rule ID",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the load balancer",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the load balancer",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the description of the global load balancer rule",
+                    "name": "description",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain ID of the load balancer rule",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "Load balancing method used for the global load balancer",
+                    "name": "gslblbmethod",
+                    "type": "string"
+                },
+                {
+                    "description": "DNS domain name given for the global load balancer",
+                    "name": "gslbdomainname",
+                    "type": "string"
+                },
+                {
+                    "description": "List of load balancer rules that are part of GSLB rule",
+                    "name": "loadbalancerrule",
+                    "response": [
+                        {
+                            "description": "the id of the guest network the lb rule belongs to",
+                            "name": "networkid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of resource tags associated with load balancer",
+                            "name": "tags",
+                            "response": [
+                                {
+                                    "description": "id of the resource",
+                                    "name": "resourceid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the project id the tag belongs to",
+                                    "name": "projectid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "tag key name",
+                                    "name": "key",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "tag value",
+                                    "name": "value",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the account associated with the tag",
+                                    "name": "account",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the project name where tag belongs to",
+                                    "name": "project",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the ID of the domain associated with the tag",
+                                    "name": "domainid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "customer associated with the tag",
+                                    "name": "customer",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "resource type",
+                                    "name": "resourcetype",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the domain associated with the tag",
+                                    "name": "domain",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "list"
+                        },
+                        {
+                            "description": "the protocol of the loadbalanacer rule",
+                            "name": "protocol",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the cidr list to forward traffic from",
+                            "name": "cidrlist",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name of the load balancer",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the name of the load balancer",
+                            "name": "name",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the id of the zone the rule belongs to",
+                            "name": "zoneid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the load balancer rule ID",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the load balancer algorithm (source, roundrobin, leastconn)",
+                            "name": "algorithm",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain of the load balancer rule",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the private port",
+                            "name": "privateport",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account of the load balancer rule",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the public port",
+                            "name": "publicport",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain ID of the load balancer rule",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the public ip address",
+                            "name": "publicip",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the public ip address id",
+                            "name": "publicipid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the state of the rule",
+                            "name": "state",
+                            "type": "string"
+                        },
+                        {
+                            "description": "is rule for display to the regular user",
+                            "name": "fordisplay",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "the description of the load balancer",
+                            "name": "description",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project id of the load balancer",
+                            "name": "projectid",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                }
+            ]
+        },
+        {
+            "description": " delete a netscaler load balancer device",
+            "isasync": true,
+            "name": "deleteNetscalerLoadBalancer",
+            "params": [
+                {
+                    "description": "netscaler load balancer device ID",
+                    "length": 255,
+                    "name": "lbdeviceid",
+                    "related": "addNetscalerLoadBalancer,listNetscalerLoadBalancers",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "Lists load balancer rules.",
+            "isasync": false,
+            "name": "listGlobalLoadBalancerRules",
+            "params": [
+                {
+                    "description": "region ID",
+                    "length": 255,
+                    "name": "regionid",
+                    "related": "addRegion,listRegions",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "list only resources belonging to the domain specified",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "list objects by project",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "listProjectAccounts,suspendProject,activateProject,updateProject,listProjects",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the ID of the global load balancer rule",
+                    "length": 255,
+                    "name": "id",
+                    "related": "updateGlobalLoadBalancerRule,listGlobalLoadBalancerRules",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "List resources by tags (key/value pairs)",
+                    "length": 255,
+                    "name": "tags",
+                    "required": false,
+                    "type": "map"
+                },
+                {
+                    "description": "defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.",
+                    "length": 255,
+                    "name": "isrecursive",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "If set to false, list only resources belonging to the command's caller; if set to true - list resources that the caller is authorized to see. Default value is false",
+                    "length": 255,
+                    "name": "listall",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "list resources by account. Must be used with the domainId parameter.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "updateGlobalLoadBalancerRule",
+            "response": [
+                {
+                    "description": "the description of the global load balancer rule",
+                    "name": "description",
+                    "type": "string"
+                },
+                {
+                    "description": "List of load balancer rules that are part of GSLB rule",
+                    "name": "loadbalancerrule",
+                    "response": [
+                        {
+                            "description": "the domain ID of the load balancer rule",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the private port",
+                            "name": "privateport",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the state of the rule",
+                            "name": "state",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the public port",
+                            "name": "publicport",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the id of the zone the rule belongs to",
+                            "name": "zoneid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the load balancer rule ID",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the load balancer algorithm (source, roundrobin, leastconn)",
+                            "name": "algorithm",
+                            "type": "string"
+                        },
+                        {
+                            "description": "is rule for display to the regular user",
+                            "name": "fordisplay",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "the public ip address id",
+                            "name": "publicipid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of resource tags associated with load balancer",
+                            "name": "tags",
+                            "response": [
+                                {
+                                    "description": "the domain associated with the tag",
+                                    "name": "domain",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the account associated with the tag",
+                                    "name": "account",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the project id the tag belongs to",
+                                    "name": "projectid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "tag key name",
+                                    "name": "key",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "resource type",
+                                    "name": "resourcetype",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "id of the resource",
+                                    "name": "resourceid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the project name where tag belongs to",
+                                    "name": "project",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "tag value",
+                                    "name": "value",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "customer associated with the tag",
+                                    "name": "customer",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the ID of the domain associated with the tag",
+                                    "name": "domainid",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "list"
+                        },
+                        {
+                            "description": "the public ip address",
+                            "name": "publicip",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name of the load balancer",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the protocol of the loadbalanacer rule",
+                            "name": "protocol",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project id of the load balancer",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the id of the guest network the lb rule belongs to",
+                            "name": "networkid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the cidr list to forward traffic from",
+                            "name": "cidrlist",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the description of the load balancer",
+                            "name": "description",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain of the load balancer rule",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the name of the load balancer",
+                            "name": "name",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account of the load balancer rule",
+                            "name": "account",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "Region Id in which global load balancer is created",
+                    "name": "regionid",
+                    "type": "integer"
+                },
+                {
+                    "description": "GSLB service type",
+                    "name": "gslbservicetype",
+                    "type": "string"
+                },
+                {
+                    "description": "the account of the load balancer rule",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain of the load balancer rule",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "session persistence method used for the global load balancer",
+                    "name": "gslbstickysessionmethodname",
+                    "type": "string"
+                },
+                {
+                    "description": "DNS domain name given for the global load balancer",
+                    "name": "gslbdomainname",
+                    "type": "string"
+                },
+                {
+                    "description": "Load balancing method used for the global load balancer",
+                    "name": "gslblbmethod",
+                    "type": "string"
+                },
+                {
+                    "description": "name of the global load balancer rule",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "global load balancer rule ID",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the load balancer",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain ID of the load balancer rule",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the load balancer",
+                    "name": "project",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Updates a disk offering.",
+            "isasync": false,
+            "name": "deleteDiskOffering",
+            "params": [
+                {
+                    "description": "ID of the disk offering",
+                    "length": 255,
+                    "name": "id",
+                    "related": "createDiskOffering,listDiskOfferings",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "List resource tag(s)",
+            "isasync": false,
+            "name": "listTags",
+            "params": [
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "list objects by project",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "listProjectAccounts,suspendProject,activateProject,updateProject,listProjects",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "If set to false, list only resources belonging to the command's caller; if set to true - list resources that the caller is authorized to see. Default value is false",
+                    "length": 255,
+                    "name": "listall",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "list by resource type",
+                    "length": 255,
+                    "name": "resourcetype",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "list only resources belonging to the domain specified",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.",
+                    "length": 255,
+                    "name": "isrecursive",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "list by key",
+                    "length": 255,
+                    "name": "key",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "list resources by account. Must be used with the domainId parameter.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "list by resource id",
+                    "length": 255,
+                    "name": "resourceid",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "list by customer name",
+                    "length": 255,
+                    "name": "customer",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "list by value",
+                    "length": 255,
+                    "name": "value",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the domain associated with the tag",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "resource type",
+                    "name": "resourcetype",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id the tag belongs to",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "customer associated with the tag",
+                    "name": "customer",
+                    "type": "string"
+                },
+                {
+                    "description": "the account associated with the tag",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "id of the resource",
+                    "name": "resourceid",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name where tag belongs to",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "tag key name",
+                    "name": "key",
+                    "type": "string"
+                },
+                {
+                    "description": "tag value",
+                    "name": "value",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the domain associated with the tag",
+                    "name": "domainid",
+                    "type": "string"
+                }
+            ],
+            "since": "4.0.0"
+        },
+        {
+            "description": "Release the dedication for cluster",
+            "isasync": true,
+            "name": "releaseDedicatedCluster",
+            "params": [
+                {
+                    "description": "the ID of the Cluster",
+                    "length": 255,
+                    "name": "clusterid",
+                    "related": "addCluster,updateCluster",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "Create a virtual router element.",
+            "isasync": true,
+            "name": "createVirtualRouterElement",
+            "params": [
+                {
+                    "description": "The provider type. Supported types are VirtualRouter (default) and VPCVirtualRouter",
+                    "length": 255,
+                    "name": "providertype",
+                    "related": "listNetworkServiceProviders",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the network service provider ID of the virtual router element",
+                    "length": 255,
+                    "name": "nspid",
+                    "related": "listNetworkServiceProviders",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "listVirtualRouterElements,configureVirtualRouterElement",
+            "response": [
+                {
+                    "description": "the id of the router",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the account associated with the provider",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain associated with the provider",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "Enabled/Disabled the service provider",
+                    "name": "enabled",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the domain ID associated with the provider",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the physical network service provider id of the provider",
+                    "name": "nspid",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the ipaddress",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the address",
+                    "name": "project",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Creates a VPC",
+            "isasync": true,
+            "name": "createVPC",
+            "params": [
+                {
+                    "description": "VPC network domain. All networks inside the VPC will belong to this domain",
+                    "length": 255,
+                    "name": "networkdomain",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the cidr of the VPC. All VPC guest networks' cidrs should be within this CIDR",
+                    "length": 255,
+                    "name": "cidr",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the VPC",
+                    "length": 255,
+                    "name": "name",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the availability zone",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones,listZones,createZone,updateZone",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the domain ID associated with the VPC. If used with the account parameter returns the VPC associated with the account for the specified domain.",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "create VPC for the project",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "listProjectAccounts,suspendProject,activateProject,updateProject,listProjects",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the account associated with the VPC. Must be used with the domainId parameter.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the display text of the VPC",
+                    "length": 255,
+                    "name": "displaytext",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "an optional field, whether to the display the vpc to the end user or not",
+                    "length": 255,
+                    "name": "fordisplay",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "boolean"
+                },
+                {
+                    "description": "If set to false, the VPC won't start (VPC VR will not get allocated) until its first network gets implemented. True by default.",
+                    "length": 255,
+                    "name": "start",
+                    "required": false,
+                    "since": "4.3",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the ID of the VPC offering",
+                    "length": 255,
+                    "name": "vpcofferingid",
+                    "related": "updateVPCOffering",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "restartVPC,listVPCs,updateVPC,listVPCs,createVPC",
+            "response": [
+                {
+                    "description": "true if VPC is region level",
+                    "name": "regionlevelvpc",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the id of the VPC",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the VPC",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "if this VPC has redundant router",
+                    "name": "redundantvpcrouter",
+                    "type": "boolean"
+                },
+                {
+                    "description": "vpc offering id the VPC is created from",
+                    "name": "vpcofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "is vpc for display to the regular user",
+                    "name": "fordisplay",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the list of resource tags associated with the project",
+                    "name": "tags",
+                    "response": [
+                        {
+                            "description": "id of the resource",
+                            "name": "resourceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project id the tag belongs to",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag key name",
+                            "name": "key",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name where tag belongs to",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account associated with the tag",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag value",
+                            "name": "value",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain associated with the tag",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the domain associated with the tag",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "resource type",
+                            "name": "resourcetype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "customer associated with the tag",
+                            "name": "customer",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "state of the VPC. Can be Inactive/Enabled",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the cidr the VPC",
+                    "name": "cidr",
+                    "type": "string"
+                },
+                {
+                    "description": "the network domain of the VPC",
+                    "name": "networkdomain",
+                    "type": "string"
+                },
+                {
+                    "description": "an alternate display text of the VPC.",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "is VPC uses distributed router for one hop forwarding and host based network ACL's",
+                    "name": "distributedvpcrouter",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the domain id of the VPC owner",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of networks belongign to the VPC",
+                    "name": "network",
+                    "response": [
+                        {
+                            "description": "the displaytext of the network",
+                            "name": "displaytext",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if network supports specifying ip ranges, false otherwise",
+                            "name": "specifyipranges",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "Cloudstack managed address space, all CloudStack managed VMs get IP address from CIDR",
+                            "name": "cidr",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the network's gateway",
+                            "name": "gateway",
+                            "type": "string"
+                        },
+                        {
+                            "description": "related to what other network configuration",
+                            "name": "related",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain name of the network owner",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if network offering is ip conserve mode enabled",
+                            "name": "networkofferingconservemode",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "true if network is system, false otherwise",
+                            "name": "issystem",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "the second DNS for the network",
+                            "name": "dns2",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the network's netmask",
+                            "name": "netmask",
+                            "type": "string"
+                        },
+                        {
+                            "description": "zone id of the network",
+                            "name": "zoneid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the owner of the network",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the name of the zone the network belongs to",
+                            "name": "zonename",
+                            "type": "string"
+                        },
+                        {
+                            "description": "broadcast uri of the network. This parameter is visible to ROOT admins only",
+                            "name": "broadcasturi",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the physical network id",
+                            "name": "physicalnetworkid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the network's IP range not to be used by CloudStack guest VMs and can be used for non CloudStack purposes",
+                            "name": "reservediprange",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of services",
+                            "name": "service",
+                            "response": [
+                                {
+                                    "description": "the service name",
+                                    "name": "name",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the list of capabilities",
+                                    "name": "capability",
+                                    "response": [
+                                        {
+                                            "description": "the capability value",
+                                            "name": "value",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "can this service capability value can be choosable while creatine network offerings",
+                                            "name": "canchooseservicecapability",
+                                            "type": "boolean"
+                                        },
+                                        {
+                                            "description": "the capability name",
+                                            "name": "name",
+                                            "type": "string"
+                                        }
+                                    ],
+                                    "type": "list"
+                                },
+                                {
+                                    "description": "the service provider name",
+                                    "name": "provider",
+                                    "response": [
+                                        {
+                                            "description": "state of the network provider",
+                                            "name": "state",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "services for this provider",
+                                            "name": "servicelist",
+                                            "type": "list"
+                                        },
+                                        {
+                                            "description": "true if individual services can be enabled/disabled",
+                                            "name": "canenableindividualservice",
+                                            "type": "boolean"
+                                        },
+                                        {
+                                            "description": "the physical network this belongs to",
+                                            "name": "physicalnetworkid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "uuid of the network provider",
+                                            "name": "id",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the destination physical network",
+                                            "name": "destinationphysicalnetworkid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the provider name",
+                                            "name": "name",
+                                            "type": "string"
+                                        }
+                                    ],
+                                    "type": "list"
+                                }
+                            ],
+                            "type": "list"
+                        },
+                        {
+                            "description": "the first DNS for the network",
+                            "name": "dns1",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true network requires restart",
+                            "name": "restartrequired",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "name of the network offering the network is created from",
+                            "name": "networkofferingname",
+                            "type": "string"
+                        },
+                        {
+                            "description": "The vlan of the network. This parameter is visible to ROOT admins only",
+                            "name": "vlan",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of resource tags associated with network",
+                            "name": "tags",
+                            "response": [
+                                {
+                                    "description": "the account associated with the tag",
+                                    "name": "account",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "tag key name",
+                                    "name": "key",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the project id the tag belongs to",
+                                    "name": "projectid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the domain associated with the tag",
+                                    "name": "domain",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "customer associated with the tag",
+                                    "name": "customer",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "id of the resource",
+                                    "name": "resourceid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "tag value",
+                                    "name": "value",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the ID of the domain associated with the tag",
+                                    "name": "domainid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "resource type",
+                                    "name": "resourcetype",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the project name where tag belongs to",
+                                    "name": "project",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "list"
+                        },
+                        {
+                            "description": "the project id of the ipaddress",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the network domain",
+                            "name": "networkdomain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "list networks that are persistent",
+                            "name": "ispersistent",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "the cidr of IPv6 network",
+                            "name": "ip6cidr",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the type of the network",
+                            "name": "type",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name of the address",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "an optional field, whether to the display the network to the end user or not.",
+                            "name": "displaynetwork",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "the gateway of IPv6 network",
+                            "name": "ip6gateway",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if users from subdomains can access the domain level network",
+                            "name": "subdomainaccess",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "true if network is default, false otherwise",
+                            "name": "isdefault",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "the network CIDR of the guest network configured with IP reservation. It is the summation of CIDR and RESERVED_IP_RANGE",
+                            "name": "networkcidr",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Broadcast domain type of the network",
+                            "name": "broadcastdomaintype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "availability of the network offering the network is created from",
+                            "name": "networkofferingavailability",
+                            "type": "string"
+                        },
+                        {
+                            "description": "VPC the network belongs to",
+                            "name": "vpcid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the id of the network",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain id of the network owner",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "acl type - access type to the network",
+                            "name": "acltype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "list networks available for vm deployment",
+                            "name": "canusefordeploy",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "the name of the network",
+                            "name": "name",
+                            "type": "string"
+                        },
+                        {
+                            "description": "state of the network",
+                            "name": "state",
+                            "type": "string"
+                        },
+                        {
+                            "description": "ACL Id associated with the VPC network",
+                            "name": "aclid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "display text of the network offering the network is created from",
+                            "name": "networkofferingdisplaytext",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if network can span multiple zones",
+                            "name": "strechedl2subnet",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "the traffic type of the network",
+                            "name": "traffictype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "network offering id the network is created from",
+                            "name": "networkofferingid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "If a network is enabled for 'streched l2 subnet' then represents zones on which network currently spans",
+                            "name": "zonesnetworkspans",
+                            "type": "set"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "zone id of the vpc",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the owner of the VPC",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of supported services",
+                    "name": "service",
+                    "response": [
+                        {
+                            "description": "the service name",
+                            "name": "name",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the service provider name",
+                            "name": "provider",
+                            "response": [
+                                {
+                                    "description": "true if individual services can be enabled/disabled",
+                                    "name": "canenableindividualservice",
+                                    "type": "boolean"
+                                },
+                                {
+                                    "description": "the destination physical network",
+                                    "name": "destinationphysicalnetworkid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "state of the network provider",
+                                    "name": "state",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the physical network this belongs to",
+                                    "name": "physicalnetworkid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "uuid of the network provider",
+                                    "name": "id",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the provider name",
+                                    "name": "name",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "services for this provider",
+                                    "name": "servicelist",
+                                    "type": "list"
+                                }
+                            ],
+                            "type": "list"
+                        },
+                        {
+                            "description": "the list of capabilities",
+                            "name": "capability",
+                            "response": [
+                                {
+                                    "description": "can this service capability value can be choosable while creatine network offerings",
+                                    "name": "canchooseservicecapability",
+                                    "type": "boolean"
+                                },
+                                {
+                                    "description": "the capability name",
+                                    "name": "name",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the capability value",
+                                    "name": "value",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "list"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "the domain name of the owner",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the zone the VPC belongs to",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the date this VPC was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the project name of the VPC",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the VPC",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "true VPC requires restart",
+                    "name": "restartrequired",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "Deletes a autoscale policy.",
+            "isasync": true,
+            "name": "deleteAutoScalePolicy",
+            "params": [
+                {
+                    "description": "the ID of the autoscale policy",
+                    "length": 255,
+                    "name": "id",
+                    "related": "updateAutoScalePolicy,listAutoScalePolicies",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "Deletes a role",
+            "isasync": false,
+            "name": "deleteRole",
+            "params": [
+                {
+                    "description": "ID of the role",
+                    "length": 255,
+                    "name": "id",
+                    "related": "listRoles,createRole",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                },
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                }
+            ],
+            "since": "4.9.0"
+        },
+        {
+            "description": " delete a Cisco Nexus VSM device",
+            "isasync": true,
+            "name": "deleteCiscoNexusVSM",
+            "params": [
+                {
+                    "description": "Id of the Cisco Nexus 1000v VSM device to be deleted",
+                    "length": 255,
+                    "name": "id",
+                    "related": "listCiscoNexusVSMs,disableCiscoNexusVSM",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "List internal LB VMs.",
+            "isasync": false,
+            "name": "listInternalLoadBalancerVMs",
+            "params": [
+                {
+                    "description": "the state of the Internal LB VM",
+                    "length": 255,
+                    "name": "state",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "if true is passed for this parameter, list only VPC Internal LB VMs",
+                    "length": 255,
+                    "name": "forvpc",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "list resources by account. Must be used with the domainId parameter.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.",
+                    "length": 255,
+                    "name": "isrecursive",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "list objects by project",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "listProjectAccounts,suspendProject,activateProject,updateProject,listProjects",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the ID of the Internal LB VM",
+                    "length": 255,
+                    "name": "id",
+                    "related": "updateVMAffinityGroup,detachIso,resetSSHKeyForVirtualMachine,migrateVirtualMachineWithVolume,attachIso,removeNicFromVirtualMachine,recoverVirtualMachine,revertToVMSnapshot,updateVMAffinityGroup,listVirtualMachines,rebootVirtualMachine,restoreVirtualMachine,destroyVirtualMachine,stopVirtualMachine,deployVirtualMachine,detachIso,deployVirtualMachine,updateVirtualMachine,revertToVMSnapshot,resetPasswordForVirtualMachine,startVirtualMachine,updateDefaultNicForVirtualMachine,startVirtualMachine,attachIso,listVirtualMachines,addNicToVirtualMachine,stopVirtualMachine,destroyVirtualMachine,removeNicFromVirtualMachine,changeServiceForVirtualMachine",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list by network id",
+                    "length": 255,
+                    "name": "networkid",
+                    "related": "createNetwork,listSrxFirewallNetworks,updateNetwork,listBrocadeVcsDeviceNetworks,createNetwork,listNetworks,listNetscalerLoadBalancerNetworks,listF5LoadBalancerNetworks",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "the host ID of the Internal LB VM",
+                    "length": 255,
+                    "name": "hostid",
+                    "related": "addBaremetalHost,prepareHostForMaintenance,reconnectHost,addHost,cancelHostMaintenance",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the Zone ID of the Internal LB VM",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones,listZones,createZone,updateZone",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "List Internal LB VMs by VPC",
+                    "length": 255,
+                    "name": "vpcid",
+                    "related": "restartVPC,listVPCs,updateVPC,listVPCs,createVPC",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "If set to false, list only resources belonging to the command's caller; if set to true - list resources that the caller is authorized to see. Default value is false",
+                    "length": 255,
+                    "name": "listall",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "the Pod ID of the Internal LB VM",
+                    "length": 255,
+                    "name": "podid",
+                    "related": "updatePod",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list only resources belonging to the domain specified",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the name of the Internal LB VM",
+                    "length": 255,
+                    "name": "name",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "destroyRouter,listRouters",
+            "response": [
+                {
+                    "description": "the ID of the service offering of the virtual machine",
+                    "name": "serviceofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the corresponding link local network",
+                    "name": "linklocalnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the ipaddress",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the account associated with the router",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the guest IP address for the router",
+                    "name": "guestipaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the corresponding guest network",
+                    "name": "guestnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the address",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "VPC the router belongs to",
+                    "name": "vpcid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the corresponding public network",
+                    "name": "publicnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "the version of scripts",
+                    "name": "scriptsversion",
+                    "type": "string"
+                },
+                {
+                    "description": "role of the domain router",
+                    "name": "role",
+                    "type": "string"
+                },
+                {
+                    "description": "the date and time the router was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the name of the service offering of the virtual machine",
+                    "name": "serviceofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "the template ID for the router",
+                    "name": "templateid",
+                    "type": "string"
+                },
+                {
+                    "description": "the public netmask for the router",
+                    "name": "publicnetmask",
+                    "type": "string"
+                },
+                {
+                    "description": "if this router is an redundant virtual router",
+                    "name": "isredundantrouter",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the host ID for the router",
+                    "name": "hostid",
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone name for the router",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the second IPv6 DNS for the router",
+                    "name": "ip6dns2",
+                    "type": "string"
+                },
+                {
+                    "description": "the public MAC address for the router",
+                    "name": "publicmacaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of VPC the router belongs to",
+                    "name": "vpcname",
+                    "type": "string"
+                },
+                {
+                    "description": "the Pod ID for the router",
+                    "name": "podid",
+                    "type": "string"
+                },
+                {
+                    "description": "true if the router template requires upgrader",
+                    "name": "requiresupgrade",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the link local IP address for the router",
+                    "name": "linklocalip",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the corresponding guest network",
+                    "name": "guestnetworkname",
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone ID for the router",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the hostname for the router",
+                    "name": "hostname",
+                    "type": "string"
+                },
+                {
+                    "description": "the hypervisor on which the template runs",
+                    "name": "hypervisor",
+                    "type": "string"
+                },
+                {
+                    "description": "the first IPv6 DNS for the router",
+                    "name": "ip6dns1",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of the router",
+                    "name": "state",
+                    "type": "state"
+                },
+                {
+                    "description": "the version of template",
+                    "name": "version",
+                    "type": "string"
+                },
+                {
+                    "description": "the second DNS for the router",
+                    "name": "dns2",
+                    "type": "string"
+                },
+                {
+                    "description": "the first DNS for the router",
+                    "name": "dns1",
+                    "type": "string"
+                },
+                {
+                    "description": "the id of the router",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the guest MAC address for the router",
+                    "name": "guestmacaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of nics associated with the router",
+                    "name": "nic",
+                    "response": [
+                        {
+                            "description": "true if nic is default, false otherwise",
+                            "name": "isdefault",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "device id for the network when plugged into the virtual machine",
+                            "name": "deviceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the broadcast uri of the nic",
+                            "name": "broadcasturi",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the NSX Logical Switch (if NSX based), null otherwise",
+                            "name": "nsxlogicalswitch",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the gateway of IPv6 network",
+                            "name": "ip6gateway",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the nic",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the vm to which the nic belongs",
+                            "name": "virtualmachineid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the corresponding network",
+                            "name": "networkid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the isolation uri of the nic",
+                            "name": "isolationuri",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the type of the nic",
+                            "name": "type",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the Secondary ipv4 addr of nic",
+                            "name": "secondaryip",
+                            "type": "list"
+                        },
+                        {
+                            "description": "the ip address of the nic",
+                            "name": "ipaddress",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the cidr of IPv6 network",
+                            "name": "ip6cidr",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the traffic type of the nic",
+                            "name": "traffictype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the gateway of the nic",
+                            "name": "gateway",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the name of the corresponding network",
+                            "name": "networkname",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the netmask of the nic",
+                            "name": "netmask",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if nic is default, false otherwise",
+                            "name": "macaddress",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the NSX Logical Switch Port (if NSX based), null otherwise",
+                            "name": "nsxlogicalswitchport",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the IPv6 address of network",
+                            "name": "ip6address",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "the domain associated with the router",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the network domain for the router",
+                    "name": "networkdomain",
+                    "type": "string"
+                },
+                {
+                    "description": "the link local netmask for the router",
+                    "name": "linklocalnetmask",
+                    "type": "string"
+                },
+                {
+                    "description": "the public IP address for the router",
+                    "name": "publicip",
+                    "type": "string"
+                },
+                {
+                    "description": "the gateway for the router",
+                    "name": "gateway",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of redundant virtual router",
+                    "name": "redundantstate",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain ID associated with the router",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the router",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the link local MAC address for the router",
+                    "name": "linklocalmacaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the guest netmask for the router",
+                    "name": "guestnetmask",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Lists Cisco VNMC controllers",
+            "isasync": false,
+            "name": "listCiscoVnmcResources",
+            "params": [
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "Cisco VNMC resource ID",
+                    "length": 255,
+                    "name": "resourceid",
+                    "related": "listCiscoVnmcResources",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "the Physical Network ID",
+                    "length": 255,
+                    "name": "physicalnetworkid",
+                    "related": "createPhysicalNetwork",
+                    "required": false,
+                    "type": "uuid"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+
+                },
+                {
+
+                },
+                {
+
+                },
+                {
+
+                },
+                {
+
+                }
+            ]
+        },
+        {
+            "description": "Removes detail for the Resource.",
+            "isasync": true,
+            "name": "removeResourceDetail",
+            "params": [
+                {
+                    "description": "Delete details matching key/value pairs",
+                    "length": 255,
+                    "name": "key",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "Delete details for resource id",
+                    "length": 255,
+                    "name": "resourceid",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "Delete detail by resource type",
+                    "length": 255,
+                    "name": "resourcetype",
+                    "required": true,
+                    "type": "string"
+                }
+            ],
+            "response": [
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                },
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Lists all supported OS types for this cloud.",
+            "isasync": false,
+            "name": "listOsTypes",
+            "params": [
+                {
+                    "description": "list by Os Category id",
+                    "length": 255,
+                    "name": "oscategoryid",
+                    "related": "listOsCategories",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "list by Os type Id",
+                    "length": 255,
+                    "name": "id",
+                    "related": "addGuestOs,listOsTypes",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list os by description",
+                    "length": 255,
+                    "name": "description",
+                    "required": false,
+                    "since": "3.0.1",
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                }
+            ],
+            "related": "addGuestOs",
+            "response": [
+                {
+                    "description": "the ID of the OS type",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the OS category",
+                    "name": "oscategoryid",
+                    "type": "string"
+                },
+                {
+                    "description": "is the guest OS user defined",
+                    "name": "isuserdefined",
+                    "type": "string"
+                },
+                {
+                    "description": "the name/description of the OS type",
+                    "name": "description",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Deletes a particular egress rule from this security group",
+            "isasync": true,
+            "name": "revokeSecurityGroupEgress",
+            "params": [
+                {
+                    "description": "The ID of the egress rule",
+                    "length": 255,
+                    "name": "id",
+                    "related": "authorizeSecurityGroupIngress",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                },
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                }
+            ],
+            "since": "3.0.0"
+        },
+        {
+            "description": "Removes a Guest OS from listing.",
+            "isasync": true,
+            "name": "removeGuestOs",
+            "params": [
+                {
+                    "description": "ID of the guest OS",
+                    "length": 255,
+                    "name": "id",
+                    "related": "addGuestOs",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                },
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                }
+            ],
+            "since": "4.4.0"
+        },
+        {
+            "description": "lists network that are using SRX firewall device",
+            "isasync": false,
+            "name": "listSrxFirewallNetworks",
+            "params": [
+                {
+                    "description": "netscaler load balancer device ID",
+                    "length": 255,
+                    "name": "lbdeviceid",
+                    "related": "configureSrxFirewall",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                }
+            ],
+            "related": "createNetwork,updateNetwork,listBrocadeVcsDeviceNetworks,createNetwork,listNetworks,listNetscalerLoadBalancerNetworks,listF5LoadBalancerNetworks",
+            "response": [
+                {
+                    "description": "Broadcast domain type of the network",
+                    "name": "broadcastdomaintype",
+                    "type": "string"
+                },
+                {
+                    "description": "availability of the network offering the network is created from",
+                    "name": "networkofferingavailability",
+                    "type": "string"
+                },
+                {
+                    "description": "the first DNS for the network",
+                    "name": "dns1",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain id of the network owner",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the gateway of IPv6 network",
+                    "name": "ip6gateway",
+                    "type": "string"
+                },
+                {
+                    "description": "the displaytext of the network",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the zone the network belongs to",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the second DNS for the network",
+                    "name": "dns2",
+                    "type": "string"
+                },
+                {
+                    "description": "the traffic type of the network",
+                    "name": "traffictype",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the network",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the owner of the network",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "list networks that are persistent",
+                    "name": "ispersistent",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the domain name of the network owner",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "VPC the network belongs to",
+                    "name": "vpcid",
+                    "type": "string"
+                },
+                {
+                    "description": "list networks available for vm deployment",
+                    "name": "canusefordeploy",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the cidr of IPv6 network",
+                    "name": "ip6cidr",
+                    "type": "string"
+                },
+                {
+                    "description": "true network requires restart",
+                    "name": "restartrequired",
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if network can span multiple zones",
+                    "name": "strechedl2subnet",
+                    "type": "boolean"
+                },
+                {
+                    "description": "state of the network",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "display text of the network offering the network is created from",
+                    "name": "networkofferingdisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "zone id of the network",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "network offering id the network is created from",
+                    "name": "networkofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the address",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the physical network id",
+                    "name": "physicalnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "name of the network offering the network is created from",
+                    "name": "networkofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "true if network offering is ip conserve mode enabled",
+                    "name": "networkofferingconservemode",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the list of services",
+                    "name": "service",
+                    "response": [
+                        {
+                            "description": "the list of capabilities",
+                            "name": "capability",
+                            "response": [
+                                {
+                                    "description": "the capability name",
+                                    "name": "name",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "can this service capability value can be choosable while creatine network offerings",
+                                    "name": "canchooseservicecapability",
+                                    "type": "boolean"
+                                },
+                                {
+                                    "description": "the capability value",
+                                    "name": "value",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "list"
+                        },
+                        {
+                            "description": "the service provider name",
+                            "name": "provider",
+                            "response": [
+                                {
+                                    "description": "the physical network this belongs to",
+                                    "name": "physicalnetworkid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "uuid of the network provider",
+                                    "name": "id",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the destination physical network",
+                                    "name": "destinationphysicalnetworkid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "state of the network provider",
+                                    "name": "state",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the provider name",
+                                    "name": "name",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "services for this provider",
+                                    "name": "servicelist",
+                                    "type": "list"
+                                },
+                                {
+                                    "description": "true if individual services can be enabled/disabled",
+                                    "name": "canenableindividualservice",
+                                    "type": "boolean"
+                                }
+                            ],
+                            "type": "list"
+                        },
+                        {
+                            "description": "the service name",
+                            "name": "name",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "the network's IP range not to be used by CloudStack guest VMs and can be used for non CloudStack purposes",
+                    "name": "reservediprange",
+                    "type": "string"
+                },
+                {
+                    "description": "the network's gateway",
+                    "name": "gateway",
+                    "type": "string"
+                },
+                {
+                    "description": "If a network is enabled for 'streched l2 subnet' then represents zones on which network currently spans",
+                    "name": "zonesnetworkspans",
+                    "type": "set"
+                },
+                {
+                    "description": "related to what other network configuration",
+                    "name": "related",
+                    "type": "string"
+                },
+                {
+                    "description": "true if users from subdomains can access the domain level network",
+                    "name": "subdomainaccess",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the network domain",
+                    "name": "networkdomain",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of resource tags associated with network",
+                    "name": "tags",
+                    "response": [
+                        {
+                            "description": "resource type",
+                            "name": "resourcetype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project id the tag belongs to",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "customer associated with the tag",
+                            "name": "customer",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account associated with the tag",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the domain associated with the tag",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain associated with the tag",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name where tag belongs to",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag value",
+                            "name": "value",
+                            "type": "string"
+                        },
+                        {
+                            "description": "id of the resource",
+                            "name": "resourceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag key name",
+                            "name": "key",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "ACL Id associated with the VPC network",
+                    "name": "aclid",
+                    "type": "string"
+                },
+                {
+                    "description": "the network CIDR of the guest network configured with IP reservation. It is the summation of CIDR and RESERVED_IP_RANGE",
+                    "name": "networkcidr",
+                    "type": "string"
+                },
+                {
+                    "description": "the network's netmask",
+                    "name": "netmask",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the ipaddress",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the type of the network",
+                    "name": "type",
+                    "type": "string"
+                },
+                {
+                    "description": "acl type - access type to the network",
+                    "name": "acltype",
+                    "type": "string"
+                },
+                {
+                    "description": "Cloudstack managed address space, all CloudStack managed VMs get IP address from CIDR",
+                    "name": "cidr",
+                    "type": "string"
+                },
+                {
+                    "description": "true if network is default, false otherwise",
+                    "name": "isdefault",
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if network is system, false otherwise",
+                    "name": "issystem",
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if network supports specifying ip ranges, false otherwise",
+                    "name": "specifyipranges",
+                    "type": "boolean"
+                },
+                {
+                    "description": "broadcast uri of the network. This parameter is visible to ROOT admins only",
+                    "name": "broadcasturi",
+                    "type": "string"
+                },
+                {
+                    "description": "the id of the network",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "The vlan of the network. This parameter is visible to ROOT admins only",
+                    "name": "vlan",
+                    "type": "string"
+                },
+                {
+                    "description": "an optional field, whether to the display the network to the end user or not.",
+                    "name": "displaynetwork",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "Detaches any ISO file (if any) currently attached to a virtual machine.",
+            "isasync": true,
+            "name": "detachIso",
+            "params": [
+                {
+                    "description": "The ID of the virtual machine",
+                    "length": 255,
+                    "name": "virtualmachineid",
+                    "related": "updateVMAffinityGroup,detachIso,resetSSHKeyForVirtualMachine,migrateVirtualMachineWithVolume,attachIso,removeNicFromVirtualMachine,recoverVirtualMachine,revertToVMSnapshot,updateVMAffinityGroup,listVirtualMachines,rebootVirtualMachine,restoreVirtualMachine,destroyVirtualMachine,stopVirtualMachine,deployVirtualMachine,detachIso,deployVirtualMachine,updateVirtualMachine,revertToVMSnapshot,resetPasswordForVirtualMachine,startVirtualMachine,updateDefaultNicForVirtualMachine,startVirtualMachine,attachIso,listVirtualMachines,addNicToVirtualMachine,stopVirtualMachine,destroyVirtualMachine,removeNicFromVirtualMachine,changeServiceForVirtualMachine",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "updateVMAffinityGroup,resetSSHKeyForVirtualMachine,migrateVirtualMachineWithVolume,attachIso,removeNicFromVirtualMachine,recoverVirtualMachine,revertToVMSnapshot,updateVMAffinityGroup,listVirtualMachines,rebootVirtualMachine,restoreVirtualMachine,destroyVirtualMachine,stopVirtualMachine,deployVirtualMachine,detachIso,deployVirtualMachine,updateVirtualMachine,revertToVMSnapshot,resetPasswordForVirtualMachine,startVirtualMachine,updateDefaultNicForVirtualMachine,startVirtualMachine,attachIso,listVirtualMachines,addNicToVirtualMachine,stopVirtualMachine,destroyVirtualMachine,removeNicFromVirtualMachine,changeServiceForVirtualMachine",
+            "response": [
+                {
+                    "description": "the name of the template for the virtual machine",
+                    "name": "templatename",
+                    "type": "string"
+                },
+                {
+                    "description": "true if the password rest feature is enabled, false otherwise",
+                    "name": "passwordenabled",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the speed of each cpu",
+                    "name": "cpuspeed",
+                    "type": "integer"
+                },
+                {
+                    "description": "the list of nics associated with vm",
+                    "name": "nic",
+                    "response": [
+                        {
+                            "description": "the netmask of the nic",
+                            "name": "netmask",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the IPv6 address of network",
+                            "name": "ip6address",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the NSX Logical Switch Port (if NSX based), null otherwise",
+                            "name": "nsxlogicalswitchport",
+                            "type": "string"
+                        },
+                        {
+                            "description": "device id for the network when plugged into the virtual machine",
+                            "name": "deviceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the name of the corresponding network",
+                            "name": "networkname",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the corresponding network",
+                            "name": "networkid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the type of the nic",
+                            "name": "type",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the traffic type of the nic",
+                            "name": "traffictype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if nic is default, false otherwise",
+                            "name": "isdefault",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "the gateway of the nic",
+                            "name": "gateway",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the gateway of IPv6 network",
+                            "name": "ip6gateway",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the vm to which the nic belongs",
+                            "name": "virtualmachineid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the broadcast uri of the nic",
+                            "name": "broadcasturi",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the Secondary ipv4 addr of nic",
+                            "name": "secondaryip",
+                            "type": "list"
+                        },
+                        {
+                            "description": "the isolation uri of the nic",
+                            "name": "isolationuri",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the nic",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if nic is default, false otherwise",
+                            "name": "macaddress",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ip address of the nic",
+                            "name": "ipaddress",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the cidr of IPv6 network",
+                            "name": "ip6cidr",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the NSX Logical Switch (if NSX based), null otherwise",
+                            "name": "nsxlogicalswitch",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "public IP address id associated with vm via Static nat rule",
+                    "name": "publicip",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the template for the virtual machine. A -1 is returned if the virtual machine was created from an ISO file.",
+                    "name": "templateid",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of the virtual machine",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "ssh key-pair",
+                    "name": "keypair",
+                    "type": "string"
+                },
+                {
+                    "description": "Os type ID of the virtual machine",
+                    "name": "guestosid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the domain in which the virtual machine exists",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "device ID of the root volume",
+                    "name": "rootdeviceid",
+                    "type": "long"
+                },
+                {
+                    "description": "an alternate display text of the ISO attached to the virtual machine",
+                    "name": "isodisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "Vm details in key/value pairs.",
+                    "name": "details",
+                    "type": "map"
+                },
+                {
+                    "description": "the number of cpu this virtual machine is running with",
+                    "name": "cpunumber",
+                    "type": "integer"
+                },
+                {
+                    "description": "the ID of the host for the virtual machine",
+                    "name": "hostid",
+                    "type": "string"
+                },
+                {
+                    "description": "the date when this virtual machine was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the project name of the vm",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "State of the Service from LB rule",
+                    "name": "servicestate",
+                    "type": "string"
+                },
+                {
+                    "description": "the read (bytes) of disk on the vm",
+                    "name": "diskkbsread",
+                    "type": "long"
+                },
+                {
+                    "description": "the ID of the availablility zone for the virtual machine",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the vm",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "true if high-availability is enabled, false otherwise",
+                    "name": "haenable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "public IP address id associated with vm via Static nat rule",
+                    "name": "publicipid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the service offering of the virtual machine",
+                    "name": "serviceofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "the user's ID who deployed the virtual machine",
+                    "name": "userid",
+                    "type": "string"
+                },
+                {
+                    "description": "the write (bytes) of disk on the vm",
+                    "name": "diskkbswrite",
+                    "type": "long"
+                },
+                {
+
+                },
+                {
+                    "description": "the group ID of the virtual machine",
+                    "name": "groupid",
+                    "type": "string"
+                },
+                {
+                    "description": "the amount of the vm's CPU currently used",
+                    "name": "cpuused",
+                    "type": "string"
+                },
+                {
+                    "description": "the virtual network for the service offering",
+                    "name": "forvirtualnetwork",
+                    "type": "boolean"
+                },
+                {
+                    "description": "list of security groups associated with the virtual machine",
+                    "name": "securitygroup",
+                    "response": [
+                        {
+                            "description": "the project name of the group",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account owning the security group",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain ID of the security group",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the security group",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project id of the group",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the name of the security group",
+                            "name": "name",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of resource tags associated with the rule",
+                            "name": "tags",
+                            "response": [
+                                {
+                                    "description": "the ID of the domain associated with the tag",
+                                    "name": "domainid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the domain associated with the tag",
+                                    "name": "domain",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "tag key name",
+                                    "name": "key",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "resource type",
+                                    "name": "resourcetype",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "id of the resource",
+                                    "name": "resourceid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "customer associated with the tag",
+                                    "name": "customer",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the account associated with the tag",
+                                    "name": "account",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the project id the tag belongs to",
+                                    "name": "projectid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the project name where tag belongs to",
+                                    "name": "project",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "tag value",
+                                    "name": "value",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "set"
+                        },
+                        {
+                            "description": "the description of the security group",
+                            "name": "description",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of egress rules associated with the security group",
+                            "name": "egressrule",
+                            "response": [
+                                {
+                                    "description": "the CIDR notation for the base IP address of the security group rule",
+                                    "name": "cidr",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the protocol of the security group rule",
+                                    "name": "protocol",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the type of the ICMP message response",
+                                    "name": "icmptype",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the list of resource tags associated with the rule",
+                                    "name": "tags",
+                                    "response": [
+                                        {
+                                            "description": "tag value",
+                                            "name": "value",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the account associated with the tag",
+                                            "name": "account",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag key name",
+                                            "name": "key",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the domain associated with the tag",
+                                            "name": "domain",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "customer associated with the tag",
+                                            "name": "customer",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project id the tag belongs to",
+                                            "name": "projectid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project name where tag belongs to",
+                                            "name": "project",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "resource type",
+                                            "name": "resourcetype",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "id of the resource",
+                                            "name": "resourceid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the ID of the domain associated with the tag",
+                                            "name": "domainid",
+                                            "type": "string"
+                                        }
+                                    ],
+                                    "type": "set"
+                                },
+                                {
+                                    "description": "the ending IP of the security group rule ",
+                                    "name": "endport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "security group name",
+                                    "name": "securitygroupname",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "account owning the security group rule",
+                                    "name": "account",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the id of the security group rule",
+                                    "name": "ruleid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the starting IP of the security group rule",
+                                    "name": "startport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the code for the ICMP message response",
+                                    "name": "icmpcode",
+                                    "type": "integer"
+                                }
+                            ],
+                            "type": "set"
+                        },
+                        {
+                            "description": "the list of virtualmachine ids associated with this securitygroup",
+                            "name": "virtualmachineids",
+                            "type": "set"
+                        },
+                        {
+                            "description": "the number of virtualmachines associated with this securitygroup",
+                            "name": "virtualmachinecount",
+                            "type": "integer"
+                        },
+                        {
+                            "description": "the list of ingress rules associated with the security group",
+                            "name": "ingressrule",
+                            "response": [
+                                {
+                                    "description": "the starting IP of the security group rule",
+                                    "name": "startport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the id of the security group rule",
+                                    "name": "ruleid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the list of resource tags associated with the rule",
+                                    "name": "tags",
+                                    "response": [
+                                        {
+                                            "description": "tag value",
+                                            "name": "value",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "id of the resource",
+                                            "name": "resourceid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag key name",
+                                            "name": "key",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "resource type",
+                                            "name": "resourcetype",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project name where tag belongs to",
+                                            "name": "project",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project id the tag belongs to",
+                                            "name": "projectid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the ID of the domain associated with the tag",
+                                            "name": "domainid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "customer associated with the tag",
+                                            "name": "customer",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the domain associated with the tag",
+                                            "name": "domain",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the account associated with the tag",
+                                            "name": "account",
+                                            "type": "string"
+                                        }
+                                    ],
+                                    "type": "set"
+                                },
+                                {
+                                    "description": "security group name",
+                                    "name": "securitygroupname",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the ending IP of the security group rule ",
+                                    "name": "endport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "account owning the security group rule",
+                                    "name": "account",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the type of the ICMP message response",
+                                    "name": "icmptype",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the code for the ICMP message response",
+                                    "name": "icmpcode",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the protocol of the security group rule",
+                                    "name": "protocol",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the CIDR notation for the base IP address of the security group rule",
+                                    "name": "cidr",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "set"
+                        },
+                        {
+                            "description": "the domain name of the security group",
+                            "name": "domain",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "user generated name. The name of the virtual machine is returned if no displayname exists.",
+                    "name": "displayname",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the availability zone for the virtual machine",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "OS type id of the vm",
+                    "name": "ostypeid",
+                    "type": "long"
+                },
+                {
+                    "description": "the target memory in vm",
+                    "name": "memorytargetkbs",
+                    "type": "long"
+                },
+                {
+                    "description": "device type of the root volume",
+                    "name": "rootdevicetype",
+                    "type": "string"
+                },
+                {
+                    "description": "the hypervisor on which the template runs",
+                    "name": "hypervisor",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the ISO attached to the virtual machine",
+                    "name": "isoname",
+                    "type": "string"
+                },
+                {
+                    "description": " an alternate display text of the template for the virtual machine",
+                    "name": "templatedisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "the outgoing network traffic on the host",
+                    "name": "networkkbswrite",
+                    "type": "long"
+                },
+                {
+                    "description": "the name of the virtual machine",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the disk offering of the virtual machine",
+                    "name": "diskofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the service offering of the virtual machine",
+                    "name": "serviceofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "the account associated with the virtual machine",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the disk offering of the virtual machine",
+                    "name": "diskofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the ISO attached to the virtual machine",
+                    "name": "isoid",
+                    "type": "string"
+                },
+                {
+                    "description": "the memory allocated for the virtual machine",
+                    "name": "memory",
+                    "type": "integer"
+                },
+                {
+                    "description": "the vgpu type used by the virtual machine",
+                    "name": "vgpu",
+                    "type": "string"
+                },
+                {
+                    "description": "the internal memory thats free in vm",
+                    "name": "memoryintfreekbs",
+                    "type": "long"
+                },
+                {
+                    "description": "an optional field whether to the display the vm to the end user or not.",
+                    "name": "displayvm",
+                    "type": "boolean"
+                },
+                {
+                    "description": "instance name of the user vm; this parameter is returned to the ROOT admin only",
+                    "name": "instancename",
+                    "type": "string"
+                },
+                {
+                    "description": "the read (io) of disk on the vm",
+                    "name": "diskioread",
+                    "type": "long"
+                },
+                {
+                    "description": "the name of the domain in which the virtual machine exists",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the virtual machine",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the password (if exists) of the virtual machine",
+                    "name": "password",
+                    "type": "string"
+                },
+                {
+                    "description": "the group name of the virtual machine",
+                    "name": "group",
+                    "type": "string"
+                },
+                {
+                    "description": "list of affinity groups associated with the virtual machine",
+                    "name": "affinitygroup",
+                    "response": [
+                        {
+                            "description": "the account owning the affinity group",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name of the affinity group",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "virtual machine IDs associated with this affinity group",
+                            "name": "virtualmachineIds",
+                            "type": "list"
+                        },
+                        {
+                            "description": "the name of the affinity group",
+                            "name": "name",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain ID of the affinity group",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain name of the affinity group",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project ID of the affinity group",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the description of the affinity group",
+                            "name": "description",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the type of the affinity group",
+                            "name": "type",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the affinity group",
+                            "name": "id",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "the memory used by the vm",
+                    "name": "memorykbs",
+                    "type": "long"
+                },
+                {
+                    "description": "the incoming network traffic on the vm",
+                    "name": "networkkbsread",
+                    "type": "long"
+                },
+                {
+                    "description": "the write (io) of disk on the vm",
+                    "name": "diskiowrite",
+                    "type": "long"
+                },
+                {
+                    "description": "the user's name who deployed the virtual machine",
+                    "name": "username",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the host for the virtual machine",
+                    "name": "hostname",
+                    "type": "string"
+                },
+                {
+                    "description": "true if vm contains XS/VMWare tools inorder to support dynamic scaling of VM cpu/memory.",
+                    "name": "isdynamicallyscalable",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": " delete a Palo Alto firewall device",
+            "isasync": true,
+            "name": "deletePaloAltoFirewall",
+            "params": [
+                {
+                    "description": "Palo Alto firewall device ID",
+                    "length": 255,
+                    "name": "fwdeviceid",
+                    "related": "configurePaloAltoFirewall,listPaloAltoFirewalls,addPaloAltoFirewall",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                },
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Deletes a Pod.",
+            "isasync": false,
+            "name": "deletePod",
+            "params": [
+                {
+                    "description": "the ID of the Pod",
+                    "length": 255,
+                    "name": "id",
+                    "related": "updatePod",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                },
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Lists all DeploymentPlanners available.",
+            "isasync": false,
+            "name": "listDeploymentPlanners",
+            "params": [
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "Deployment Planner name",
+                    "name": "name",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Deletes a cluster.",
+            "isasync": false,
+            "name": "deleteCluster",
+            "params": [
+                {
+                    "description": "the cluster ID",
+                    "length": 255,
+                    "name": "id",
+                    "related": "addCluster,updateCluster",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "Prepares a host for maintenance.",
+            "isasync": true,
+            "name": "prepareHostForMaintenance",
+            "params": [
+                {
+                    "description": "the host ID",
+                    "length": 255,
+                    "name": "id",
+                    "related": "addBaremetalHost,prepareHostForMaintenance,reconnectHost,addHost,cancelHostMaintenance",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "addBaremetalHost,reconnectHost,addHost,cancelHostMaintenance",
+            "response": [
+                {
+                    "description": "true if the host is disconnected. False otherwise.",
+                    "name": "disconnected",
+                    "type": "date"
+                },
+                {
+                    "description": "the amount of the host's memory currently used",
+                    "name": "memoryused",
+                    "type": "long"
+                },
+                {
+                    "description": "the hypervisor version",
+                    "name": "hypervisorversion",
+                    "type": "string"
+                },
+                {
+                    "description": "the amount of the host's CPU after applying the cpu.overprovisioning.factor ",
+                    "name": "cpuwithoverprovisioning",
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone ID of the host",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the management server ID of the host",
+                    "name": "managementserverid",
+                    "type": "long"
+                },
+                {
+                    "description": "the outgoing network traffic on the host",
+                    "name": "networkkbswrite",
+                    "type": "long"
+                },
+                {
+                    "description": "capabilities of the host",
+                    "name": "capabilities",
+                    "type": "string"
+                },
+                {
+                    "description": "true if local storage is active, false otherwise",
+                    "name": "islocalstorageactive",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the state of the host",
+                    "name": "state",
+                    "type": "status"
+                },
+                {
+                    "description": "the OS category name of the host",
+                    "name": "oscategoryname",
+                    "type": "string"
+                },
+                {
+                    "description": "the Pod ID of the host",
+                    "name": "podid",
+                    "type": "string"
+                },
+                {
+                    "description": "the host's currently allocated disk size",
+                    "name": "disksizeallocated",
+                    "type": "long"
+                },
+                {
+                    "description": "comma-separated list of tags for the host",
+                    "name": "hosttags",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the host",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the cluster type of the cluster that host belongs to",
+                    "name": "clustertype",
+                    "type": "string"
+                },
+                {
+                    "description": "the total disk size of the host",
+                    "name": "disksizetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the amount of the host's CPU currently allocated",
+                    "name": "cpuallocated",
+                    "type": "string"
+                },
+                {
+                    "description": "true if this host is suitable(has enough capacity and satisfies all conditions like hosttags, max guests vm limit etc) to migrate a VM to it , false otherwise",
+                    "name": "suitableformigration",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the Zone name of the host",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the host version",
+                    "name": "version",
+                    "type": "string"
+                },
+                {
+                    "description": "the amount of the host's CPU currently used",
+                    "name": "cpuused",
+                    "type": "string"
+                },
+                {
+                    "description": "the date and time the host was removed",
+                    "name": "removed",
+                    "type": "date"
+                },
+                {
+                    "description": "true if this host has enough CPU and RAM capacity to migrate a VM to it, false otherwise",
+                    "name": "hasenoughcapacity",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the date and time the host was last pinged",
+                    "name": "lastpinged",
+                    "type": "date"
+                },
+                {
+                    "description": "the IP address of the host",
+                    "name": "ipaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the number of CPU sockets on the host",
+                    "name": "cpusockets",
+                    "type": "integer"
+                },
+                {
+                    "description": "the CPU number of the host",
+                    "name": "cpunumber",
+                    "type": "integer"
+                },
+                {
+                    "description": "Host details in key/value pairs.",
+                    "name": "details",
+                    "type": "map"
+                },
+                {
+                    "description": "the CPU speed of the host",
+                    "name": "cpuspeed",
+                    "type": "long"
+                },
+                {
+                    "description": "the Pod name of the host",
+                    "name": "podname",
+                    "type": "string"
+                },
+                {
+                    "description": "the cluster ID of the host",
+                    "name": "clusterid",
+                    "type": "string"
+                },
+                {
+                    "description": "the cluster name of the host",
+                    "name": "clustername",
+                    "type": "string"
+                },
+                {
+                    "description": "the date and time the host was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the host hypervisor",
+                    "name": "hypervisor",
+                    "type": "hypervisortype"
+                },
+                {
+                    "description": "the host out-of-band management information",
+                    "name": "outofbandmanagement",
+                    "type": "outofbandmanagementresponse"
+                },
+                {
+                    "description": "the memory total of the host",
+                    "name": "memorytotal",
+                    "type": "long"
+                },
+                {
+                    "description": "GPU cards present in the host",
+                    "name": "gpugroup",
+                    "response": [
+                        {
+                            "description": "GPU cards present in the host",
+                            "name": "gpugroupname",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of enabled vGPUs",
+                            "name": "vgpu",
+                            "response": [
+                                {
+                                    "description": "Maximum vgpu can be created with this vgpu type on the given gpu group",
+                                    "name": "maxcapacity",
+                                    "type": "long"
+                                },
+                                {
+                                    "description": "Maximum Y resolution per display",
+                                    "name": "maxresolutiony",
+                                    "type": "long"
+                                },
+                                {
+                                    "description": "Video RAM for this vGPU type",
+                                    "name": "videoram",
+                                    "type": "long"
+                                },
+                                {
+                                    "description": "Maximum X resolution per display",
+                                    "name": "maxresolutionx",
+                                    "type": "long"
+                                },
+                                {
+                                    "description": "Remaining capacity in terms of no. of more VMs that can be deployped with this vGPU type",
+                                    "name": "remainingcapacity",
+                                    "type": "long"
+                                },
+                                {
+                                    "description": "Maximum no. of vgpu per gpu card (pgpu)",
+                                    "name": "maxvgpuperpgpu",
+                                    "type": "long"
+                                },
+                                {
+                                    "description": "Maximum displays per user",
+                                    "name": "maxheads",
+                                    "type": "long"
+                                },
+                                {
+                                    "description": "Model Name of vGPU",
+                                    "name": "vgputype",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "list"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "true if the host is Ha host (dedicated to vms started by HA process; false otherwise",
+                    "name": "hahost",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the host type",
+                    "name": "type",
+                    "type": "type"
+                },
+                {
+                    "description": "the name of the host",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "events available for the host",
+                    "name": "events",
+                    "type": "string"
+                },
+                {
+                    "description": "the amount of the host's memory currently allocated",
+                    "name": "memoryallocated",
+                    "type": "long"
+                },
+                {
+                    "description": "the incoming network traffic on the host",
+                    "name": "networkkbsread",
+                    "type": "long"
+                },
+                {
+                    "description": "the resource state of the host",
+                    "name": "resourcestate",
+                    "type": "string"
+                },
+                {
+                    "description": "the OS category ID of the host",
+                    "name": "oscategoryid",
+                    "type": "string"
+                },
+                {
+                    "description": "the cpu average load on the host",
+                    "name": "averageload",
+                    "type": "long"
+                }
+            ]
+        },
+        {
+            "description": "Creates a role",
+            "isasync": false,
+            "name": "createRole",
+            "params": [
+                {
+                    "description": "The type of the role, valid options are: Admin, ResourceAdmin, DomainAdmin, User",
+                    "length": 255,
+                    "name": "type",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "creates a role with this unique name",
+                    "length": 255,
+                    "name": "name",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "The description of the role",
+                    "length": 255,
+                    "name": "description",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "listRoles",
+            "response": [
+                {
+                    "description": "the ID of the role",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the type of the role",
+                    "name": "type",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the role",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the description of the role",
+                    "name": "description",
+                    "type": "string"
+                }
+            ],
+            "since": "4.9.0"
+        },
+        {
+            "description": "Removes specified region",
+            "isasync": false,
+            "name": "removeRegion",
+            "params": [
+                {
+                    "description": "ID of the region to delete",
+                    "length": 255,
+                    "name": "id",
+                    "required": true,
+                    "type": "integer"
+                }
+            ],
+            "response": [
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "Get Volume's iSCSI Name",
+            "isasync": false,
+            "name": "getVolumeiScsiName",
+            "params": [
+                {
+                    "description": "CloudStack Volume UUID",
+                    "length": 255,
+                    "name": "volumeid",
+                    "required": true,
+                    "type": "string"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "Volume iSCSI Name",
+                    "name": "volumeiScsiName",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Upload a data disk to the cloudstack cloud.",
+            "isasync": false,
+            "name": "getUploadParamsForVolume",
+            "params": [
+                {
+                    "description": "the MD5 checksum value of this volume/template",
+                    "length": 255,
+                    "name": "checksum",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the format for the volume/template. Possible values include QCOW2, OVA, and VHD.",
+                    "length": 255,
+                    "name": "format",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the disk offering. This must be a custom sized offering since during upload of volume/template size is unknown.",
+                    "length": 255,
+                    "name": "diskofferingid",
+                    "related": "createDiskOffering,listDiskOfferings",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the name of the volume/template",
+                    "length": 255,
+                    "name": "name",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the zone the volume/template is to be hosted on",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones,listZones,createZone,updateZone",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "Upload volume/template for the project",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "listProjectAccounts,suspendProject,activateProject,updateProject,listProjects",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "an optional domainId. If the account parameter is used, domainId must also be used.",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "Image store uuid",
+                    "length": 255,
+                    "name": "imagestoreuuid",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "an optional accountName. Must be used with domainId.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "getUploadParamsForTemplate",
+            "response": [
+                {
+                    "description": "signature to be sent in the POST request.",
+                    "name": "signature",
+                    "type": "string"
+                },
+                {
+                    "description": "the timestamp after which the signature expires",
+                    "name": "expires",
+                    "type": "string"
+                },
+                {
+                    "description": "the template/volume ID",
+                    "name": "id",
+                    "type": "uuid"
+                },
+                {
+                    "description": "POST url to upload the file to",
+                    "name": "postURL",
+                    "type": "url"
+                },
+                {
+                    "description": "encrypted data to be sent in the POST request.",
+                    "name": "metadata",
+                    "type": "string"
+                }
+            ],
+            "since": "4.6.0"
+        },
+        {
+            "description": "Updates an existing autoscale vm profile.",
+            "isasync": true,
+            "name": "updateAutoScaleVmProfile",
+            "params": [
+                {
+                    "description": "an optional field, whether to the display the profile to the end user or not",
+                    "length": 255,
+                    "name": "fordisplay",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the ID of the autoscale vm profile",
+                    "length": 255,
+                    "name": "id",
+                    "related": "updateAutoScaleVmProfile,listAutoScaleVmProfiles,createAutoScaleVmProfile",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the ID of the user used to launch and destroy the VMs",
+                    "length": 255,
+                    "name": "autoscaleuserid",
+                    "related": "disableUser,lockUser,enableUser,getUser,listUsers,updateUser,createUser",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the template of the auto deployed virtual machine",
+                    "length": 255,
+                    "name": "templateid",
+                    "related": "registerTemplate,listIsos,copyTemplate,registerTemplate,listTemplates,registerIso,registerIso,listIsos,createTemplate,copyIso",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "an optional field, in case you want to set a custom id to the resource. Allowed to Root Admins only",
+                    "length": 255,
+                    "name": "customid",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "string"
+                },
+                {
+                    "description": "the time allowed for existing connections to get closed before a vm is destroyed",
+                    "length": 255,
+                    "name": "destroyvmgraceperiod",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "counterparam list. Example: counterparam[0].name=snmpcommunity&counterparam[0].value=public&counterparam[1].name=snmpport&counterparam[1].value=161",
+                    "length": 255,
+                    "name": "counterparam",
+                    "required": false,
+                    "type": "map"
+                }
+            ],
+            "related": "listAutoScaleVmProfiles,createAutoScaleVmProfile",
+            "response": [
+                {
+                    "description": "the autoscale vm profile ID",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "is profile for display to the regular user",
+                    "name": "fordisplay",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the availability zone to be used while deploying a virtual machine",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the time allowed for existing connections to get closed before a vm is destroyed",
+                    "name": "destroyvmgraceperiod",
+                    "type": "integer"
+                },
+                {
+                    "description": "the domain ID of the vm profile",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain name of the vm profile",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id vm profile",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "parameters other than zoneId/serviceOfferringId/templateId to be used while deploying a virtual machine",
+                    "name": "otherdeployparams",
+                    "type": "string"
+                },
+                {
+                    "description": "the account owning the instance group",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the user used to launch and destroy the VMs",
+                    "name": "autoscaleuserid",
+                    "type": "string"
+                },
+                {
+                    "description": "the service offering to be used while deploying a virtual machine",
+                    "name": "serviceofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "the template to be used while deploying a virtual machine",
+                    "name": "templateid",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the vm profile",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+
+                },
+                {
+
+                }
+            ]
+        },
+        {
+            "description": "Updates an existing autoscale vm group.",
+            "isasync": true,
+            "name": "updateAutoScaleVmGroup",
+            "params": [
+                {
+                    "description": "list of scaleup autoscale policies",
+                    "length": 255,
+                    "name": "scaleuppolicyids",
+                    "related": "updateAutoScalePolicy,listAutoScalePolicies",
+                    "required": false,
+                    "type": "list"
+                },
+                {
+                    "description": "an optional field, whether to the display the group to the end user or not",
+                    "length": 255,
+                    "name": "fordisplay",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the minimum number of members in the vmgroup, the number of instances in the vm group will be equal to or more than this number.",
+                    "length": 255,
+                    "name": "minmembers",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "an optional field, in case you want to set a custom id to the resource. Allowed to Root Admins only",
+                    "length": 255,
+                    "name": "customid",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "string"
+                },
+                {
+                    "description": "list of scaledown autoscale policies",
+                    "length": 255,
+                    "name": "scaledownpolicyids",
+                    "related": "updateAutoScalePolicy,listAutoScalePolicies",
+                    "required": false,
+                    "type": "list"
+                },
+                {
+                    "description": "the maximum number of members in the vmgroup, The number of instances in the vm group will be equal to or less than this number.",
+                    "length": 255,
+                    "name": "maxmembers",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "the ID of the autoscale group",
+                    "length": 255,
+                    "name": "id",
+                    "related": "enableAutoScaleVmGroup,updateAutoScaleVmGroup,listAutoScaleVmGroups",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the frequency at which the conditions have to be evaluated",
+                    "length": 255,
+                    "name": "interval",
+                    "required": false,
+                    "type": "integer"
+                }
+            ],
+            "related": "enableAutoScaleVmGroup,listAutoScaleVmGroups",
+            "response": [
+                {
+                    "description": "is group for display to the regular user",
+                    "name": "fordisplay",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the load balancer rule ID",
+                    "name": "lbruleid",
+                    "type": "string"
+                },
+                {
+                    "description": "the current state of the AutoScale Vm Group",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "list of scaleup autoscale policies",
+                    "name": "scaleuppolicies",
+                    "type": "list"
+                },
+                {
+                    "description": "the account owning the instance group",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the vm profile",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain ID of the vm profile",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain name of the vm profile",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the autoscale profile that contains information about the vms in the vm group.",
+                    "name": "vmprofileid",
+                    "type": "string"
+                },
+                {
+                    "description": "the minimum number of members in the vmgroup, the number of instances in the vm group will be equal to or more than this number.",
+                    "name": "minmembers",
+                    "type": "int"
+                },
+                {
+                    "description": "the maximum number of members in the vmgroup, The number of instances in the vm group will be equal to or less than this number.",
+                    "name": "maxmembers",
+                    "type": "int"
+                },
+                {
+                    "description": "the project id vm profile",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the autoscale vm group ID",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the frequency at which the conditions have to be evaluated",
+                    "name": "interval",
+                    "type": "int"
+                },
+                {
+                    "description": "list of scaledown autoscale policies",
+                    "name": "scaledownpolicies",
+                    "type": "list"
+                }
+            ]
+        },
+        {
+            "description": "Enables an AutoScale Vm Group",
+            "isasync": true,
+            "name": "enableAutoScaleVmGroup",
+            "params": [
+                {
+                    "description": "the ID of the autoscale group",
+                    "length": 255,
+                    "name": "id",
+                    "related": "enableAutoScaleVmGroup,listAutoScaleVmGroups",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "listAutoScaleVmGroups",
+            "response": [
+                {
+                    "description": "the frequency at which the conditions have to be evaluated",
+                    "name": "interval",
+                    "type": "int"
+                },
+                {
+                    "description": "the project id vm profile",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain ID of the vm profile",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the maximum number of members in the vmgroup, The number of instances in the vm group will be equal to or less than this number.",
+                    "name": "maxmembers",
+                    "type": "int"
+                },
+                {
+                    "description": "the autoscale vm group ID",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain name of the vm profile",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the load balancer rule ID",
+                    "name": "lbruleid",
+                    "type": "string"
+                },
+                {
+                    "description": "the current state of the AutoScale Vm Group",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the account owning the instance group",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the vm profile",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "list of scaledown autoscale policies",
+                    "name": "scaledownpolicies",
+                    "type": "list"
+                },
+                {
+                    "description": "the autoscale profile that contains information about the vms in the vm group.",
+                    "name": "vmprofileid",
+                    "type": "string"
+                },
+                {
+                    "description": "the minimum number of members in the vmgroup, the number of instances in the vm group will be equal to or more than this number.",
+                    "name": "minmembers",
+                    "type": "int"
+                },
+                {
+                    "description": "is group for display to the regular user",
+                    "name": "fordisplay",
+                    "type": "boolean"
+                },
+                {
+                    "description": "list of scaleup autoscale policies",
+                    "name": "scaleuppolicies",
+                    "type": "list"
+                }
+            ]
+        },
+        {
+            "description": "Deletes a snapshot of a disk volume.",
+            "isasync": true,
+            "name": "deleteSnapshot",
+            "params": [
+                {
+                    "description": "The ID of the snapshot",
+                    "length": 255,
+                    "name": "id",
+                    "related": "revertSnapshot",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "List the virtual machines owned by the account.",
+            "isasync": false,
+            "name": "listVirtualMachines",
+            "params": [
+                {
+                    "description": "the host ID",
+                    "length": 255,
+                    "name": "hostid",
+                    "related": "addBaremetalHost,reconnectHost,addHost,cancelHostMaintenance",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the group ID",
+                    "length": 255,
+                    "name": "groupid",
+                    "related": "createInstanceGroup",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list by network id",
+                    "length": 255,
+                    "name": "networkid",
+                    "related": "createNetwork,updateNetwork,listBrocadeVcsDeviceNetworks,createNetwork,listNetworks,listNetscalerLoadBalancerNetworks,listF5LoadBalancerNetworks",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "list only resources belonging to the domain specified",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list vms by template",
+                    "length": 255,
+                    "name": "templateid",
+                    "related": "registerTemplate,listIsos,copyTemplate,registerTemplate,listTemplates,registerIso,registerIso,listIsos,createTemplate,copyIso",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list by the service offering",
+                    "length": 255,
+                    "name": "serviceofferingid",
+                    "related": "updateServiceOffering,listServiceOfferings",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "uuid"
+                },
+                {
+                    "description": "the IDs of the virtual machines, mutually exclusive with id",
+                    "length": 255,
+                    "name": "ids",
+                    "related": "updateVMAffinityGroup,resetSSHKeyForVirtualMachine,migrateVirtualMachineWithVolume,attachIso,removeNicFromVirtualMachine,recoverVirtualMachine,revertToVMSnapshot,updateVMAffinityGroup,listVirtualMachines,rebootVirtualMachine,restoreVirtualMachine,destroyVirtualMachine,stopVirtualMachine,deployVirtualMachine,detachIso,deployVirtualMachine,updateVirtualMachine,revertToVMSnapshot,resetPasswordForVirtualMachine,startVirtualMachine,updateDefaultNicForVirtualMachine,startVirtualMachine,attachIso,listVirtualMachines,addNicToVirtualMachine,stopVirtualMachine,destroyVirtualMachine,removeNicFromVirtualMachine,changeServiceForVirtualMachine",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "list"
+                },
+                {
+                    "description": "List resources by tags (key/value pairs)",
+                    "length": 255,
+                    "name": "tags",
+                    "required": false,
+                    "type": "map"
+                },
+                {
+                    "description": "list objects by project",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "listProjectAccounts,suspendProject,activateProject,updateProject,listProjects",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "name of the virtual machine (a substring match is made against the parameter value, data for all matching VMs will be returned)",
+                    "length": 255,
+                    "name": "name",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "list vms by iso",
+                    "length": 255,
+                    "name": "isoid",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.",
+                    "length": 255,
+                    "name": "isrecursive",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "list vms by affinity group",
+                    "length": 255,
+                    "name": "affinitygroupid",
+                    "related": "",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list resources by display flag; only ROOT admin is eligible to pass this parameter",
+                    "length": 255,
+                    "name": "displayvm",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "boolean"
+                },
+                {
+                    "description": "list vms by vpc",
+                    "length": 255,
+                    "name": "vpcid",
+                    "related": "restartVPC,listVPCs,updateVPC,listVPCs,createVPC",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the availability zone ID",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones,listZones,createZone,updateZone",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "If set to false, list only resources belonging to the command's caller; if set to true - list resources that the caller is authorized to see. Default value is false",
+                    "length": 255,
+                    "name": "listall",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "list resources by account. Must be used with the domainId parameter.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the storage ID where vm's volumes belong to",
+                    "length": 255,
+                    "name": "storageid",
+                    "related": "createStoragePool,findStoragePoolsForMigration,enableStorageMaintenance,cancelStorageMaintenance",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the pod ID",
+                    "length": 255,
+                    "name": "podid",
+                    "related": "updatePod",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the ID of the virtual machine",
+                    "length": 255,
+                    "name": "id",
+                    "related": "updateVMAffinityGroup,resetSSHKeyForVirtualMachine,migrateVirtualMachineWithVolume,attachIso,removeNicFromVirtualMachine,recoverVirtualMachine,revertToVMSnapshot,updateVMAffinityGroup,listVirtualMachines,rebootVirtualMachine,restoreVirtualMachine,destroyVirtualMachine,stopVirtualMachine,deployVirtualMachine,detachIso,deployVirtualMachine,updateVirtualMachine,revertToVMSnapshot,resetPasswordForVirtualMachine,startVirtualMachine,updateDefaultNicForVirtualMachine,startVirtualMachine,attachIso,listVirtualMachines,addNicToVirtualMachine,stopVirtualMachine,destroyVirtualMachine,removeNicFromVirtualMachine,changeServiceForVirtualMachine",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "state of the virtual machine. Possible values are: Running, Stopped, Present, Destroyed, Expunged. Present is used for the state equal not destroyed.",
+                    "length": 255,
+                    "name": "state",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the host ID",
+                    "length": 255,
+                    "name": "hostid",
+                    "related": "addBaremetalHost,reconnectHost,addHost,cancelHostMaintenance",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list vms by ssh keypair name",
+                    "length": 255,
+                    "name": "keypair",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "list by network type; true if need to list vms using Virtual Network, false otherwise",
+                    "length": 255,
+                    "name": "forvirtualnetwork",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "the user ID that created the VM and is under the account that owns the VM",
+                    "length": 255,
+                    "name": "userid",
+                    "related": "disableUser,lockUser,enableUser,getUser,listUsers,updateUser,createUser",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the target hypervisor for the template",
+                    "length": 255,
+                    "name": "hypervisor",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the storage ID where vm's volumes belong to",
+                    "length": 255,
+                    "name": "storageid",
+                    "related": "createStoragePool,findStoragePoolsForMigration,enableStorageMaintenance,cancelStorageMaintenance",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the pod ID",
+                    "length": 255,
+                    "name": "podid",
+                    "related": "updatePod",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "comma separated list of host details requested, value can be a list of [all, group, nics, stats, secgrp, tmpl, servoff, diskoff, iso, volume, min, affgrp]. If no parameter is passed in, the details will be defaulted to all",
+                    "length": 255,
+                    "name": "details",
+                    "required": false,
+                    "type": "list"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                }
+            ],
+            "related": "updateVMAffinityGroup,resetSSHKeyForVirtualMachine,migrateVirtualMachineWithVolume,attachIso,removeNicFromVirtualMachine,recoverVirtualMachine,revertToVMSnapshot,updateVMAffinityGroup,rebootVirtualMachine,restoreVirtualMachine,destroyVirtualMachine,stopVirtualMachine,deployVirtualMachine,detachIso,deployVirtualMachine,updateVirtualMachine,revertToVMSnapshot,resetPasswordForVirtualMachine,startVirtualMachine,updateDefaultNicForVirtualMachine,startVirtualMachine,attachIso,listVirtualMachines,addNicToVirtualMachine,stopVirtualMachine,destroyVirtualMachine,removeNicFromVirtualMachine,changeServiceForVirtualMachine",
+            "response": [
+                {
+                    "description": "the user's ID who deployed the virtual machine",
+                    "name": "userid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the host for the virtual machine",
+                    "name": "hostname",
+                    "type": "string"
+                },
+                {
+                    "description": "the account associated with the virtual machine",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the service offering of the virtual machine",
+                    "name": "serviceofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of the virtual machine",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the availablility zone for the virtual machine",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the number of cpu this virtual machine is running with",
+                    "name": "cpunumber",
+                    "type": "integer"
+                },
+                {
+                    "description": "ssh key-pair",
+                    "name": "keypair",
+                    "type": "string"
+                },
+                {
+                    "description": "list of affinity groups associated with the virtual machine",
+                    "name": "affinitygroup",
+                    "response": [
+                        {
+                            "description": "the ID of the affinity group",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project ID of the affinity group",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account owning the affinity group",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain ID of the affinity group",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "virtual machine IDs associated with this affinity group",
+                            "name": "virtualmachineIds",
+                            "type": "list"
+                        },
+                        {
+                            "description": "the description of the affinity group",
+                            "name": "description",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the type of the affinity group",
+                            "name": "type",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the name of the affinity group",
+                            "name": "name",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain name of the affinity group",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name of the affinity group",
+                            "name": "project",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "the incoming network traffic on the vm",
+                    "name": "networkkbsread",
+                    "type": "long"
+                },
+                {
+                    "description": "true if the password rest feature is enabled, false otherwise",
+                    "name": "passwordenabled",
+                    "type": "boolean"
+                },
+                {
+                    "description": "public IP address id associated with vm via Static nat rule",
+                    "name": "publicipid",
+                    "type": "string"
+                },
+                {
+                    "description": "an alternate display text of the ISO attached to the virtual machine",
+                    "name": "isodisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "the hypervisor on which the template runs",
+                    "name": "hypervisor",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the ISO attached to the virtual machine",
+                    "name": "isoname",
+                    "type": "string"
+                },
+                {
+                    "description": "the read (bytes) of disk on the vm",
+                    "name": "diskkbsread",
+                    "type": "long"
+                },
+                {
+                    "description": "the target memory in vm",
+                    "name": "memorytargetkbs",
+                    "type": "long"
+                },
+                {
+                    "description": "the name of the domain in which the virtual machine exists",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the password (if exists) of the virtual machine",
+                    "name": "password",
+                    "type": "string"
+                },
+                {
+                    "description": "State of the Service from LB rule",
+                    "name": "servicestate",
+                    "type": "string"
+                },
+                {
+                    "description": "OS type id of the vm",
+                    "name": "ostypeid",
+                    "type": "long"
+                },
+                {
+                    "description": "the name of the disk offering of the virtual machine",
+                    "name": "diskofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "the group ID of the virtual machine",
+                    "name": "groupid",
+                    "type": "string"
+                },
+                {
+                    "description": "the virtual network for the service offering",
+                    "name": "forvirtualnetwork",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the name of the template for the virtual machine",
+                    "name": "templatename",
+                    "type": "string"
+                },
+                {
+                    "description": "device type of the root volume",
+                    "name": "rootdevicetype",
+                    "type": "string"
+                },
+                {
+
+                },
+                {
+                    "description": "the date when this virtual machine was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "device ID of the root volume",
+                    "name": "rootdeviceid",
+                    "type": "long"
+                },
+                {
+                    "description": "the project name of the vm",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "true if vm contains XS/VMWare tools inorder to support dynamic scaling of VM cpu/memory.",
+                    "name": "isdynamicallyscalable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the ID of the template for the virtual machine. A -1 is returned if the virtual machine was created from an ISO file.",
+                    "name": "templateid",
+                    "type": "string"
+                },
+                {
+                    "description": "list of security groups associated with the virtual machine",
+                    "name": "securitygroup",
+                    "response": [
+                        {
+                            "description": "the list of virtualmachine ids associated with this securitygroup",
+                            "name": "virtualmachineids",
+                            "type": "set"
+                        },
+                        {
+                            "description": "the description of the security group",
+                            "name": "description",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the security group",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of resource tags associated with the rule",
+                            "name": "tags",
+                            "response": [
+                                {
+                                    "description": "id of the resource",
+                                    "name": "resourceid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the project id the tag belongs to",
+                                    "name": "projectid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "tag value",
+                                    "name": "value",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the ID of the domain associated with the tag",
+                                    "name": "domainid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "tag key name",
+                                    "name": "key",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the domain associated with the tag",
+                                    "name": "domain",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the account associated with the tag",
+                                    "name": "account",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "customer associated with the tag",
+                                    "name": "customer",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "resource type",
+                                    "name": "resourcetype",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the project name where tag belongs to",
+                                    "name": "project",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "set"
+                        },
+                        {
+                            "description": "the account owning the security group",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name of the group",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of ingress rules associated with the security group",
+                            "name": "ingressrule",
+                            "response": [
+                                {
+                                    "description": "the starting IP of the security group rule",
+                                    "name": "startport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the id of the security group rule",
+                                    "name": "ruleid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the CIDR notation for the base IP address of the security group rule",
+                                    "name": "cidr",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the type of the ICMP message response",
+                                    "name": "icmptype",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "security group name",
+                                    "name": "securitygroupname",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "account owning the security group rule",
+                                    "name": "account",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the list of resource tags associated with the rule",
+                                    "name": "tags",
+                                    "response": [
+                                        {
+                                            "description": "tag value",
+                                            "name": "value",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "resource type",
+                                            "name": "resourcetype",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "customer associated with the tag",
+                                            "name": "customer",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the account associated with the tag",
+                                            "name": "account",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the domain associated with the tag",
+                                            "name": "domain",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag key name",
+                                            "name": "key",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the ID of the domain associated with the tag",
+                                            "name": "domainid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "id of the resource",
+                                            "name": "resourceid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project id the tag belongs to",
+                                            "name": "projectid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project name where tag belongs to",
+                                            "name": "project",
+                                            "type": "string"
+                                        }
+                                    ],
+                                    "type": "set"
+                                },
+                                {
+                                    "description": "the protocol of the security group rule",
+                                    "name": "protocol",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the code for the ICMP message response",
+                                    "name": "icmpcode",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the ending IP of the security group rule ",
+                                    "name": "endport",
+                                    "type": "integer"
+                                }
+                            ],
+                            "type": "set"
+                        },
+                        {
+                            "description": "the name of the security group",
+                            "name": "name",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain name of the security group",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain ID of the security group",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of egress rules associated with the security group",
+                            "name": "egressrule",
+                            "response": [
+                                {
+                                    "description": "the type of the ICMP message response",
+                                    "name": "icmptype",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the CIDR notation for the base IP address of the security group rule",
+                                    "name": "cidr",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "account owning the security group rule",
+                                    "name": "account",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "security group name",
+                                    "name": "securitygroupname",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the starting IP of the security group rule",
+                                    "name": "startport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the ending IP of the security group rule ",
+                                    "name": "endport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the code for the ICMP message response",
+                                    "name": "icmpcode",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the protocol of the security group rule",
+                                    "name": "protocol",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the list of resource tags associated with the rule",
+                                    "name": "tags",
+                                    "response": [
+                                        {
+                                            "description": "resource type",
+                                            "name": "resourcetype",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the account associated with the tag",
+                                            "name": "account",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the domain associated with the tag",
+                                            "name": "domain",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project id the tag belongs to",
+                                            "name": "projectid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag value",
+                                            "name": "value",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project name where tag belongs to",
+                                            "name": "project",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "id of the resource",
+                                            "name": "resourceid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the ID of the domain associated with the tag",
+                                            "name": "domainid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag key name",
+                                            "name": "key",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "customer associated with the tag",
+                                            "name": "customer",
+                                            "type": "string"
+                                        }
+                                    ],
+                                    "type": "set"
+                                },
+                                {
+                                    "description": "the id of the security group rule",
+                                    "name": "ruleid",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "set"
+                        },
+                        {
+                            "description": "the project id of the group",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the number of virtualmachines associated with this securitygroup",
+                            "name": "virtualmachinecount",
+                            "type": "integer"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "the outgoing network traffic on the host",
+                    "name": "networkkbswrite",
+                    "type": "long"
+                },
+                {
+                    "description": "the ID of the domain in which the virtual machine exists",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "Vm details in key/value pairs.",
+                    "name": "details",
+                    "type": "map"
+                },
+                {
+                    "description": "the ID of the disk offering of the virtual machine",
+                    "name": "diskofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "the write (bytes) of disk on the vm",
+                    "name": "diskkbswrite",
+                    "type": "long"
+                },
+                {
+                    "description": "the user's name who deployed the virtual machine",
+                    "name": "username",
+                    "type": "string"
+                },
+                {
+                    "description": "public IP address id associated with vm via Static nat rule",
+                    "name": "publicip",
+                    "type": "string"
+                },
+                {
+                    "description": "the amount of the vm's CPU currently used",
+                    "name": "cpuused",
+                    "type": "string"
+                },
+                {
+                    "description": "user generated name. The name of the virtual machine is returned if no displayname exists.",
+                    "name": "displayname",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the service offering of the virtual machine",
+                    "name": "serviceofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": " an alternate display text of the template for the virtual machine",
+                    "name": "templatedisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "the memory used by the vm",
+                    "name": "memorykbs",
+                    "type": "long"
+                },
+                {
+                    "description": "the list of nics associated with vm",
+                    "name": "nic",
+                    "response": [
+                        {
+                            "description": "the name of the corresponding network",
+                            "name": "networkname",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the IPv6 address of network",
+                            "name": "ip6address",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if nic is default, false otherwise",
+                            "name": "macaddress",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the cidr of IPv6 network",
+                            "name": "ip6cidr",
+                            "type": "string"
+                        },
+                        {
+                            "description": "device id for the network when plugged into the virtual machine",
+                            "name": "deviceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the NSX Logical Switch Port (if NSX based), null otherwise",
+                            "name": "nsxlogicalswitchport",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the traffic type of the nic",
+                            "name": "traffictype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the gateway of IPv6 network",
+                            "name": "ip6gateway",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the corresponding network",
+                            "name": "networkid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the gateway of the nic",
+                            "name": "gateway",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if nic is default, false otherwise",
+                            "name": "isdefault",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "the ip address of the nic",
+                            "name": "ipaddress",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the netmask of the nic",
+                            "name": "netmask",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the vm to which the nic belongs",
+                            "name": "virtualmachineid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the NSX Logical Switch (if NSX based), null otherwise",
+                            "name": "nsxlogicalswitch",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the nic",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the isolation uri of the nic",
+                            "name": "isolationuri",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the type of the nic",
+                            "name": "type",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the broadcast uri of the nic",
+                            "name": "broadcasturi",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the Secondary ipv4 addr of nic",
+                            "name": "secondaryip",
+                            "type": "list"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "the ID of the virtual machine",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "an optional field whether to the display the vm to the end user or not.",
+                    "name": "displayvm",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the vgpu type used by the virtual machine",
+                    "name": "vgpu",
+                    "type": "string"
+                },
+                {
+                    "description": "the memory allocated for the virtual machine",
+                    "name": "memory",
+                    "type": "integer"
+                },
+                {
+                    "description": "the name of the virtual machine",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the host for the virtual machine",
+                    "name": "hostid",
+                    "type": "string"
+                },
+                {
+                    "description": "the internal memory thats free in vm",
+                    "name": "memoryintfreekbs",
+                    "type": "long"
+                },
+                {
+                    "description": "true if high-availability is enabled, false otherwise",
+                    "name": "haenable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the ID of the ISO attached to the virtual machine",
+                    "name": "isoid",
+                    "type": "string"
+                },
+                {
+                    "description": "instance name of the user vm; this parameter is returned to the ROOT admin only",
+                    "name": "instancename",
+                    "type": "string"
+                },
+                {
+                    "description": "the speed of each cpu",
+                    "name": "cpuspeed",
+                    "type": "integer"
+                },
+                {
+                    "description": "the read (io) of disk on the vm",
+                    "name": "diskioread",
+                    "type": "long"
+                },
+                {
+                    "description": "the write (io) of disk on the vm",
+                    "name": "diskiowrite",
+                    "type": "long"
+                },
+                {
+                    "description": "the group name of the virtual machine",
+                    "name": "group",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the availability zone for the virtual machine",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the vm",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "Os type ID of the virtual machine",
+                    "name": "guestosid",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Updates the information about Guest OS to Hypervisor specific name mapping",
+            "isasync": true,
+            "name": "updateGuestOsMapping",
+            "params": [
+                {
+                    "description": "UUID of the Guest OS to hypervisor name Mapping",
+                    "length": 255,
+                    "name": "id",
+                    "related": "updateGuestOsMapping",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "Hypervisor specific name for this Guest OS",
+                    "length": 255,
+                    "name": "osnameforhypervisor",
+                    "required": true,
+                    "type": "string"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "standard display name for the Guest OS",
+                    "name": "osdisplayname",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the Guest OS mapping",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "version of the hypervisor for mapping",
+                    "name": "hypervisorversion",
+                    "type": "string"
+                },
+                {
+                    "description": "is the mapping user defined",
+                    "name": "isuserdefined",
+                    "type": "string"
+                },
+                {
+                    "description": "the hypervisor",
+                    "name": "hypervisor",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the Guest OS type",
+                    "name": "ostypeid",
+                    "type": "string"
+                },
+                {
+                    "description": "hypervisor specific name for the Guest OS",
+                    "name": "osnameforhypervisor",
+                    "type": "string"
+                }
+            ],
+            "since": "4.4.0"
+        },
+        {
+            "description": "Lists all available disk offerings.",
+            "isasync": false,
+            "name": "listDiskOfferings",
+            "params": [
+                {
+                    "description": "list only resources belonging to the domain specified",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "name of the disk offering",
+                    "length": 255,
+                    "name": "name",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "ID of the disk offering",
+                    "length": 255,
+                    "name": "id",
+                    "related": "createDiskOffering,listDiskOfferings",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.",
+                    "length": 255,
+                    "name": "isrecursive",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "If set to false, list only resources belonging to the command's caller; if set to true - list resources that the caller is authorized to see. Default value is false",
+                    "length": 255,
+                    "name": "listall",
+                    "required": false,
+                    "type": "boolean"
+                }
+            ],
+            "related": "createDiskOffering",
+            "response": [
+                {
+                    "description": "the size of the disk offering in GB",
+                    "name": "disksize",
+                    "type": "long"
+                },
+                {
+                    "description": "io requests read rate of the disk offering",
+                    "name": "diskIopsReadRate",
+                    "type": "long"
+                },
+                {
+                    "description": "true if disk offering uses custom iops, false otherwise",
+                    "name": "iscustomizediops",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the storage type for this disk offering",
+                    "name": "storagetype",
+                    "type": "string"
+                },
+                {
+                    "description": "provisioning type used to create volumes. Valid values are thin, sparse, fat.",
+                    "name": "provisioningtype",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain name this disk offering belongs to. Ignore this information as it is not currently applicable.",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the disk offering",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the min iops of the disk offering",
+                    "name": "miniops",
+                    "type": "long"
+                },
+                {
+                    "description": "bytes read rate of the disk offering",
+                    "name": "diskBytesReadRate",
+                    "type": "long"
+                },
+                {
+                    "description": "the domain ID this disk offering belongs to. Ignore this information as it is not currently applicable.",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "unique ID of the disk offering",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the date this disk offering was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "whether to display the offering to the end user or not.",
+                    "name": "displayoffering",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the max iops of the disk offering",
+                    "name": "maxiops",
+                    "type": "long"
+                },
+                {
+                    "description": "bytes write rate of the disk offering",
+                    "name": "diskBytesWriteRate",
+                    "type": "long"
+                },
+                {
+                    "description": "io requests write rate of the disk offering",
+                    "name": "diskIopsWriteRate",
+                    "type": "long"
+                },
+                {
+                    "description": "Hypervisor snapshot reserve space as a percent of a volume (for managed storage using Xen or VMware)",
+                    "name": "hypervisorsnapshotreserve",
+                    "type": "integer"
+                },
+                {
+                    "description": "the cache mode to use for this disk offering. none, writeback or writethrough",
+                    "name": "cacheMode",
+                    "type": "string"
+                },
+                {
+                    "description": "true if disk offering uses custom size, false otherwise",
+                    "name": "iscustomized",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the tags for the disk offering",
+                    "name": "tags",
+                    "type": "string"
+                },
+                {
+                    "description": "an alternate display text of the disk offering.",
+                    "name": "displaytext",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Update password of a host/pool on management server.",
+            "isasync": false,
+            "name": "updateHostPassword",
+            "params": [
+                {
+                    "description": "the host ID",
+                    "length": 255,
+                    "name": "hostid",
+                    "related": "addBaremetalHost,reconnectHost,addHost,cancelHostMaintenance",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "if the password should also be updated on the hosts",
+                    "length": 255,
+                    "name": "update_passwd_on_host",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "the username for the host/cluster",
+                    "length": 255,
+                    "name": "username",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the cluster ID",
+                    "length": 255,
+                    "name": "clusterid",
+                    "related": "addCluster,updateCluster",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the new password for the host/cluster",
+                    "length": 255,
+                    "name": "password",
+                    "required": true,
+                    "type": "string"
+                }
+            ],
+            "response": [
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "adds a range of portable public IP's to a region",
+            "isasync": true,
+            "name": "createPortableIpRange",
+            "params": [
+                {
+                    "description": "the netmask of the portable IP range",
+                    "length": 255,
+                    "name": "netmask",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the gateway for the portable IP range",
+                    "length": 255,
+                    "name": "gateway",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the beginning IP address in the portable IP range",
+                    "length": 255,
+                    "name": "startip",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the ending IP address in the portable IP range",
+                    "length": 255,
+                    "name": "endip",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "VLAN id, if not specified defaulted to untagged",
+                    "length": 255,
+                    "name": "vlan",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "Id of the Region",
+                    "length": 255,
+                    "name": "regionid",
+                    "related": "addRegion,listRegions",
+                    "required": true,
+                    "type": "integer"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the start ip of the portable IP range",
+                    "name": "startip",
+                    "type": "string"
+                },
+                {
+                    "description": "Region Id in which portable ip range is provisioned",
+                    "name": "regionid",
+                    "type": "integer"
+                },
+                {
+                    "description": "the ID or VID of the VLAN.",
+                    "name": "vlan",
+                    "type": "string"
+                },
+                {
+                    "description": "the end ip of the portable IP range",
+                    "name": "endip",
+                    "type": "string"
+                },
+                {
+                    "description": "portable IP range ID",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "List of portable IP and association with zone/network/vpc details that are part of GSLB rule",
+                    "name": "portableipaddress",
+                    "response": [
+                        {
+                            "description": "public IP address",
+                            "name": "ipaddress",
+                            "type": "string"
+                        },
+                        {
+                            "description": "State of the ip address. Can be: Allocatin, Allocated and Releasing",
+                            "name": "state",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Region Id in which global load balancer is created",
+                            "name": "regionid",
+                            "type": "integer"
+                        },
+                        {
+                            "description": "the ID of the zone the public IP address belongs to",
+                            "name": "zoneid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the Network where ip belongs to",
+                            "name": "networkid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "VPC the ip belongs to",
+                            "name": "vpcid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain ID the portable IP address is associated with",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the physical network this belongs to",
+                            "name": "physicalnetworkid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account ID the portable IP address is associated with",
+                            "name": "accountid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "date the portal IP address was acquired",
+                            "name": "allocated",
+                            "type": "date"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "the netmask of the VLAN IP range",
+                    "name": "netmask",
+                    "type": "string"
+                },
+                {
+                    "description": "the gateway of the VLAN IP range",
+                    "name": "gateway",
+                    "type": "string"
+                }
+            ],
+            "since": "4.2.0"
+        },
+        {
+            "description": "Deletes a Cisco ASA 1000v appliance",
+            "isasync": false,
+            "name": "deleteCiscoAsa1000vResource",
+            "params": [
+                {
+                    "description": "Cisco ASA 1000v resource ID",
+                    "length": 255,
+                    "name": "resourceid",
+                    "related": "addCiscoAsa1000vResource,listCiscoAsa1000vResources",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "Updates an existing cluster",
+            "isasync": false,
+            "name": "updateCluster",
+            "params": [
+                {
+                    "description": "hypervisor type of the cluster",
+                    "length": 255,
+                    "name": "clustertype",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "Allocation state of this cluster for allocation of new resources",
+                    "length": 255,
+                    "name": "allocationstate",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the cluster name",
+                    "length": 255,
+                    "name": "clustername",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "hypervisor type of the cluster",
+                    "length": 255,
+                    "name": "hypervisor",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "whether this cluster is managed by cloudstack",
+                    "length": 255,
+                    "name": "managedstate",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the Cluster",
+                    "length": 255,
+                    "name": "id",
+                    "related": "addCluster,updateCluster",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "addCluster",
+            "response": [
+                {
+                    "description": "whether this cluster is managed by cloudstack",
+                    "name": "managedstate",
+                    "type": "string"
+                },
+                {
+                    "description": "the Pod ID of the cluster",
+                    "name": "podid",
+                    "type": "string"
+                },
+                {
+                    "description": "the cluster name",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the capacity of the Cluster",
+                    "name": "capacity",
+                    "response": [
+                        {
+                            "description": "the capacity currently in use",
+                            "name": "capacityused",
+                            "type": "long"
+                        },
+                        {
+                            "description": "the total capacity available",
+                            "name": "capacitytotal",
+                            "type": "long"
+                        },
+                        {
+                            "description": "the capacity type",
+                            "name": "type",
+                            "type": "short"
+                        },
+                        {
+                            "description": "the Cluster ID",
+                            "name": "clusterid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the Pod ID",
+                            "name": "podid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the Pod name",
+                            "name": "podname",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the percentage of capacity currently in use",
+                            "name": "percentused",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the Zone name",
+                            "name": "zonename",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the Cluster name",
+                            "name": "clustername",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the Zone ID",
+                            "name": "zoneid",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "the type of the cluster",
+                    "name": "clustertype",
+                    "type": "string"
+                },
+                {
+                    "description": "the allocation state of the cluster",
+                    "name": "allocationstate",
+                    "type": "string"
+                },
+                {
+                    "description": "the cluster ID",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "Meta data associated with the zone (key/value pairs)",
+                    "name": "resourcedetails",
+                    "type": "map"
+                },
+                {
+                    "description": "The cpu overcommit ratio of the cluster",
+                    "name": "cpuovercommitratio",
+                    "type": "string"
+                },
+                {
+                    "description": "the Pod name of the cluster",
+                    "name": "podname",
+                    "type": "string"
+                },
+                {
+                    "description": "The memory overcommit ratio of the cluster",
+                    "name": "memoryovercommitratio",
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone name of the cluster",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the hypervisor type of the cluster",
+                    "name": "hypervisortype",
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone ID of the cluster",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "Ovm3 VIP to use for pooling and/or clustering",
+                    "name": "ovm3vip",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "List profile in ucs manager",
+            "isasync": false,
+            "name": "listUcsProfiles",
+            "params": [
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "the id for the ucs manager",
+                    "length": 255,
+                    "name": "ucsmanagerid",
+                    "related": "addUcsManager",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "ucs profile dn",
+                    "name": "ucsdn",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Lists storage providers.",
+            "isasync": false,
+            "name": "listStorageProviders",
+            "params": [
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "the type of storage provider: either primary or image",
+                    "length": 255,
+                    "name": "type",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the type of the storage provider: primary or image provider",
+                    "name": "type",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the storage provider",
+                    "name": "name",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "update global load balancer rules.",
+            "isasync": true,
+            "name": "updateGlobalLoadBalancerRule",
+            "params": [
+                {
+                    "description": "session sticky method (sourceip) if not specified defaults to sourceip",
+                    "length": 255,
+                    "name": "gslbstickysessionmethodname",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the description of the load balancer rule",
+                    "length": 4096,
+                    "name": "description",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "load balancer algorithm (roundrobin, leastconn, proximity) that is used to distributed traffic across the zones participating in global server load balancing, if not specified defaults to 'round robin'",
+                    "length": 255,
+                    "name": "gslblbmethod",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the global load balancer rule",
+                    "length": 255,
+                    "name": "id",
+                    "related": "updateGlobalLoadBalancerRule",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "List of load balancer rules that are part of GSLB rule",
+                    "name": "loadbalancerrule",
+                    "response": [
+                        {
+                            "description": "the description of the load balancer",
+                            "name": "description",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the public ip address id",
+                            "name": "publicipid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the load balancer rule ID",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the id of the zone the rule belongs to",
+                            "name": "zoneid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "is rule for display to the regular user",
+                            "name": "fordisplay",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "the load balancer algorithm (source, roundrobin, leastconn)",
+                            "name": "algorithm",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of resource tags associated with load balancer",
+                            "name": "tags",
+                            "response": [
+                                {
+                                    "description": "the ID of the domain associated with the tag",
+                                    "name": "domainid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "resource type",
+                                    "name": "resourcetype",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "customer associated with the tag",
+                                    "name": "customer",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the account associated with the tag",
+                                    "name": "account",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the domain associated with the tag",
+                                    "name": "domain",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "tag key name",
+                                    "name": "key",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the project id the tag belongs to",
+                                    "name": "projectid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the project name where tag belongs to",
+                                    "name": "project",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "id of the resource",
+                                    "name": "resourceid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "tag value",
+                                    "name": "value",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "list"
+                        },
+                        {
+                            "description": "the account of the load balancer rule",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the private port",
+                            "name": "privateport",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name of the load balancer",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the public ip address",
+                            "name": "publicip",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the id of the guest network the lb rule belongs to",
+                            "name": "networkid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the public port",
+                            "name": "publicport",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the state of the rule",
+                            "name": "state",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain ID of the load balancer rule",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain of the load balancer rule",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the cidr list to forward traffic from",
+                            "name": "cidrlist",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the protocol of the loadbalanacer rule",
+                            "name": "protocol",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the name of the load balancer",
+                            "name": "name",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project id of the load balancer",
+                            "name": "projectid",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "DNS domain name given for the global load balancer",
+                    "name": "gslbdomainname",
+                    "type": "string"
+                },
+                {
+                    "description": "the account of the load balancer rule",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "session persistence method used for the global load balancer",
+                    "name": "gslbstickysessionmethodname",
+                    "type": "string"
+                },
+                {
+                    "description": "global load balancer rule ID",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain ID of the load balancer rule",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "Region Id in which global load balancer is created",
+                    "name": "regionid",
+                    "type": "integer"
+                },
+                {
+                    "description": "the project id of the load balancer",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "name of the global load balancer rule",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "Load balancing method used for the global load balancer",
+                    "name": "gslblbmethod",
+                    "type": "string"
+                },
+                {
+                    "description": "GSLB service type",
+                    "name": "gslbservicetype",
+                    "type": "string"
+                },
+                {
+                    "description": "the description of the global load balancer rule",
+                    "name": "description",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain of the load balancer rule",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the load balancer",
+                    "name": "project",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Creates a condition",
+            "isasync": true,
+            "name": "createCondition",
+            "params": [
+                {
+                    "description": "ID of the Counter.",
+                    "length": 255,
+                    "name": "counterid",
+                    "related": "createCounter,listCounters",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the domain ID of the account.",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "Relational Operator to be used with threshold.",
+                    "length": 255,
+                    "name": "relationaloperator",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the account of the condition. Must be used with the domainId parameter.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "Threshold value.",
+                    "length": 255,
+                    "name": "threshold",
+                    "required": true,
+                    "type": "long"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the domain name of the owner.",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the Condition.",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the owner of the Condition.",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "Details of the Counter.",
+                    "name": "counter",
+                    "type": "list"
+                },
+                {
+                    "description": "Threshold Value for the counter.",
+                    "name": "threshold",
+                    "type": "long"
+                },
+                {
+                    "description": "Relational Operator to be used with threshold.",
+                    "name": "relationaloperator",
+                    "type": "string"
+                },
+                {
+                    "description": "the id of the Condition",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain id of the Condition owner",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "zone id of counter",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the Condition",
+                    "name": "project",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Lists projects and provides detailed information for listed projects",
+            "isasync": false,
+            "name": "listProjects",
+            "params": [
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "list projects by project ID",
+                    "length": 255,
+                    "name": "id",
+                    "related": "listProjectAccounts,suspendProject,activateProject,updateProject,listProjects",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "list only resources belonging to the domain specified",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.",
+                    "length": 255,
+                    "name": "isrecursive",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "list resources by account. Must be used with the domainId parameter.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "list projects by name",
+                    "length": 255,
+                    "name": "name",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "list projects by state",
+                    "length": 255,
+                    "name": "state",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "List projects by tags (key/value pairs)",
+                    "length": 255,
+                    "name": "tags",
+                    "required": false,
+                    "type": "map"
+                },
+                {
+                    "description": "list projects by display text",
+                    "length": 255,
+                    "name": "displaytext",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "If set to false, list only resources belonging to the command's caller; if set to true - list resources that the caller is authorized to see. Default value is false",
+                    "length": 255,
+                    "name": "listall",
+                    "required": false,
+                    "type": "boolean"
+                }
+            ],
+            "related": "listProjectAccounts,suspendProject,activateProject,updateProject",
+            "response": [
+                {
+                    "description": "the total number of vpcs owned by project",
+                    "name": "vpctotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of vpcs available to be created for this project",
+                    "name": "vpcavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of snapshots stored by this project",
+                    "name": "snapshottotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of snapshots which can be stored by this project",
+                    "name": "snapshotlimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of snapshots available for this project",
+                    "name": "snapshotavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the id of the project",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the total volume being used by this project",
+                    "name": "volumetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the domain name where the project belongs to",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of vpcs the project can own",
+                    "name": "vpclimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of cpu cores the project can own",
+                    "name": "cpulimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total memory (in MB) the project can own",
+                    "name": "memorylimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of the project",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain id the project belongs to",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the total primary storage space (in GiB) the project can own",
+                    "name": "primarystoragelimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of templates available to be created by this project",
+                    "name": "templateavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of resource tags associated with vm",
+                    "name": "tags",
+                    "response": [
+                        {
+                            "description": "tag key name",
+                            "name": "key",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name where tag belongs to",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account associated with the tag",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "resource type",
+                            "name": "resourcetype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "id of the resource",
+                            "name": "resourceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "customer associated with the tag",
+                            "name": "customer",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project id the tag belongs to",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain associated with the tag",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the domain associated with the tag",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag value",
+                            "name": "value",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "the total secondary storage space (in GiB) available to be used for this project",
+                    "name": "secondarystorageavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of templates which can be created by this project",
+                    "name": "templatelimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of virtual machines available for this project to acquire",
+                    "name": "vmavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of networks available to be created for this project",
+                    "name": "networkavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total secondary storage space (in GiB) owned by project",
+                    "name": "secondarystoragetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total secondary storage space (in GiB) the project can own",
+                    "name": "secondarystoragelimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the displaytext of the project",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "the total memory (in MB) owned by project",
+                    "name": "memorytotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of templates which have been created by this project",
+                    "name": "templatetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of virtual machines running for this project",
+                    "name": "vmrunning",
+                    "type": "integer"
+                },
+                {
+                    "description": "the account name of the project's owner",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of networks owned by project",
+                    "name": "networktotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of virtual machines deployed by this project",
+                    "name": "vmtotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of virtual machines that can be deployed by this project",
+                    "name": "vmlimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the project",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of cpu cores owned by project",
+                    "name": "cputotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of cpu cores available to be created for this project",
+                    "name": "cpuavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of virtual machines stopped for this project",
+                    "name": "vmstopped",
+                    "type": "integer"
+                },
+                {
+                    "description": "the total primary storage space (in GiB) available to be used for this project",
+                    "name": "primarystorageavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of public ip addresses allocated for this project",
+                    "name": "iptotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total volume available for this project",
+                    "name": "volumeavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total primary storage space (in GiB) owned by project",
+                    "name": "primarystoragetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of public ip addresses this project can acquire",
+                    "name": "iplimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of public ip addresses available for this project to acquire",
+                    "name": "ipavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of networks the project can own",
+                    "name": "networklimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total volume which can be used by this project",
+                    "name": "volumelimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total memory (in MB) available to be created for this project",
+                    "name": "memoryavailable",
+                    "type": "string"
+                }
+            ],
+            "since": "3.0.0"
+        },
+        {
+            "description": "Creates an account",
+            "isasync": false,
+            "name": "createAccount",
+            "params": [
+                {
+                    "description": "User UUID, required for adding account from external provisioning system",
+                    "length": 255,
+                    "name": "userid",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "Specifies a timezone for this command. For more information on the timezone parameter, see Time Zone Format.",
+                    "length": 255,
+                    "name": "timezone",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "Type of the account.  Specify 0 for user, 1 for root admin, and 2 for domain admin",
+                    "length": 255,
+                    "name": "accounttype",
+                    "required": false,
+                    "type": "short"
+                },
+                {
+                    "description": "Creates the user under the specified account. If no account is specified, the username will be used as the account name.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "Clear text password (Default hashed to SHA256SALT). If you wish to use any other hashing algorithm, you would need to write a custom authentication adapter See Docs section.",
+                    "length": 255,
+                    "name": "password",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "firstname",
+                    "length": 255,
+                    "name": "firstname",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "email",
+                    "length": 255,
+                    "name": "email",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "lastname",
+                    "length": 255,
+                    "name": "lastname",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "Creates the account under the specified role.",
+                    "length": 255,
+                    "name": "roleid",
+                    "related": "listRoles",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "Account UUID, required for adding account from external provisioning system",
+                    "length": 255,
+                    "name": "accountid",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "details for account used to store specific parameters",
+                    "length": 255,
+                    "name": "accountdetails",
+                    "required": false,
+                    "type": "map"
+                },
+                {
+                    "description": "Unique username.",
+                    "length": 255,
+                    "name": "username",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "Network domain for the account's networks",
+                    "length": 255,
+                    "name": "networkdomain",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "Creates the user under the specified domain.",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                }
+            ],
+            "related": "listAccounts,listAccounts,enableAccount",
+            "response": [
+                {
+                    "description": "the total number of public ip addresses this account can acquire",
+                    "name": "iplimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of templates which can be created by this account",
+                    "name": "templatelimit",
+                    "type": "string"
+                },
+                {
+                    "description": "true if the account requires cleanup",
+                    "name": "iscleanuprequired",
+                    "type": "boolean"
+                },
+                {
+                    "description": "details for the account",
+                    "name": "accountdetails",
+                    "type": "map"
+                },
+                {
+                    "description": "the total number of projects available for administration by this account",
+                    "name": "projectavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total memory (in MB) the account can own",
+                    "name": "memorylimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the network domain",
+                    "name": "networkdomain",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of virtual machines stopped for this account",
+                    "name": "vmstopped",
+                    "type": "integer"
+                },
+                {
+                    "description": "the total secondary storage space (in GiB) available to be used for this account",
+                    "name": "secondarystorageavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of virtual machines deployed by this account",
+                    "name": "vmtotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total memory (in MB) owned by account",
+                    "name": "memorytotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of public ip addresses available for this account to acquire",
+                    "name": "ipavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of vpcs owned by account",
+                    "name": "vpctotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of cpu cores available to be created for this account",
+                    "name": "cpuavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the role",
+                    "name": "rolename",
+                    "type": "string"
+                },
+                {
+                    "description": "the total secondary storage space (in GiB) the account can own",
+                    "name": "secondarystoragelimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of users associated with account",
+                    "name": "user",
+                    "response": [
+                        {
+                            "description": "the boolean value representing if the updating target is in caller's child domain",
+                            "name": "iscallerchilddomain",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "the account type of the user",
+                            "name": "accounttype",
+                            "type": "short"
+                        },
+                        {
+                            "description": "the api key of the user",
+                            "name": "apikey",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the secret key of the user",
+                            "name": "secretkey",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the date and time the user account was created",
+                            "name": "created",
+                            "type": "date"
+                        },
+                        {
+                            "description": "the domain ID of the user",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the user email address",
+                            "name": "email",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if user is default, false otherwise",
+                            "name": "isdefault",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "the user ID",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the role",
+                            "name": "roleid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain name of the user",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account ID of the user",
+                            "name": "accountid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the name of the role",
+                            "name": "rolename",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the type of the role",
+                            "name": "roletype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the user name",
+                            "name": "username",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the user lastname",
+                            "name": "lastname",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the user state",
+                            "name": "state",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the user firstname",
+                            "name": "firstname",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account name of the user",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the timezone user was created in",
+                            "name": "timezone",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "the total number of virtual machines running for this account",
+                    "name": "vmrunning",
+                    "type": "integer"
+                },
+                {
+                    "description": "the total number of templates available to be created by this account",
+                    "name": "templateavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of projects the account can own",
+                    "name": "projectlimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of vpcs the account can own",
+                    "name": "vpclimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of cpu cores owned by account",
+                    "name": "cputotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the name of the account",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the type of the role (Admin, ResourceAdmin, DomainAdmin, User)",
+                    "name": "roletype",
+                    "type": "string"
+                },
+                {
+                    "description": "the total volume which can be used by this account",
+                    "name": "volumelimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of snapshots which can be stored by this account",
+                    "name": "snapshotlimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of projects being administrated by this account",
+                    "name": "projecttotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of networks the account can own",
+                    "name": "networklimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of the account",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of snapshots stored by this account",
+                    "name": "snapshottotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total primary storage space (in GiB) owned by account",
+                    "name": "primarystoragetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the id of the account",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of networks owned by account",
+                    "name": "networktotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of snapshots available for this account",
+                    "name": "snapshotavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the default zone of the account",
+                    "name": "defaultzoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of network traffic bytes sent",
+                    "name": "sentbytes",
+                    "type": "long"
+                },
+                {
+                    "description": "the total primary storage space (in GiB) available to be used for this account",
+                    "name": "primarystorageavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of templates which have been created by this account",
+                    "name": "templatetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total secondary storage space (in GiB) owned by account",
+                    "name": "secondarystoragetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "true if account is default, false otherwise",
+                    "name": "isdefault",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the total primary storage space (in GiB) the account can own",
+                    "name": "primarystoragelimit",
+                    "type": "string"
+                },
+                {
+                    "description": "id of the Domain the account belongs too",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "account type (admin, domain-admin, user)",
+                    "name": "accounttype",
+                    "type": "short"
+                },
+                {
+                    "description": "the total number of cpu cores the account can own",
+                    "name": "cpulimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of virtual machines that can be deployed by this account",
+                    "name": "vmlimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of acl groups that account belongs to",
+                    "name": "groups",
+                    "type": "list"
+                },
+                {
+                    "description": "the total memory (in MB) available to be created for this account",
+                    "name": "memoryavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of network traffic bytes received",
+                    "name": "receivedbytes",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of networks available to be created for this account",
+                    "name": "networkavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "name of the Domain the account belongs too",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the total volume being used by this account",
+                    "name": "volumetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of public ip addresses allocated for this account",
+                    "name": "iptotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total volume available for this account",
+                    "name": "volumeavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of virtual machines available for this account to acquire",
+                    "name": "vmavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of vpcs available to be created for this account",
+                    "name": "vpcavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the role",
+                    "name": "roleid",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Revert VM from a vmsnapshot.",
+            "isasync": true,
+            "name": "revertToVMSnapshot",
+            "params": [
+                {
+                    "description": "The ID of the vm snapshot",
+                    "length": 255,
+                    "name": "vmsnapshotid",
+                    "related": "createVMSnapshot,listVMSnapshot",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "updateVMAffinityGroup,resetSSHKeyForVirtualMachine,migrateVirtualMachineWithVolume,attachIso,removeNicFromVirtualMachine,recoverVirtualMachine,updateVMAffinityGroup,rebootVirtualMachine,restoreVirtualMachine,destroyVirtualMachine,stopVirtualMachine,deployVirtualMachine,detachIso,deployVirtualMachine,updateVirtualMachine,revertToVMSnapshot,resetPasswordForVirtualMachine,startVirtualMachine,updateDefaultNicForVirtualMachine,startVirtualMachine,attachIso,listVirtualMachines,addNicToVirtualMachine,stopVirtualMachine,destroyVirtualMachine,removeNicFromVirtualMachine,changeServiceForVirtualMachine",
+            "response": [
+                {
+                    "description": "the state of the virtual machine",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "true if vm contains XS/VMWare tools inorder to support dynamic scaling of VM cpu/memory.",
+                    "name": "isdynamicallyscalable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the ID of the domain in which the virtual machine exists",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the template for the virtual machine. A -1 is returned if the virtual machine was created from an ISO file.",
+                    "name": "templateid",
+                    "type": "string"
+                },
+                {
+                    "description": "the read (io) of disk on the vm",
+                    "name": "diskioread",
+                    "type": "long"
+                },
+                {
+                    "description": "the name of the availability zone for the virtual machine",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the date when this virtual machine was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "list of security groups associated with the virtual machine",
+                    "name": "securitygroup",
+                    "response": [
+                        {
+                            "description": "the name of the security group",
+                            "name": "name",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain name of the security group",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of resource tags associated with the rule",
+                            "name": "tags",
+                            "response": [
+                                {
+                                    "description": "id of the resource",
+                                    "name": "resourceid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the ID of the domain associated with the tag",
+                                    "name": "domainid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "resource type",
+                                    "name": "resourcetype",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "tag key name",
+                                    "name": "key",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the account associated with the tag",
+                                    "name": "account",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "customer associated with the tag",
+                                    "name": "customer",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "tag value",
+                                    "name": "value",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the project id the tag belongs to",
+                                    "name": "projectid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the domain associated with the tag",
+                                    "name": "domain",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the project name where tag belongs to",
+                                    "name": "project",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "set"
+                        },
+                        {
+                            "description": "the domain ID of the security group",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of egress rules associated with the security group",
+                            "name": "egressrule",
+                            "response": [
+                                {
+                                    "description": "the CIDR notation for the base IP address of the security group rule",
+                                    "name": "cidr",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "security group name",
+                                    "name": "securitygroupname",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the code for the ICMP message response",
+                                    "name": "icmpcode",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the id of the security group rule",
+                                    "name": "ruleid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the type of the ICMP message response",
+                                    "name": "icmptype",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the list of resource tags associated with the rule",
+                                    "name": "tags",
+                                    "response": [
+                                        {
+                                            "description": "tag value",
+                                            "name": "value",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project name where tag belongs to",
+                                            "name": "project",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the domain associated with the tag",
+                                            "name": "domain",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the account associated with the tag",
+                                            "name": "account",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the ID of the domain associated with the tag",
+                                            "name": "domainid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag key name",
+                                            "name": "key",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "id of the resource",
+                                            "name": "resourceid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "customer associated with the tag",
+                                            "name": "customer",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "resource type",
+                                            "name": "resourcetype",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project id the tag belongs to",
+                                            "name": "projectid",
+                                            "type": "string"
+                                        }
+                                    ],
+                                    "type": "set"
+                                },
+                                {
+                                    "description": "the starting IP of the security group rule",
+                                    "name": "startport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "account owning the security group rule",
+                                    "name": "account",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the protocol of the security group rule",
+                                    "name": "protocol",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the ending IP of the security group rule ",
+                                    "name": "endport",
+                                    "type": "integer"
+                                }
+                            ],
+                            "type": "set"
+                        },
+                        {
+                            "description": "the number of virtualmachines associated with this securitygroup",
+                            "name": "virtualmachinecount",
+                            "type": "integer"
+                        },
+                        {
+                            "description": "the list of ingress rules associated with the security group",
+                            "name": "ingressrule",
+                            "response": [
+                                {
+                                    "description": "the id of the security group rule",
+                                    "name": "ruleid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "security group name",
+                                    "name": "securitygroupname",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the starting IP of the security group rule",
+                                    "name": "startport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the list of resource tags associated with the rule",
+                                    "name": "tags",
+                                    "response": [
+                                        {
+                                            "description": "the domain associated with the tag",
+                                            "name": "domain",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the ID of the domain associated with the tag",
+                                            "name": "domainid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag value",
+                                            "name": "value",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project id the tag belongs to",
+                                            "name": "projectid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the account associated with the tag",
+                                            "name": "account",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project name where tag belongs to",
+                                            "name": "project",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "id of the resource",
+                                            "name": "resourceid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "customer associated with the tag",
+                                            "name": "customer",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag key name",
+                                            "name": "key",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "resource type",
+                                            "name": "resourcetype",
+                                            "type": "string"
+                                        }
+                                    ],
+                                    "type": "set"
+                                },
+                                {
+                                    "description": "the protocol of the security group rule",
+                                    "name": "protocol",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the type of the ICMP message response",
+                                    "name": "icmptype",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the CIDR notation for the base IP address of the security group rule",
+                                    "name": "cidr",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the ending IP of the security group rule ",
+                                    "name": "endport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the code for the ICMP message response",
+                                    "name": "icmpcode",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "account owning the security group rule",
+                                    "name": "account",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "set"
+                        },
+                        {
+                            "description": "the ID of the security group",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of virtualmachine ids associated with this securitygroup",
+                            "name": "virtualmachineids",
+                            "type": "set"
+                        },
+                        {
+                            "description": "the project name of the group",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account owning the security group",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the description of the security group",
+                            "name": "description",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project id of the group",
+                            "name": "projectid",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "OS type id of the vm",
+                    "name": "ostypeid",
+                    "type": "long"
+                },
+                {
+                    "description": "the name of the host for the virtual machine",
+                    "name": "hostname",
+                    "type": "string"
+                },
+                {
+                    "description": "the account associated with the virtual machine",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "ssh key-pair",
+                    "name": "keypair",
+                    "type": "string"
+                },
+                {
+                    "description": "true if high-availability is enabled, false otherwise",
+                    "name": "haenable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the name of the service offering of the virtual machine",
+                    "name": "serviceofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "public IP address id associated with vm via Static nat rule",
+                    "name": "publicip",
+                    "type": "string"
+                },
+                {
+                    "description": "the group ID of the virtual machine",
+                    "name": "groupid",
+                    "type": "string"
+                },
+                {
+                    "description": "the user's name who deployed the virtual machine",
+                    "name": "username",
+                    "type": "string"
+                },
+                {
+                    "description": "the incoming network traffic on the vm",
+                    "name": "networkkbsread",
+                    "type": "long"
+                },
+                {
+                    "description": "the ID of the ISO attached to the virtual machine",
+                    "name": "isoid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the host for the virtual machine",
+                    "name": "hostid",
+                    "type": "string"
+                },
+                {
+                    "description": "the virtual network for the service offering",
+                    "name": "forvirtualnetwork",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the ID of the service offering of the virtual machine",
+                    "name": "serviceofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "the speed of each cpu",
+                    "name": "cpuspeed",
+                    "type": "integer"
+                },
+                {
+                    "description": "the ID of the availablility zone for the virtual machine",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the number of cpu this virtual machine is running with",
+                    "name": "cpunumber",
+                    "type": "integer"
+                },
+                {
+                    "description": "Os type ID of the virtual machine",
+                    "name": "guestosid",
+                    "type": "string"
+                },
+                {
+                    "description": "device type of the root volume",
+                    "name": "rootdevicetype",
+                    "type": "string"
+                },
+                {
+                    "description": "the write (io) of disk on the vm",
+                    "name": "diskiowrite",
+                    "type": "long"
+                },
+                {
+                    "description": "list of affinity groups associated with the virtual machine",
+                    "name": "affinitygroup",
+                    "response": [
+                        {
+                            "description": "the name of the affinity group",
+                            "name": "name",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain ID of the affinity group",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the description of the affinity group",
+                            "name": "description",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain name of the affinity group",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project ID of the affinity group",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the affinity group",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account owning the affinity group",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the type of the affinity group",
+                            "name": "type",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name of the affinity group",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "virtual machine IDs associated with this affinity group",
+                            "name": "virtualmachineIds",
+                            "type": "list"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "the vgpu type used by the virtual machine",
+                    "name": "vgpu",
+                    "type": "string"
+                },
+                {
+                    "description": "the target memory in vm",
+                    "name": "memorytargetkbs",
+                    "type": "long"
+                },
+                {
+                    "description": "the list of nics associated with vm",
+                    "name": "nic",
+                    "response": [
+                        {
+                            "description": "the ID of the nic",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the IPv6 address of network",
+                            "name": "ip6address",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the corresponding network",
+                            "name": "networkid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if nic is default, false otherwise",
+                            "name": "isdefault",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "Id of the vm to which the nic belongs",
+                            "name": "virtualmachineid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the isolation uri of the nic",
+                            "name": "isolationuri",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ip address of the nic",
+                            "name": "ipaddress",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if nic is default, false otherwise",
+                            "name": "macaddress",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the gateway of IPv6 network",
+                            "name": "ip6gateway",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the name of the corresponding network",
+                            "name": "networkname",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the netmask of the nic",
+                            "name": "netmask",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the broadcast uri of the nic",
+                            "name": "broadcasturi",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the gateway of the nic",
+                            "name": "gateway",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the Secondary ipv4 addr of nic",
+                            "name": "secondaryip",
+                            "type": "list"
+                        },
+                        {
+                            "description": "Id of the NSX Logical Switch Port (if NSX based), null otherwise",
+                            "name": "nsxlogicalswitchport",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the cidr of IPv6 network",
+                            "name": "ip6cidr",
+                            "type": "string"
+                        },
+                        {
+                            "description": "device id for the network when plugged into the virtual machine",
+                            "name": "deviceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the NSX Logical Switch (if NSX based), null otherwise",
+                            "name": "nsxlogicalswitch",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the traffic type of the nic",
+                            "name": "traffictype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the type of the nic",
+                            "name": "type",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "the project id of the vm",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the outgoing network traffic on the host",
+                    "name": "networkkbswrite",
+                    "type": "long"
+                },
+                {
+                    "description": "the group name of the virtual machine",
+                    "name": "group",
+                    "type": "string"
+                },
+                {
+                    "description": "an alternate display text of the ISO attached to the virtual machine",
+                    "name": "isodisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "instance name of the user vm; this parameter is returned to the ROOT admin only",
+                    "name": "instancename",
+                    "type": "string"
+                },
+                {
+                    "description": "the amount of the vm's CPU currently used",
+                    "name": "cpuused",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the template for the virtual machine",
+                    "name": "templatename",
+                    "type": "string"
+                },
+                {
+                    "description": "true if the password rest feature is enabled, false otherwise",
+                    "name": "passwordenabled",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the read (bytes) of disk on the vm",
+                    "name": "diskkbsread",
+                    "type": "long"
+                },
+                {
+                    "description": "the internal memory thats free in vm",
+                    "name": "memoryintfreekbs",
+                    "type": "long"
+                },
+                {
+                    "description": "device ID of the root volume",
+                    "name": "rootdeviceid",
+                    "type": "long"
+                },
+                {
+                    "description": " an alternate display text of the template for the virtual machine",
+                    "name": "templatedisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the vm",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the write (bytes) of disk on the vm",
+                    "name": "diskkbswrite",
+                    "type": "long"
+                },
+                {
+                    "description": "the ID of the virtual machine",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the user's ID who deployed the virtual machine",
+                    "name": "userid",
+                    "type": "string"
+                },
+                {
+
+                },
+                {
+                    "description": "the memory used by the vm",
+                    "name": "memorykbs",
+                    "type": "long"
+                },
+                {
+                    "description": "the name of the disk offering of the virtual machine",
+                    "name": "diskofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "public IP address id associated with vm via Static nat rule",
+                    "name": "publicipid",
+                    "type": "string"
+                },
+                {
+                    "description": "an optional field whether to the display the vm to the end user or not.",
+                    "name": "displayvm",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the memory allocated for the virtual machine",
+                    "name": "memory",
+                    "type": "integer"
+                },
+                {
+                    "description": "user generated name. The name of the virtual machine is returned if no displayname exists.",
+                    "name": "displayname",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the virtual machine",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the ISO attached to the virtual machine",
+                    "name": "isoname",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the disk offering of the virtual machine",
+                    "name": "diskofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "the password (if exists) of the virtual machine",
+                    "name": "password",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the domain in which the virtual machine exists",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "State of the Service from LB rule",
+                    "name": "servicestate",
+                    "type": "string"
+                },
+                {
+                    "description": "Vm details in key/value pairs.",
+                    "name": "details",
+                    "type": "map"
+                },
+                {
+                    "description": "the hypervisor on which the template runs",
+                    "name": "hypervisor",
+                    "type": "string"
+                }
+            ],
+            "since": "4.2.0"
+        },
+        {
+            "description": "Add a new guest OS type",
+            "isasync": true,
+            "name": "addGuestOs",
+            "params": [
+                {
+                    "description": "Unique display name for Guest OS",
+                    "length": 255,
+                    "name": "osdisplayname",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "Optional name for Guest OS",
+                    "length": 255,
+                    "name": "name",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "ID of Guest OS category",
+                    "length": 255,
+                    "name": "oscategoryid",
+                    "related": "listOsCategories",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the ID of the OS type",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the OS category",
+                    "name": "oscategoryid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name/description of the OS type",
+                    "name": "description",
+                    "type": "string"
+                },
+                {
+                    "description": "is the guest OS user defined",
+                    "name": "isuserdefined",
+                    "type": "string"
+                }
+            ],
+            "since": "4.4.0"
+        },
+        {
+            "description": "Lists host tags",
+            "isasync": false,
+            "name": "listHostTags",
+            "params": [
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the ID of the host tag",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the host tag",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the host ID of the host tag",
+                    "name": "hostid",
+                    "type": "long"
+                }
+            ]
+        },
+        {
+            "description": "Removes a Guest OS Mapping.",
+            "isasync": true,
+            "name": "removeGuestOsMapping",
+            "params": [
+                {
+                    "description": "ID of the guest OS mapping",
+                    "length": 255,
+                    "name": "id",
+                    "related": "",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                },
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                }
+            ],
+            "since": "4.4.0"
+        },
+        {
+            "description": "Registers an existing ISO into the CloudStack Cloud.",
+            "isasync": false,
+            "name": "registerIso",
+            "params": [
+                {
+                    "description": "the name of the ISO",
+                    "length": 255,
+                    "name": "name",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "true if you want to register the ISO to be publicly available to all users, false otherwise.",
+                    "length": 255,
+                    "name": "ispublic",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if this ISO is bootable. If not passed explicitly its assumed to be true",
+                    "length": 255,
+                    "name": "bootable",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "Register ISO for the project",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "listProjectAccounts,suspendProject,activateProject,updateProject",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "Image store UUID",
+                    "length": 255,
+                    "name": "imagestoreuuid",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the OS type that best represents the OS of this ISO. If the ISO is bootable this parameter needs to be passed",
+                    "length": 255,
+                    "name": "ostypeid",
+                    "related": "",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "true if the ISO or its derivatives are extractable; default is false",
+                    "length": 255,
+                    "name": "isextractable",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "an optional account name. Must be used with domainId.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "an optional domainId. If the account parameter is used, domainId must also be used.",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "true if ISO contains XS/VMWare tools inorder to support dynamic scaling of VM CPU/memory",
+                    "length": 255,
+                    "name": "isdynamicallyscalable",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "the URL to where the ISO is currently being hosted",
+                    "length": 2048,
+                    "name": "url",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the MD5 checksum value of this ISO",
+                    "length": 255,
+                    "name": "checksum",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "true if you want this ISO to be featured",
+                    "length": 255,
+                    "name": "isfeatured",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "the ID of the zone you wish to register the ISO to.",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones,listZones,createZone,updateZone",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the display text of the ISO. This is usually used for display purposes.",
+                    "length": 4096,
+                    "name": "displaytext",
+                    "required": true,
+                    "type": "string"
+                }
+            ],
+            "related": "registerTemplate,listIsos,copyTemplate,registerTemplate,listTemplates,registerIso,listIsos,createTemplate,copyIso",
+            "response": [
+                {
+                    "description": "true if the template is extractable, false otherwise",
+                    "name": "isextractable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the project id of the template",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the domain to which the template belongs",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "true if template contains XS/VMWare tools inorder to support dynamic scaling of VM cpu/memory",
+                    "name": "isdynamicallyscalable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the template display text",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "the date this template was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the project name of the template",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the template ID of the parent template if present",
+                    "name": "sourcetemplateid",
+                    "type": "string"
+                },
+                {
+                    "description": "true if the ISO is bootable, false otherwise",
+                    "name": "bootable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "additional key/value details tied with template",
+                    "name": "details",
+                    "type": "map"
+                },
+                {
+                    "description": "the ID of the zone for this template",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "true if template is sshkey enabled, false otherwise",
+                    "name": "sshkeyenabled",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the type of the template",
+                    "name": "templatetype",
+                    "type": "string"
+                },
+                {
+                    "description": "the tag of this template",
+                    "name": "templatetag",
+                    "type": "string"
+                },
+                {
+                    "description": "the account id to which the template belongs",
+                    "name": "accountid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the zone for this template",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the hypervisor on which the template runs",
+                    "name": "hypervisor",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the secondary storage host for the template",
+                    "name": "hostname",
+                    "type": "string"
+                },
+                {
+                    "description": "true if the reset password feature is enabled, false otherwise",
+                    "name": "passwordenabled",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the template ID",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the format of the template.",
+                    "name": "format",
+                    "type": "imageformat"
+                },
+                {
+                    "description": "the name of the OS type for this template.",
+                    "name": "ostypename",
+                    "type": "string"
+                },
+                {
+                    "description": "checksum of the template",
+                    "name": "checksum",
+                    "type": "string"
+                },
+                {
+                    "description": "true if the template is managed across all Zones, false otherwise",
+                    "name": "crossZones",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the ID of the OS type for this template.",
+                    "name": "ostypeid",
+                    "type": "string"
+                },
+                {
+                    "description": "the date this template was removed",
+                    "name": "removed",
+                    "type": "date"
+                },
+                {
+                    "description": "true if the template is ready to be deployed from, false otherwise.",
+                    "name": "isready",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the status of the template",
+                    "name": "status",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the domain to which the template belongs",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the size of the template",
+                    "name": "size",
+                    "type": "long"
+                },
+                {
+                    "description": "the ID of the secondary storage host for the template",
+                    "name": "hostid",
+                    "type": "string"
+                },
+                {
+                    "description": "the template name",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "true if this template is a public template, false otherwise",
+                    "name": "ispublic",
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if this template is a featured template, false otherwise",
+                    "name": "isfeatured",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the account name to which the template belongs",
+                    "name": "account",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Lists Cisco ASA 1000v appliances",
+            "isasync": false,
+            "name": "listCiscoAsa1000vResources",
+            "params": [
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "the Physical Network ID",
+                    "length": 255,
+                    "name": "physicalnetworkid",
+                    "related": "createPhysicalNetwork",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "Cisco ASA 1000v resource ID",
+                    "length": 255,
+                    "name": "resourceid",
+                    "related": "addCiscoAsa1000vResource,listCiscoAsa1000vResources",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "Hostname or ip address of the Cisco ASA 1000v appliance.",
+                    "length": 255,
+                    "name": "hostname",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                }
+            ],
+            "related": "addCiscoAsa1000vResource",
+            "response": [
+                {
+
+                },
+                {
+
+                },
+                {
+
+                },
+                {
+
+                },
+                {
+
+                }
+            ]
+        },
+        {
+            "description": "Lists the volumes of elastistor",
+            "isasync": false,
+            "name": "listElastistorVolume",
+            "params": [
+                {
+                    "description": "the ID of the account",
+                    "length": 255,
+                    "name": "id",
+                    "required": true,
+                    "type": "string"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the id of the volume",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "graceallowed",
+                    "name": "graceallowed",
+                    "type": "string"
+                },
+                {
+                    "description": "deduplication",
+                    "name": "deduplication",
+                    "type": "string"
+                },
+                {
+                    "description": "syncronization",
+                    "name": "sync",
+                    "type": "string"
+                },
+                {
+                    "description": "compression",
+                    "name": "compression",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the volume",
+                    "name": "name",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "deletes a range of portable public IP's associated with a region",
+            "isasync": true,
+            "name": "deletePortableIpRange",
+            "params": [
+                {
+                    "description": "Id of the portable ip range",
+                    "length": 255,
+                    "name": "id",
+                    "related": "",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "Lists Nicira NVP devices",
+            "isasync": false,
+            "name": "listNiciraNvpDevices",
+            "params": [
+                {
+                    "description": "the Physical Network ID",
+                    "length": 255,
+                    "name": "physicalnetworkid",
+                    "related": "createPhysicalNetwork",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "nicira nvp device ID",
+                    "length": 255,
+                    "name": "nvpdeviceid",
+                    "related": "listNiciraNvpDevices,addNiciraNvpDevice",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                }
+            ],
+            "related": "addNiciraNvpDevice",
+            "response": [
+                {
+                    "description": "this L2 gateway service Uuid",
+                    "name": "l2gatewayserviceuuid",
+                    "type": "string"
+                },
+                {
+                    "description": "device id of the Nicire Nvp",
+                    "name": "nvpdeviceid",
+                    "type": "string"
+                },
+                {
+                    "description": "the physical network to which this Nirica Nvp belongs to",
+                    "name": "physicalnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "device name",
+                    "name": "niciradevicename",
+                    "type": "string"
+                },
+                {
+                    "description": "the transport zone Uuid",
+                    "name": "transportzoneuuid",
+                    "type": "string"
+                },
+                {
+                    "description": "this L3 gateway service Uuid",
+                    "name": "l3gatewayserviceuuid",
+                    "type": "string"
+                },
+                {
+                    "description": "the controller Ip address",
+                    "name": "hostname",
+                    "type": "string"
+                },
+                {
+                    "description": "name of the provider",
+                    "name": "provider",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "add a baremetal pxe server",
+            "isasync": true,
+            "name": "addBaremetalPxeKickStartServer",
+            "params": [
+                {
+                    "description": "Credentials to reach external pxe device",
+                    "length": 255,
+                    "name": "password",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "URL of the external pxe device",
+                    "length": 255,
+                    "name": "url",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "Pod Id",
+                    "length": 255,
+                    "name": "podid",
+                    "related": "updatePod",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "Credentials to reach external pxe device",
+                    "length": 255,
+                    "name": "username",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "Tftp root directory of PXE server",
+                    "length": 255,
+                    "name": "tftpdir",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the Physical Network ID",
+                    "length": 255,
+                    "name": "physicalnetworkid",
+                    "related": "createPhysicalNetwork",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "type of pxe device",
+                    "length": 255,
+                    "name": "pxeservertype",
+                    "required": true,
+                    "type": "string"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "Tftp root directory of PXE server",
+                    "name": "tftpdir",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Lists all alerts.",
+            "isasync": false,
+            "name": "listAlerts",
+            "params": [
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the alert",
+                    "length": 255,
+                    "name": "id",
+                    "related": "listAlerts",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list by alert type",
+                    "length": 255,
+                    "name": "type",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "list by alert name",
+                    "length": 255,
+                    "name": "name",
+                    "required": false,
+                    "since": "4.3",
+                    "type": "string"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the name of the alert",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "One of the following alert types: MEMORY = 0, CPU = 1, STORAGE = 2, STORAGE_ALLOCATED = 3, PUBLIC_IP = 4, PRIVATE_IP = 5, SECONDARY_STORAGE = 6, HOST = 7, USERVM = 8, DOMAIN_ROUTER = 9, CONSOLE_PROXY = 10, ROUTING = 11: lost connection to default route (to the gateway), STORAGE_MISC = 12, USAGE_SERVER = 13, MANAGMENT_NODE = 14, DOMAIN_ROUTER_MIGRATE = 15, CONSOLE_PROXY_MIGRATE = 16, USERVM_MIGRATE = 17, VLAN = 18, SSVM = 19, USAGE_SERVER_RESULT = 20, STORAGE_DELETE = 21, UPDATE_RESOURCE_COUNT = 22, USAGE_SANITY_RESULT = 23, DIRECT_ATTACHED_PUBLIC_IP = 24, LOCAL_STORAGE = 25, RESOURCE_LIMIT_EXCEEDED = 26, SYNC = 27, UPLOAD_FAILED = 28, OOBM_AUTH_ERROR = 29",
+                    "name": "type",
+                    "type": "short"
+                },
+                {
+                    "description": "description of the alert",
+                    "name": "description",
+                    "type": "string"
+                },
+                {
+                    "description": "the id of the alert",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the date and time the alert was sent",
+                    "name": "sent",
+                    "type": "date"
+                }
+            ]
+        },
+        {
+            "description": "Creates and automatically starts a virtual machine based on a service offering, disk offering, and template.",
+            "isasync": true,
+            "name": "deployVirtualMachine",
+            "params": [
+                {
+                    "description": "comma separated list of security groups names that going to be applied to the virtual machine. Should be passed only when vm is created from a zone with Basic Network support. Mutually exclusive with securitygroupids parameter",
+                    "length": 255,
+                    "name": "securitygroupnames",
+                    "related": "createSecurityGroup",
+                    "required": false,
+                    "type": "list"
+                },
+                {
+                    "description": "the arbitrary size for the DATADISK volume. Mutually exclusive with diskOfferingId",
+                    "length": 255,
+                    "name": "size",
+                    "required": false,
+                    "type": "long"
+                },
+                {
+                    "description": "name of the ssh key pair used to login to the virtual machine",
+                    "length": 255,
+                    "name": "keypair",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "true if start vm after creating; defaulted to true if not specified",
+                    "length": 255,
+                    "name": "startvm",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "Optional field to resize root disk on deploy. Value is in GB. Only applies to template-based deployments. Analogous to details[0].rootdisksize, which takes precedence over this parameter if both are provided",
+                    "length": 255,
+                    "name": "rootdisksize",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "long"
+                },
+                {
+                    "description": "an optional domainId for the virtual machine. If the account parameter is used, domainId must also be used.",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the ID of the disk offering for the virtual machine. If the template is of ISO format, the diskOfferingId is for the root disk volume. Otherwise this parameter is used to indicate the offering for the data disk volume. If the templateId parameter passed is from a Template object, the diskOfferingId refers to a DATA Disk Volume created. If the templateId parameter passed is from an ISO object, the diskOfferingId refers to a ROOT Disk Volume created.",
+                    "length": 255,
+                    "name": "diskofferingid",
+                    "related": "createDiskOffering",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "availability zone for the virtual machine",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones,listZones,createZone,updateZone",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "an optional binary data that can be sent to the virtual machine upon a successful deployment. This binary data must be base64 encoded before adding it to the request. Using HTTP GET (via querystring), you can send up to 2KB of data after base64 encoding. Using HTTP POST(via POST body), you can send up to 32K of data after base64 encoding.",
+                    "length": 32768,
+                    "name": "userdata",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "ip to network mapping. Can't be specified with networkIds parameter. Example: iptonetworklist[0].ip=10.10.10.11&iptonetworklist[0].ipv6=fc00:1234:5678::abcd&iptonetworklist[0].networkid=uuid - requests to use ip 10.10.10.11 in network id=uuid",
+                    "length": 255,
+                    "name": "iptonetworklist",
+                    "required": false,
+                    "type": "map"
+                },
+                {
+                    "description": "the ip address for default vm's network",
+                    "length": 255,
+                    "name": "ipaddress",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "an optional field, in case you want to set a custom id to the resource. Allowed to Root Admins only",
+                    "length": 255,
+                    "name": "customid",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "an optional account for the virtual machine. Must be used with domainId.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "destination Host ID to deploy the VM to - parameter available for root admin only",
+                    "length": 255,
+                    "name": "hostid",
+                    "related": "addBaremetalHost,reconnectHost,addHost,cancelHostMaintenance",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the hypervisor on which to deploy the virtual machine. The parameter is required and respected only when hypervisor info is not set on the ISO/Template passed to the call",
+                    "length": 255,
+                    "name": "hypervisor",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "an optional group for the virtual machine",
+                    "length": 255,
+                    "name": "group",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "list of network ids used by virtual machine. Can't be specified with ipToNetworkList parameter",
+                    "length": 255,
+                    "name": "networkids",
+                    "related": "createNetwork,updateNetwork,listBrocadeVcsDeviceNetworks,createNetwork,listNetworks,listNetscalerLoadBalancerNetworks,listF5LoadBalancerNetworks",
+                    "required": false,
+                    "type": "list"
+                },
+                {
+                    "description": "comma separated list of security groups id that going to be applied to the virtual machine. Should be passed only when vm is created from a zone with Basic Network support. Mutually exclusive with securitygroupnames parameter",
+                    "length": 255,
+                    "name": "securitygroupids",
+                    "related": "createSecurityGroup",
+                    "required": false,
+                    "type": "list"
+                },
+                {
+                    "description": "Deploy vm for the project",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "listProjectAccounts,suspendProject,activateProject,updateProject",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "comma separated list of affinity groups id that are going to be applied to the virtual machine. Mutually exclusive with affinitygroupnames parameter",
+                    "length": 255,
+                    "name": "affinitygroupids",
+                    "related": "",
+                    "required": false,
+                    "type": "list"
+                },
+                {
+                    "description": "an optional keyboard device type for the virtual machine. valid value can be one of de,de-ch,es,fi,fr,fr-be,fr-ch,is,it,jp,nl-be,no,pt,uk,us",
+                    "length": 255,
+                    "name": "keyboard",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the template for the virtual machine",
+                    "length": 255,
+                    "name": "templateid",
+                    "related": "registerTemplate,listIsos,copyTemplate,registerTemplate,listTemplates,registerIso,listIsos,createTemplate,copyIso",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "used to specify the custom parameters.",
+                    "length": 255,
+                    "name": "details",
+                    "required": false,
+                    "since": "4.3",
+                    "type": "map"
+                },
+                {
+                    "description": "an optional user generated name for the virtual machine",
+                    "length": 255,
+                    "name": "displayname",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "Deployment planner to use for vm allocation. Available to ROOT admin only",
+                    "length": 255,
+                    "name": "deploymentplanner",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "string"
+                },
+                {
+                    "description": "host name for the virtual machine",
+                    "length": 255,
+                    "name": "name",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the ipv6 address for default vm's network",
+                    "length": 255,
+                    "name": "ip6address",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the service offering for the virtual machine",
+                    "length": 255,
+                    "name": "serviceofferingid",
+                    "related": "updateServiceOffering,listServiceOfferings",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "comma separated list of affinity groups names that are going to be applied to the virtual machine.Mutually exclusive with affinitygroupids parameter",
+                    "length": 255,
+                    "name": "affinitygroupnames",
+                    "related": "",
+                    "required": false,
+                    "type": "list"
+                },
+                {
+                    "description": "an optional field, whether to the display the vm to the end user or not.",
+                    "length": 255,
+                    "name": "displayvm",
+                    "required": false,
+                    "since": "4.2",
+                    "type": "boolean"
+                }
+            ],
+            "related": "updateVMAffinityGroup,resetSSHKeyForVirtualMachine,migrateVirtualMachineWithVolume,attachIso,removeNicFromVirtualMachine,recoverVirtualMachine,updateVMAffinityGroup,rebootVirtualMachine,restoreVirtualMachine,destroyVirtualMachine,stopVirtualMachine,detachIso,deployVirtualMachine,updateVirtualMachine,revertToVMSnapshot,resetPasswordForVirtualMachine,startVirtualMachine,updateDefaultNicForVirtualMachine,startVirtualMachine,attachIso,listVirtualMachines,addNicToVirtualMachine,stopVirtualMachine,destroyVirtualMachine,removeNicFromVirtualMachine,changeServiceForVirtualMachine",
+            "response": [
+                {
+                    "description": "OS type id of the vm",
+                    "name": "ostypeid",
+                    "type": "long"
+                },
+                {
+                    "description": "the name of the template for the virtual machine",
+                    "name": "templatename",
+                    "type": "string"
+                },
+                {
+                    "description": "the incoming network traffic on the vm",
+                    "name": "networkkbsread",
+                    "type": "long"
+                },
+                {
+                    "description": "user generated name. The name of the virtual machine is returned if no displayname exists.",
+                    "name": "displayname",
+                    "type": "string"
+                },
+                {
+                    "description": "the internal memory thats free in vm",
+                    "name": "memoryintfreekbs",
+                    "type": "long"
+                },
+                {
+                    "description": "the date when this virtual machine was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the speed of each cpu",
+                    "name": "cpuspeed",
+                    "type": "integer"
+                },
+                {
+                    "description": "an alternate display text of the ISO attached to the virtual machine",
+                    "name": "isodisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "the write (io) of disk on the vm",
+                    "name": "diskiowrite",
+                    "type": "long"
+                },
+                {
+                    "description": "the state of the virtual machine",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "device ID of the root volume",
+                    "name": "rootdeviceid",
+                    "type": "long"
+                },
+                {
+                    "description": "the ID of the host for the virtual machine",
+                    "name": "hostid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the ISO attached to the virtual machine",
+                    "name": "isoname",
+                    "type": "string"
+                },
+                {
+                    "description": "the number of cpu this virtual machine is running with",
+                    "name": "cpunumber",
+                    "type": "integer"
+                },
+                {
+                    "description": "the ID of the virtual machine",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the target memory in vm",
+                    "name": "memorytargetkbs",
+                    "type": "long"
+                },
+                {
+                    "description": "the read (io) of disk on the vm",
+                    "name": "diskioread",
+                    "type": "long"
+                },
+                {
+                    "description": "the account associated with the virtual machine",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the hypervisor on which the template runs",
+                    "name": "hypervisor",
+                    "type": "string"
+                },
+                {
+                    "description": "the user's name who deployed the virtual machine",
+                    "name": "username",
+                    "type": "string"
+                },
+                {
+                    "description": "the outgoing network traffic on the host",
+                    "name": "networkkbswrite",
+                    "type": "long"
+                },
+                {
+                    "description": "list of security groups associated with the virtual machine",
+                    "name": "securitygroup",
+                    "response": [
+                        {
+                            "description": "the list of resource tags associated with the rule",
+                            "name": "tags",
+                            "response": [
+                                {
+                                    "description": "tag key name",
+                                    "name": "key",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the project name where tag belongs to",
+                                    "name": "project",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "tag value",
+                                    "name": "value",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the domain associated with the tag",
+                                    "name": "domain",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "id of the resource",
+                                    "name": "resourceid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the account associated with the tag",
+                                    "name": "account",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the project id the tag belongs to",
+                                    "name": "projectid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "resource type",
+                                    "name": "resourcetype",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "customer associated with the tag",
+                                    "name": "customer",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the ID of the domain associated with the tag",
+                                    "name": "domainid",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "set"
+                        },
+                        {
+                            "description": "the number of virtualmachines associated with this securitygroup",
+                            "name": "virtualmachinecount",
+                            "type": "integer"
+                        },
+                        {
+                            "description": "the description of the security group",
+                            "name": "description",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of virtualmachine ids associated with this securitygroup",
+                            "name": "virtualmachineids",
+                            "type": "set"
+                        },
+                        {
+                            "description": "the domain ID of the security group",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain name of the security group",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the name of the security group",
+                            "name": "name",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project id of the group",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account owning the security group",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name of the group",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of ingress rules associated with the security group",
+                            "name": "ingressrule",
+                            "response": [
+                                {
+                                    "description": "the protocol of the security group rule",
+                                    "name": "protocol",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the starting IP of the security group rule",
+                                    "name": "startport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "account owning the security group rule",
+                                    "name": "account",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the type of the ICMP message response",
+                                    "name": "icmptype",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the list of resource tags associated with the rule",
+                                    "name": "tags",
+                                    "response": [
+                                        {
+                                            "description": "customer associated with the tag",
+                                            "name": "customer",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project id the tag belongs to",
+                                            "name": "projectid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the domain associated with the tag",
+                                            "name": "domain",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project name where tag belongs to",
+                                            "name": "project",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag value",
+                                            "name": "value",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the ID of the domain associated with the tag",
+                                            "name": "domainid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the account associated with the tag",
+                                            "name": "account",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag key name",
+                                            "name": "key",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "id of the resource",
+                                            "name": "resourceid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "resource type",
+                                            "name": "resourcetype",
+                                            "type": "string"
+                                        }
+                                    ],
+                                    "type": "set"
+                                },
+                                {
+                                    "description": "the CIDR notation for the base IP address of the security group rule",
+                                    "name": "cidr",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the code for the ICMP message response",
+                                    "name": "icmpcode",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the ending IP of the security group rule ",
+                                    "name": "endport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "security group name",
+                                    "name": "securitygroupname",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the id of the security group rule",
+                                    "name": "ruleid",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "set"
+                        },
+                        {
+                            "description": "the list of egress rules associated with the security group",
+                            "name": "egressrule",
+                            "response": [
+                                {
+                                    "description": "the list of resource tags associated with the rule",
+                                    "name": "tags",
+                                    "response": [
+                                        {
+                                            "description": "the domain associated with the tag",
+                                            "name": "domain",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the account associated with the tag",
+                                            "name": "account",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the ID of the domain associated with the tag",
+                                            "name": "domainid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "resource type",
+                                            "name": "resourcetype",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag key name",
+                                            "name": "key",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "id of the resource",
+                                            "name": "resourceid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project name where tag belongs to",
+                                            "name": "project",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "customer associated with the tag",
+                                            "name": "customer",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag value",
+                                            "name": "value",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project id the tag belongs to",
+                                            "name": "projectid",
+                                            "type": "string"
+                                        }
+                                    ],
+                                    "type": "set"
+                                },
+                                {
+                                    "description": "the starting IP of the security group rule",
+                                    "name": "startport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the type of the ICMP message response",
+                                    "name": "icmptype",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the ending IP of the security group rule ",
+                                    "name": "endport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the CIDR notation for the base IP address of the security group rule",
+                                    "name": "cidr",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "account owning the security group rule",
+                                    "name": "account",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the id of the security group rule",
+                                    "name": "ruleid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the code for the ICMP message response",
+                                    "name": "icmpcode",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "security group name",
+                                    "name": "securitygroupname",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the protocol of the security group rule",
+                                    "name": "protocol",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "set"
+                        },
+                        {
+                            "description": "the ID of the security group",
+                            "name": "id",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "the project id of the vm",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the virtual network for the service offering",
+                    "name": "forvirtualnetwork",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the amount of the vm's CPU currently used",
+                    "name": "cpuused",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the service offering of the virtual machine",
+                    "name": "serviceofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "public IP address id associated with vm via Static nat rule",
+                    "name": "publicip",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the host for the virtual machine",
+                    "name": "hostname",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the template for the virtual machine. A -1 is returned if the virtual machine was created from an ISO file.",
+                    "name": "templateid",
+                    "type": "string"
+                },
+                {
+                    "description": "device type of the root volume",
+                    "name": "rootdevicetype",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the vm",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "Vm details in key/value pairs.",
+                    "name": "details",
+                    "type": "map"
+                },
+                {
+                    "description": "ssh key-pair",
+                    "name": "keypair",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of nics associated with vm",
+                    "name": "nic",
+                    "response": [
+                        {
+                            "description": "Id of the NSX Logical Switch Port (if NSX based), null otherwise",
+                            "name": "nsxlogicalswitchport",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the broadcast uri of the nic",
+                            "name": "broadcasturi",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ip address of the nic",
+                            "name": "ipaddress",
+                            "type": "string"
+                        },
+                        {
+                            "description": "device id for the network when plugged into the virtual machine",
+                            "name": "deviceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the IPv6 address of network",
+                            "name": "ip6address",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the Secondary ipv4 addr of nic",
+                            "name": "secondaryip",
+                            "type": "list"
+                        },
+                        {
+                            "description": "Id of the NSX Logical Switch (if NSX based), null otherwise",
+                            "name": "nsxlogicalswitch",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if nic is default, false otherwise",
+                            "name": "macaddress",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the name of the corresponding network",
+                            "name": "networkname",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the isolation uri of the nic",
+                            "name": "isolationuri",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the gateway of IPv6 network",
+                            "name": "ip6gateway",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the vm to which the nic belongs",
+                            "name": "virtualmachineid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the nic",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the gateway of the nic",
+                            "name": "gateway",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the type of the nic",
+                            "name": "type",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the corresponding network",
+                            "name": "networkid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if nic is default, false otherwise",
+                            "name": "isdefault",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "the netmask of the nic",
+                            "name": "netmask",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the cidr of IPv6 network",
+                            "name": "ip6cidr",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the traffic type of the nic",
+                            "name": "traffictype",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "true if the password rest feature is enabled, false otherwise",
+                    "name": "passwordenabled",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the memory used by the vm",
+                    "name": "memorykbs",
+                    "type": "long"
+                },
+                {
+                    "description": "the ID of the availablility zone for the virtual machine",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the user's ID who deployed the virtual machine",
+                    "name": "userid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the disk offering of the virtual machine",
+                    "name": "diskofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "the write (bytes) of disk on the vm",
+                    "name": "diskkbswrite",
+                    "type": "long"
+                },
+                {
+
+                },
+                {
+                    "description": "the ID of the domain in which the virtual machine exists",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "instance name of the user vm; this parameter is returned to the ROOT admin only",
+                    "name": "instancename",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the disk offering of the virtual machine",
+                    "name": "diskofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "the read (bytes) of disk on the vm",
+                    "name": "diskkbsread",
+                    "type": "long"
+                },
+                {
+                    "description": "the vgpu type used by the virtual machine",
+                    "name": "vgpu",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the ISO attached to the virtual machine",
+                    "name": "isoid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the domain in which the virtual machine exists",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the availability zone for the virtual machine",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the group ID of the virtual machine",
+                    "name": "groupid",
+                    "type": "string"
+                },
+                {
+                    "description": "State of the Service from LB rule",
+                    "name": "servicestate",
+                    "type": "string"
+                },
+                {
+                    "description": "true if high-availability is enabled, false otherwise",
+                    "name": "haenable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "an optional field whether to the display the vm to the end user or not.",
+                    "name": "displayvm",
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if vm contains XS/VMWare tools inorder to support dynamic scaling of VM cpu/memory.",
+                    "name": "isdynamicallyscalable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "Os type ID of the virtual machine",
+                    "name": "guestosid",
+                    "type": "string"
+                },
+                {
+                    "description": "public IP address id associated with vm via Static nat rule",
+                    "name": "publicipid",
+                    "type": "string"
+                },
+                {
+                    "description": " an alternate display text of the template for the virtual machine",
+                    "name": "templatedisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "list of affinity groups associated with the virtual machine",
+                    "name": "affinitygroup",
+                    "response": [
+                        {
+                            "description": "the domain name of the affinity group",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name of the affinity group",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account owning the affinity group",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the affinity group",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the description of the affinity group",
+                            "name": "description",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project ID of the affinity group",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the name of the affinity group",
+                            "name": "name",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain ID of the affinity group",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "virtual machine IDs associated with this affinity group",
+                            "name": "virtualmachineIds",
+                            "type": "list"
+                        },
+                        {
+                            "description": "the type of the affinity group",
+                            "name": "type",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "the ID of the service offering of the virtual machine",
+                    "name": "serviceofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "the password (if exists) of the virtual machine",
+                    "name": "password",
+                    "type": "string"
+                },
+                {
+                    "description": "the group name of the virtual machine",
+                    "name": "group",
+                    "type": "string"
+                },
+                {
+                    "description": "the memory allocated for the virtual machine",
+                    "name": "memory",
+                    "type": "integer"
+                },
+                {
+                    "description": "the name of the virtual machine",
+                    "name": "name",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Upgrades router to use newer template",
+            "isasync": false,
+            "name": "upgradeRouterTemplate",
+            "params": [
+                {
+                    "description": "upgrades all routers owned by the specified account",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "upgrades all routers within the specified pod",
+                    "length": 255,
+                    "name": "podid",
+                    "related": "updatePod",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "upgrades all routers within the specified zone",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones,listZones,createZone,updateZone",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "upgrades all routers within the specified cluster",
+                    "length": 255,
+                    "name": "clusterid",
+                    "related": "addCluster",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "upgrades router with the specified Id",
+                    "length": 255,
+                    "name": "id",
+                    "related": "destroyRouter,listRouters",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "upgrades all routers owned by the specified domain",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the current status of the latest async job acting on this object",
+                    "name": "jobstatus",
+                    "type": "integer"
+                },
+                {
+
+                },
+                {
+
+                },
+                {
+                    "description": "the UUID of the latest async job acting on this object",
+                    "name": "jobid",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Extracts volume",
+            "isasync": true,
+            "name": "extractVolume",
+            "params": [
+                {
+                    "description": "the url to which the volume would be extracted",
+                    "length": 2048,
+                    "name": "url",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the volume",
+                    "length": 255,
+                    "name": "id",
+                    "related": "listVolumes,attachVolume,updateVolume,migrateVolume,createVolume,listVolumes,uploadVolume,attachVolume,detachVolume,resizeVolume,migrateVolume,createVolume",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the ID of the zone where the volume is located",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones,listZones,createZone,updateZone",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the mode of extraction - HTTP_DOWNLOAD or FTP_UPLOAD",
+                    "length": 255,
+                    "name": "mode",
+                    "required": true,
+                    "type": "string"
+                }
+            ],
+            "related": "extractTemplate",
+            "response": [
+                {
+                    "description": "zone ID the object was extracted from",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the upload id of extracted object",
+                    "name": "extractId",
+                    "type": "string"
+                },
+                {
+                    "description": "zone name the object was extracted from",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the status of the extraction",
+                    "name": "status",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of the extracted object",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "name": "resultstring",
+                    "type": "string"
+                },
+                {
+                    "description": "the percentage of the entity uploaded to the specified location",
+                    "name": "uploadpercentage",
+                    "type": "integer"
+                },
+                {
+                    "description": "the time and date the object was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the account id to which the extracted object belongs",
+                    "name": "accountid",
+                    "type": "string"
+                },
+                {
+
+                },
+                {
+                    "description": "if mode = upload then url of the uploaded entity. if mode = download the url from which the entity can be downloaded",
+                    "name": "url",
+                    "type": "string"
+                },
+                {
+                    "description": "the mode of extraction - upload or download",
+                    "name": "extractMode",
+                    "type": "string"
+                },
+                {
+                    "description": "the id of extracted object",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the extracted object",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "type of the storage",
+                    "name": "storagetype",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Lists all VLAN IP ranges.",
+            "isasync": false,
+            "name": "listVlanIpRanges",
+            "params": [
+                {
+                    "description": "the ID of the VLAN IP range",
+                    "length": 255,
+                    "name": "id",
+                    "related": "listVlanIpRanges,dedicatePublicIpRange",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the ID or VID of the VLAN. Default is an \"untagged\" VLAN.",
+                    "length": 255,
+                    "name": "vlan",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "network id of the VLAN IP range",
+                    "length": 255,
+                    "name": "networkid",
+                    "related": "createNetwork,updateNetwork,listBrocadeVcsDeviceNetworks,createNetwork,listNetworks,listNetscalerLoadBalancerNetworks,listF5LoadBalancerNetworks",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "project who will own the VLAN",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "listProjectAccounts,suspendProject,activateProject,updateProject",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the domain ID with which the VLAN IP range is associated.  If used with the account parameter, returns all VLAN IP ranges for that account in the specified domain.",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the Pod ID of the VLAN IP range",
+                    "length": 255,
+                    "name": "podid",
+                    "related": "updatePod",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "true if VLAN is of Virtual type, false if Direct",
+                    "length": 255,
+                    "name": "forvirtualnetwork",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "the Zone ID of the VLAN IP range",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones,listZones,createZone,updateZone",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the account with which the VLAN IP range is associated. Must be used with the domainId parameter.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "physical network id of the VLAN IP range",
+                    "length": 255,
+                    "name": "physicalnetworkid",
+                    "related": "createPhysicalNetwork",
+                    "required": false,
+                    "type": "uuid"
+                }
+            ],
+            "related": "dedicatePublicIpRange",
+            "response": [
+                {
+                    "description": "the network id of vlan range",
+                    "name": "networkid",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain ID of the VLAN IP range",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the description of the VLAN IP range",
+                    "name": "description",
+                    "type": "string"
+                },
+                {
+                    "description": "the cidr of IPv6 network",
+                    "name": "ip6cidr",
+                    "type": "string"
+                },
+                {
+                    "description": "the Pod name for the VLAN IP range",
+                    "name": "podname",
+                    "type": "string"
+                },
+                {
+                    "description": "the Pod ID for the VLAN IP range",
+                    "name": "podid",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the vlan range",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain name of the VLAN IP range",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the start ipv6 of the VLAN IP range",
+                    "name": "startipv6",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the VLAN IP range",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone ID of the VLAN IP range",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID or VID of the VLAN.",
+                    "name": "vlan",
+                    "type": "string"
+                },
+                {
+                    "description": "the end ipv6 of the VLAN IP range",
+                    "name": "endipv6",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the vlan range",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the end ip of the VLAN IP range",
+                    "name": "endip",
+                    "type": "string"
+                },
+                {
+                    "description": "the start ip of the VLAN IP range",
+                    "name": "startip",
+                    "type": "string"
+                },
+                {
+                    "description": "the account of the VLAN IP range",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the virtual network for the VLAN IP range",
+                    "name": "forvirtualnetwork",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the gateway of the VLAN IP range",
+                    "name": "gateway",
+                    "type": "string"
+                },
+                {
+                    "description": "the netmask of the VLAN IP range",
+                    "name": "netmask",
+                    "type": "string"
+                },
+                {
+                    "description": "the physical network this belongs to",
+                    "name": "physicalnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "the gateway of IPv6 network",
+                    "name": "ip6gateway",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Lists Nuage VSP devices",
+            "isasync": false,
+            "name": "listNuageVspDevices",
+            "params": [
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the Nuage VSP device ID",
+                    "length": 255,
+                    "name": "vspdeviceid",
+                    "related": "updateNuageVspDevice,listNuageVspDevices",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "the Physical Network ID",
+                    "length": 255,
+                    "name": "physicalnetworkid",
+                    "related": "createPhysicalNetwork",
+                    "required": false,
+                    "type": "uuid"
+                }
+            ],
+            "related": "updateNuageVspDevice",
+            "response": [
+                {
+                    "description": "the CMS ID generated by the Nuage VSD",
+                    "name": "cmsid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the physical network to which this Nuage VSP belongs to",
+                    "name": "physicalnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "the time to wait after failure before retrying to communicate to Nuage VSD",
+                    "name": "retryinterval",
+                    "type": "long"
+                },
+                {
+                    "description": "the version of the API to use to communicate to Nuage VSD",
+                    "name": "apiversion",
+                    "type": "string"
+                },
+                {
+                    "description": "the port to communicate to Nuage VSD",
+                    "name": "port",
+                    "type": "int"
+                },
+                {
+                    "description": "the service provider name corresponding to this Nuage VSP device",
+                    "name": "provider",
+                    "type": "string"
+                },
+                {
+                    "description": "the hostname of the Nuage VSD",
+                    "name": "hostname",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the Nuage VSP device",
+                    "name": "nuagedevicename",
+                    "type": "string"
+                },
+                {
+                    "description": "the device id of the Nuage VSD",
+                    "name": "vspdeviceid",
+                    "type": "string"
+                },
+                {
+                    "description": "the number of retries on failure to communicate to Nuage VSD",
+                    "name": "retrycount",
+                    "type": "int"
+                }
+            ],
+            "since": "4.5"
+        },
+        {
+            "description": "Cancels host maintenance.",
+            "isasync": true,
+            "name": "cancelHostMaintenance",
+            "params": [
+                {
+                    "description": "the host ID",
+                    "length": 255,
+                    "name": "id",
+                    "related": "addBaremetalHost,reconnectHost,addHost,cancelHostMaintenance",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "addBaremetalHost,reconnectHost,addHost",
+            "response": [
+                {
+                    "description": "true if the host is disconnected. False otherwise.",
+                    "name": "disconnected",
+                    "type": "date"
+                },
+                {
+                    "description": "the amount of the host's memory currently allocated",
+                    "name": "memoryallocated",
+                    "type": "long"
+                },
+                {
+                    "description": "the host type",
+                    "name": "type",
+                    "type": "type"
+                },
+                {
+                    "description": "the incoming network traffic on the host",
+                    "name": "networkkbsread",
+                    "type": "long"
+                },
+                {
+                    "description": "the state of the host",
+                    "name": "state",
+                    "type": "status"
+                },
+                {
+                    "description": "the date and time the host was last pinged",
+                    "name": "lastpinged",
+                    "type": "date"
+                },
+                {
+                    "description": "true if local storage is active, false otherwise",
+                    "name": "islocalstorageactive",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the resource state of the host",
+                    "name": "resourcestate",
+                    "type": "string"
+                },
+                {
+                    "description": "true if the host is Ha host (dedicated to vms started by HA process; false otherwise",
+                    "name": "hahost",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the Pod ID of the host",
+                    "name": "podid",
+                    "type": "string"
+                },
+                {
+                    "description": "the number of CPU sockets on the host",
+                    "name": "cpusockets",
+                    "type": "integer"
+                },
+                {
+                    "description": "the memory total of the host",
+                    "name": "memorytotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the hypervisor version",
+                    "name": "hypervisorversion",
+                    "type": "string"
+                },
+                {
+                    "description": "the cluster type of the cluster that host belongs to",
+                    "name": "clustertype",
+                    "type": "string"
+                },
+                {
+                    "description": "the OS category ID of the host",
+                    "name": "oscategoryid",
+                    "type": "string"
+                },
+                {
+                    "description": "the management server ID of the host",
+                    "name": "managementserverid",
+                    "type": "long"
+                },
+                {
+                    "description": "the CPU speed of the host",
+                    "name": "cpuspeed",
+                    "type": "long"
+                },
+                {
+                    "description": "the host version",
+                    "name": "version",
+                    "type": "string"
+                },
+                {
+                    "description": "the OS category name of the host",
+                    "name": "oscategoryname",
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone ID of the host",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the date and time the host was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the amount of the host's CPU currently used",
+                    "name": "cpuused",
+                    "type": "string"
+                },
+                {
+                    "description": "the cluster ID of the host",
+                    "name": "clusterid",
+                    "type": "string"
+                },
+                {
+                    "description": "the date and time the host was removed",
+                    "name": "removed",
+                    "type": "date"
+                },
+                {
+                    "description": "true if this host is suitable(has enough capacity and satisfies all conditions like hosttags, max guests vm limit etc) to migrate a VM to it , false otherwise",
+                    "name": "suitableformigration",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the host out-of-band management information",
+                    "name": "outofbandmanagement",
+                    "type": "outofbandmanagementresponse"
+                },
+                {
+                    "description": "the outgoing network traffic on the host",
+                    "name": "networkkbswrite",
+                    "type": "long"
+                },
+                {
+                    "description": "the amount of the host's memory currently used",
+                    "name": "memoryused",
+                    "type": "long"
+                },
+                {
+                    "description": "true if this host has enough CPU and RAM capacity to migrate a VM to it, false otherwise",
+                    "name": "hasenoughcapacity",
+                    "type": "boolean"
+                },
+                {
+                    "description": "capabilities of the host",
+                    "name": "capabilities",
+                    "type": "string"
+                },
+                {
+                    "description": "Host details in key/value pairs.",
+                    "name": "details",
+                    "type": "map"
+                },
+                {
+                    "description": "the ID of the host",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the CPU number of the host",
+                    "name": "cpunumber",
+                    "type": "integer"
+                },
+                {
+                    "description": "the cpu average load on the host",
+                    "name": "averageload",
+                    "type": "long"
+                },
+                {
+                    "description": "the total disk size of the host",
+                    "name": "disksizetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the IP address of the host",
+                    "name": "ipaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone name of the host",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the amount of the host's CPU after applying the cpu.overprovisioning.factor ",
+                    "name": "cpuwithoverprovisioning",
+                    "type": "string"
+                },
+                {
+                    "description": "GPU cards present in the host",
+                    "name": "gpugroup",
+                    "response": [
+                        {
+                            "description": "the list of enabled vGPUs",
+                            "name": "vgpu",
+                            "response": [
+                                {
+                                    "description": "Maximum vgpu can be created with this vgpu type on the given gpu group",
+                                    "name": "maxcapacity",
+                                    "type": "long"
+                                },
+                                {
+                                    "description": "Remaining capacity in terms of no. of more VMs that can be deployped with this vGPU type",
+                                    "name": "remainingcapacity",
+                                    "type": "long"
+                                },
+                                {
+                                    "description": "Maximum no. of vgpu per gpu card (pgpu)",
+                                    "name": "maxvgpuperpgpu",
+                                    "type": "long"
+                                },
+                                {
+                                    "description": "Maximum Y resolution per display",
+                                    "name": "maxresolutiony",
+                                    "type": "long"
+                                },
+                                {
+                                    "description": "Maximum displays per user",
+                                    "name": "maxheads",
+                                    "type": "long"
+                                },
+                                {
+                                    "description": "Video RAM for this vGPU type",
+                                    "name": "videoram",
+                                    "type": "long"
+                                },
+                                {
+                                    "description": "Maximum X resolution per display",
+                                    "name": "maxresolutionx",
+                                    "type": "long"
+                                },
+                                {
+                                    "description": "Model Name of vGPU",
+                                    "name": "vgputype",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "list"
+                        },
+                        {
+                            "description": "GPU cards present in the host",
+                            "name": "gpugroupname",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "the name of the host",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the host's currently allocated disk size",
+                    "name": "disksizeallocated",
+                    "type": "long"
+                },
+                {
+                    "description": "events available for the host",
+                    "name": "events",
+                    "type": "string"
+                },
+                {
+                    "description": "the cluster name of the host",
+                    "name": "clustername",
+                    "type": "string"
+                },
+                {
+                    "description": "the host hypervisor",
+                    "name": "hypervisor",
+                    "type": "hypervisortype"
+                },
+                {
+                    "description": "the amount of the host's CPU currently allocated",
+                    "name": "cpuallocated",
+                    "type": "string"
+                },
+                {
+                    "description": "the Pod name of the host",
+                    "name": "podname",
+                    "type": "string"
+                },
+                {
+                    "description": "comma-separated list of tags for the host",
+                    "name": "hosttags",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Updates a Zone.",
+            "isasync": false,
+            "name": "updateZone",
+            "params": [
+                {
+                    "description": "Network domain name for the networks in the zone; empty string will update domain with NULL value",
+                    "length": 255,
+                    "name": "domain",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "updates a private zone to public if set, but not vice-versa",
+                    "length": 255,
+                    "name": "ispublic",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "the name of the Zone",
+                    "length": 255,
+                    "name": "name",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the first DNS for the Zone",
+                    "length": 255,
+                    "name": "dns1",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the dhcp Provider for the Zone",
+                    "length": 255,
+                    "name": "dhcpprovider",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "Allocation state of this cluster for allocation of new resources",
+                    "length": 255,
+                    "name": "allocationstate",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the second DNS for IPv6 network in the Zone",
+                    "length": 255,
+                    "name": "ip6dns2",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the first DNS for IPv6 network in the Zone",
+                    "length": 255,
+                    "name": "ip6dns1",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the dns search order list",
+                    "length": 255,
+                    "name": "dnssearchorder",
+                    "required": false,
+                    "type": "list"
+                },
+                {
+                    "description": "true if local storage offering enabled, false otherwise",
+                    "length": 255,
+                    "name": "localstorageenabled",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "the first internal DNS for the Zone",
+                    "length": 255,
+                    "name": "internaldns1",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the details for the Zone",
+                    "length": 255,
+                    "name": "details",
+                    "required": false,
+                    "type": "map"
+                },
+                {
+                    "description": "the guest CIDR address for the Zone",
+                    "length": 255,
+                    "name": "guestcidraddress",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the second DNS for the Zone",
+                    "length": 255,
+                    "name": "dns2",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the Zone",
+                    "length": 255,
+                    "name": "id",
+                    "related": "listZones,listZones,createZone,updateZone",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the second internal DNS for the Zone",
+                    "length": 255,
+                    "name": "internaldns2",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "listZones,listZones,createZone",
+            "response": [
+                {
+                    "description": "the first IPv6 DNS for the Zone",
+                    "name": "ip6dns1",
+                    "type": "string"
+                },
+                {
+                    "description": "the network type of the zone; can be Basic or Advanced",
+                    "name": "networktype",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of resource tags associated with zone.",
+                    "name": "tags",
+                    "response": [
+                        {
+                            "description": "the project id the tag belongs to",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "resource type",
+                            "name": "resourcetype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account associated with the tag",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "id of the resource",
+                            "name": "resourceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag key name",
+                            "name": "key",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag value",
+                            "name": "value",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name where tag belongs to",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain associated with the tag",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "customer associated with the tag",
+                            "name": "customer",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the domain associated with the tag",
+                            "name": "domainid",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "Zone name",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the second internal DNS for the Zone",
+                    "name": "internaldns2",
+                    "type": "string"
+                },
+                {
+                    "description": "the allocation state of the cluster",
+                    "name": "allocationstate",
+                    "type": "string"
+                },
+                {
+                    "description": "true if local storage offering enabled, false otherwise",
+                    "name": "localstorageenabled",
+                    "type": "boolean"
+                },
+                {
+                    "description": "Zone id",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the first DNS for the Zone",
+                    "name": "dns1",
+                    "type": "string"
+                },
+                {
+                    "description": "the guest CIDR address for the Zone",
+                    "name": "guestcidraddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the dhcp Provider for the Zone",
+                    "name": "dhcpprovider",
+                    "type": "string"
+                },
+                {
+
+                },
+                {
+                    "description": "the second IPv6 DNS for the Zone",
+                    "name": "ip6dns2",
+                    "type": "string"
+                },
+                {
+                    "description": "the display text of the zone",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "true if security groups support is enabled, false otherwise",
+                    "name": "securitygroupsenabled",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the capacity of the Zone",
+                    "name": "capacity",
+                    "response": [
+                        {
+                            "description": "the Cluster name",
+                            "name": "clustername",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the percentage of capacity currently in use",
+                            "name": "percentused",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the capacity type",
+                            "name": "type",
+                            "type": "short"
+                        },
+                        {
+                            "description": "the Pod ID",
+                            "name": "podid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the total capacity available",
+                            "name": "capacitytotal",
+                            "type": "long"
+                        },
+                        {
+                            "description": "the Zone name",
+                            "name": "zonename",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the Zone ID",
+                            "name": "zoneid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the Cluster ID",
+                            "name": "clusterid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the capacity currently in use",
+                            "name": "capacityused",
+                            "type": "long"
+                        },
+                        {
+                            "description": "the Pod name",
+                            "name": "podname",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "Meta data associated with the zone (key/value pairs)",
+                    "name": "resourcedetails",
+                    "type": "map"
+                },
+                {
+                    "description": "Zone description",
+                    "name": "description",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the containing domain, null for public zones",
+                    "name": "domainname",
+                    "type": "string"
+                },
+                {
+                    "description": "the first internal DNS for the Zone",
+                    "name": "internaldns1",
+                    "type": "string"
+                },
+                {
+                    "description": "Zone Token",
+                    "name": "zonetoken",
+                    "type": "string"
+                },
+                {
+                    "description": "Network domain name for the networks in the zone",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the second DNS for the Zone",
+                    "name": "dns2",
+                    "type": "string"
+                },
+                {
+                    "description": "the UUID of the containing domain, null for public zones",
+                    "name": "domainid",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Lists project's accounts",
+            "isasync": false,
+            "name": "listProjectAccounts",
+            "params": [
+                {
+                    "description": "ID of the project",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "listProjectAccounts,suspendProject,activateProject,updateProject",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "list accounts of the project by role",
+                    "length": 255,
+                    "name": "role",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "list accounts of the project by account name",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                }
+            ],
+            "related": "suspendProject,activateProject,updateProject",
+            "response": [
+                {
+                    "description": "the list of resource tags associated with vm",
+                    "name": "tags",
+                    "response": [
+                        {
+                            "description": "the account associated with the tag",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag value",
+                            "name": "value",
+                            "type": "string"
+                        },
+                        {
+                            "description": "id of the resource",
+                            "name": "resourceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name where tag belongs to",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain associated with the tag",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "resource type",
+                            "name": "resourcetype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag key name",
+                            "name": "key",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the domain associated with the tag",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project id the tag belongs to",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "customer associated with the tag",
+                            "name": "customer",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "the total memory (in MB) available to be created for this project",
+                    "name": "memoryavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total secondary storage space (in GiB) available to be used for this project",
+                    "name": "secondarystorageavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of virtual machines stopped for this project",
+                    "name": "vmstopped",
+                    "type": "integer"
+                },
+                {
+                    "description": "the total secondary storage space (in GiB) the project can own",
+                    "name": "secondarystoragelimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total secondary storage space (in GiB) owned by project",
+                    "name": "secondarystoragetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of vpcs the project can own",
+                    "name": "vpclimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of cpu cores available to be created for this project",
+                    "name": "cpuavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total memory (in MB) the project can own",
+                    "name": "memorylimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of public ip addresses available for this project to acquire",
+                    "name": "ipavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total volume being used by this project",
+                    "name": "volumetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of cpu cores the project can own",
+                    "name": "cpulimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total memory (in MB) owned by project",
+                    "name": "memorytotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of templates which have been created by this project",
+                    "name": "templatetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of snapshots stored by this project",
+                    "name": "snapshottotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of public ip addresses allocated for this project",
+                    "name": "iptotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the id of the project",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the total primary storage space (in GiB) owned by project",
+                    "name": "primarystoragetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of snapshots which can be stored by this project",
+                    "name": "snapshotlimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of templates available to be created by this project",
+                    "name": "templateavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of cpu cores owned by project",
+                    "name": "cputotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total primary storage space (in GiB) the project can own",
+                    "name": "primarystoragelimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of networks owned by project",
+                    "name": "networktotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the domain id the project belongs to",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of virtual machines running for this project",
+                    "name": "vmrunning",
+                    "type": "integer"
+                },
+                {
+                    "description": "the domain name where the project belongs to",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of networks available to be created for this project",
+                    "name": "networkavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of vpcs owned by project",
+                    "name": "vpctotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of templates which can be created by this project",
+                    "name": "templatelimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the displaytext of the project",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "the total volume which can be used by this project",
+                    "name": "volumelimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of the project",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of vpcs available to be created for this project",
+                    "name": "vpcavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of virtual machines that can be deployed by this project",
+                    "name": "vmlimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of snapshots available for this project",
+                    "name": "snapshotavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of public ip addresses this project can acquire",
+                    "name": "iplimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total volume available for this project",
+                    "name": "volumeavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of virtual machines deployed by this project",
+                    "name": "vmtotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of virtual machines available for this project to acquire",
+                    "name": "vmavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the account name of the project's owner",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the total primary storage space (in GiB) available to be used for this project",
+                    "name": "primarystorageavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of networks the project can own",
+                    "name": "networklimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the project",
+                    "name": "name",
+                    "type": "string"
+                }
+            ],
+            "since": "3.0.0"
+        },
+        {
+            "description": "Adds F5 external load balancer appliance.",
+            "isasync": false,
+            "name": "addExternalLoadBalancer",
+            "params": [
+                {
+                    "description": "Username of the external load balancer appliance.",
+                    "length": 255,
+                    "name": "username",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "Zone in which to add the external load balancer appliance.",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones,listZones,createZone",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "URL of the external load balancer appliance.",
+                    "length": 255,
+                    "name": "url",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "Password of the external load balancer appliance.",
+                    "length": 255,
+                    "name": "password",
+                    "required": true,
+                    "type": "string"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the management IP address of the external load balancer",
+                    "name": "ipaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the private interface of the external load balancer",
+                    "name": "privateinterface",
+                    "type": "string"
+                },
+                {
+                    "description": "the zone ID of the external load balancer",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the username that's used to log in to the external load balancer",
+                    "name": "username",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the external load balancer",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the public interface of the external load balancer",
+                    "name": "publicinterface",
+                    "type": "string"
+                },
+                {
+                    "description": "the number of times to retry requests to the external load balancer",
+                    "name": "numretries",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Updates an existing autoscale policy.",
+            "isasync": true,
+            "name": "updateAutoScalePolicy",
+            "params": [
+                {
+                    "description": "the cool down period for which the policy should not be evaluated after the action has been taken",
+                    "length": 255,
+                    "name": "quiettime",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "the duration for which the conditions have to be true before action is taken",
+                    "length": 255,
+                    "name": "duration",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "the list of IDs of the conditions that are being evaluated on every interval",
+                    "length": 255,
+                    "name": "conditionids",
+                    "related": "",
+                    "required": false,
+                    "type": "list"
+                },
+                {
+                    "description": "the ID of the autoscale policy",
+                    "length": 255,
+                    "name": "id",
+                    "related": "updateAutoScalePolicy,listAutoScalePolicies",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "listAutoScalePolicies",
+            "response": [
+                {
+                    "description": "the project name of the autoscale policy",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the cool down period for which the policy should not be evaluated after the action has been taken",
+                    "name": "quiettime",
+                    "type": "integer"
+                },
+                {
+                    "description": "the account owning the autoscale policy",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id autoscale policy",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain ID of the autoscale policy",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the autoscale policy ID",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain name of the autoscale policy",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the action to be executed if all the conditions evaluate to true for the specified duration.",
+                    "name": "action",
+                    "type": "string"
+                },
+                {
+                    "description": "the duration for which the conditions have to be true before action is taken",
+                    "name": "duration",
+                    "type": "integer"
+                },
+                {
+                    "description": "the list of IDs of the conditions that are being evaluated on every interval",
+                    "name": "conditions",
+                    "type": "list"
+                }
+            ]
+        },
+        {
+            "description": "Creates a disk offering.",
+            "isasync": false,
+            "name": "createDiskOffering",
+            "params": [
+                {
+                    "description": "Hypervisor snapshot reserve space as a percent of a volume (for managed storage using Xen or VMware)",
+                    "length": 255,
+                    "name": "hypervisorsnapshotreserve",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "an optional field, whether to display the offering to the end user or not.",
+                    "length": 255,
+                    "name": "displayoffering",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "size of the disk offering in GB (1GB = 1,073,741,824 bytes)",
+                    "length": 255,
+                    "name": "disksize",
+                    "required": false,
+                    "type": "long"
+                },
+                {
+                    "description": "io requests write rate of the disk offering",
+                    "length": 255,
+                    "name": "iopswriterate",
+                    "required": false,
+                    "type": "long"
+                },
+                {
+                    "description": "the ID of the containing domain, null for public offerings",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the storage type of the disk offering. Values are local and shared.",
+                    "length": 255,
+                    "name": "storagetype",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "tags for the disk offering",
+                    "length": 4096,
+                    "name": "tags",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "bytes read rate of the disk offering",
+                    "length": 255,
+                    "name": "bytesreadrate",
+                    "required": false,
+                    "type": "long"
+                },
+                {
+                    "description": "whether disk offering iops is custom or not",
+                    "length": 255,
+                    "name": "customizediops",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "bytes write rate of the disk offering",
+                    "length": 255,
+                    "name": "byteswriterate",
+                    "required": false,
+                    "type": "long"
+                },
+                {
+                    "description": "min iops of the disk offering",
+                    "length": 255,
+                    "name": "miniops",
+                    "required": false,
+                    "type": "long"
+                },
+                {
+                    "description": "io requests read rate of the disk offering",
+                    "length": 255,
+                    "name": "iopsreadrate",
+                    "required": false,
+                    "type": "long"
+                },
+                {
+                    "description": "provisioning type used to create volumes. Valid values are thin, sparse, fat.",
+                    "length": 255,
+                    "name": "provisioningtype",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "name of the disk offering",
+                    "length": 255,
+                    "name": "name",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "whether disk offering size is custom or not",
+                    "length": 255,
+                    "name": "customized",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "alternate display text of the disk offering",
+                    "length": 4096,
+                    "name": "displaytext",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "max iops of the disk offering",
+                    "length": 255,
+                    "name": "maxiops",
+                    "required": false,
+                    "type": "long"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "true if disk offering uses custom size, false otherwise",
+                    "name": "iscustomized",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the cache mode to use for this disk offering. none, writeback or writethrough",
+                    "name": "cacheMode",
+                    "type": "string"
+                },
+                {
+                    "description": "the date this disk offering was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the storage type for this disk offering",
+                    "name": "storagetype",
+                    "type": "string"
+                },
+                {
+                    "description": "true if disk offering uses custom iops, false otherwise",
+                    "name": "iscustomizediops",
+                    "type": "boolean"
+                },
+                {
+                    "description": "Hypervisor snapshot reserve space as a percent of a volume (for managed storage using Xen or VMware)",
+                    "name": "hypervisorsnapshotreserve",
+                    "type": "integer"
+                },
+                {
+                    "description": "whether to display the offering to the end user or not.",
+                    "name": "displayoffering",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the min iops of the disk offering",
+                    "name": "miniops",
+                    "type": "long"
+                },
+                {
+                    "description": "bytes write rate of the disk offering",
+                    "name": "diskBytesWriteRate",
+                    "type": "long"
+                },
+                {
+                    "description": "the domain name this disk offering belongs to. Ignore this information as it is not currently applicable.",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the tags for the disk offering",
+                    "name": "tags",
+                    "type": "string"
+                },
+                {
+                    "description": "io requests write rate of the disk offering",
+                    "name": "diskIopsWriteRate",
+                    "type": "long"
+                },
+                {
+                    "description": "the name of the disk offering",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "provisioning type used to create volumes. Valid values are thin, sparse, fat.",
+                    "name": "provisioningtype",
+                    "type": "string"
+                },
+                {
+                    "description": "io requests read rate of the disk offering",
+                    "name": "diskIopsReadRate",
+                    "type": "long"
+                },
+                {
+                    "description": "the size of the disk offering in GB",
+                    "name": "disksize",
+                    "type": "long"
+                },
+                {
+                    "description": "unique ID of the disk offering",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "an alternate display text of the disk offering.",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "the max iops of the disk offering",
+                    "name": "maxiops",
+                    "type": "long"
+                },
+                {
+                    "description": "the domain ID this disk offering belongs to. Ignore this information as it is not currently applicable.",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "bytes read rate of the disk offering",
+                    "name": "diskBytesReadRate",
+                    "type": "long"
+                }
+            ]
+        },
+        {
+            "description": "Lists all volumes.",
+            "isasync": false,
+            "name": "listVolumes",
+            "params": [
+                {
+                    "description": "the IDs of the volumes, mutually exclusive with id",
+                    "length": 255,
+                    "name": "ids",
+                    "related": "listVolumes,attachVolume,updateVolume,migrateVolume,createVolume,listVolumes,uploadVolume,attachVolume,detachVolume,resizeVolume,migrateVolume,createVolume",
+                    "required": false,
+                    "since": "4.9",
+                    "type": "list"
+                },
+                {
+                    "description": "list resources by account. Must be used with the domainId parameter.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "If set to false, list only resources belonging to the command's caller; if set to true - list resources that the caller is authorized to see. Default value is false",
+                    "length": 255,
+                    "name": "listall",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the virtual machine",
+                    "length": 255,
+                    "name": "virtualmachineid",
+                    "related": "updateVMAffinityGroup,resetSSHKeyForVirtualMachine,migrateVirtualMachineWithVolume,attachIso,removeNicFromVirtualMachine,recoverVirtualMachine,updateVMAffinityGroup,rebootVirtualMachine,restoreVirtualMachine,destroyVirtualMachine,stopVirtualMachine,detachIso,deployVirtualMachine,updateVirtualMachine,revertToVMSnapshot,resetPasswordForVirtualMachine,startVirtualMachine,updateDefaultNicForVirtualMachine,startVirtualMachine,attachIso,listVirtualMachines,addNicToVirtualMachine,stopVirtualMachine,destroyVirtualMachine,removeNicFromVirtualMachine,changeServiceForVirtualMachine",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list resources by display flag; only ROOT admin is eligible to pass this parameter",
+                    "length": 255,
+                    "name": "displayvolume",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "boolean"
+                },
+                {
+                    "description": "list volumes on specified host",
+                    "length": 255,
+                    "name": "hostid",
+                    "related": "addBaremetalHost,reconnectHost,addHost",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list only resources belonging to the domain specified",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list objects by project",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "suspendProject,activateProject,updateProject",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "List resources by tags (key/value pairs)",
+                    "length": 255,
+                    "name": "tags",
+                    "required": false,
+                    "type": "map"
+                },
+                {
+                    "description": "the name of the disk volume",
+                    "length": 255,
+                    "name": "name",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the disk volume",
+                    "length": 255,
+                    "name": "id",
+                    "related": "listVolumes,attachVolume,updateVolume,migrateVolume,createVolume,listVolumes,uploadVolume,attachVolume,detachVolume,resizeVolume,migrateVolume,createVolume",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "the ID of the storage pool, available to ROOT admin only",
+                    "length": 255,
+                    "name": "storageid",
+                    "related": "createStoragePool,findStoragePoolsForMigration,enableStorageMaintenance,cancelStorageMaintenance",
+                    "required": false,
+                    "since": "4.3",
+                    "type": "uuid"
+                },
+                {
+                    "description": "defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.",
+                    "length": 255,
+                    "name": "isrecursive",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "the ID of the availability zone",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones,listZones,createZone",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the type of disk volume",
+                    "length": 255,
+                    "name": "type",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the pod id the disk volume belongs to",
+                    "length": 255,
+                    "name": "podid",
+                    "related": "updatePod",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list volumes by disk offering",
+                    "length": 255,
+                    "name": "diskofferingid",
+                    "related": "",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "uuid"
+                }
+            ],
+            "related": "attachVolume,updateVolume,migrateVolume,createVolume,listVolumes,uploadVolume,attachVolume,detachVolume,resizeVolume,migrateVolume,createVolume",
+            "response": [
+                {
+                    "description": "the date the disk volume was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the ID of the ISO attached to the virtual machine",
+                    "name": "isoid",
+                    "type": "string"
+                },
+                {
+                    "description": "true if the volume is extractable, false otherwise",
+                    "name": "isextractable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the project name of the vpn",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "io requests read rate of the disk volume",
+                    "name": "diskIopsReadRate",
+                    "type": "long"
+                },
+                {
+                    "description": "provisioning type used to create volumes.",
+                    "name": "provisioningtype",
+                    "type": "string"
+                },
+                {
+                    "description": "size of the disk volume",
+                    "name": "size",
+                    "type": "long"
+                },
+                {
+                    "description": "ID of the disk offering",
+                    "name": "diskofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "the account associated with the disk volume",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "name of the disk offering",
+                    "name": "diskofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "need quiesce vm or not when taking snapshot",
+                    "name": "quiescevm",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the name of the ISO attached to the virtual machine",
+                    "name": "isoname",
+                    "type": "string"
+                },
+                {
+                    "description": "an alternate display text of the ISO attached to the virtual machine",
+                    "name": "isodisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "name of the service offering for root disk",
+                    "name": "serviceofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "the path of the volume",
+                    "name": "path",
+                    "type": "string"
+                },
+                {
+                    "description": "state of the virtual machine",
+                    "name": "vmstate",
+                    "type": "string"
+                },
+                {
+                    "description": "ID of the snapshot from which this volume was created",
+                    "name": "snapshotid",
+                    "type": "string"
+                },
+                {
+                    "description": "bytes read rate of the disk volume",
+                    "name": "diskBytesReadRate",
+                    "type": "long"
+                },
+                {
+                    "description": "the chain info of the volume",
+                    "name": "chaininfo",
+                    "type": "string"
+                },
+                {
+                    "description": "the display text of the service offering for root disk",
+                    "name": "serviceofferingdisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "max iops of the disk volume",
+                    "name": "maxiops",
+                    "type": "long"
+                },
+                {
+                    "description": "id of the primary storage hosting the disk volume; returned to admin user only",
+                    "name": "storageid",
+                    "type": "string"
+                },
+                {
+                    "description": "id of the virtual machine",
+                    "name": "virtualmachineid",
+                    "type": "string"
+                },
+                {
+                    "description": "display name of the virtual machine",
+                    "name": "vmdisplayname",
+                    "type": "string"
+                },
+                {
+                    "description": "ID of the availability zone",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of the disk volume",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "min iops of the disk volume",
+                    "name": "miniops",
+                    "type": "long"
+                },
+                {
+                    "description": "name of the virtual machine",
+                    "name": "vmname",
+                    "type": "string"
+                },
+                {
+                    "description": "bytes write rate of the disk volume",
+                    "name": "diskBytesWriteRate",
+                    "type": "long"
+                },
+                {
+                    "description": "ID of the disk volume",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "type of the disk volume (ROOT or DATADISK)",
+                    "name": "type",
+                    "type": "string"
+                },
+                {
+                    "description": "io requests write rate of the disk volume",
+                    "name": "diskIopsWriteRate",
+                    "type": "long"
+                },
+                {
+                    "description": "name of the disk volume",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the template for the virtual machine",
+                    "name": "templatename",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain associated with the disk volume",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the domain associated with the disk volume",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the vpn",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the device on user vm the volume is attahed to. This tag is not returned when the volume is detached.",
+                    "name": "deviceid",
+                    "type": "long"
+                },
+                {
+                    "description": "the status of the volume",
+                    "name": "status",
+                    "type": "string"
+                },
+                {
+                    "description": "the display text of the disk offering",
+                    "name": "diskofferingdisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": " an alternate display text of the template for the virtual machine",
+                    "name": "templatedisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "Hypervisor the volume belongs to",
+                    "name": "hypervisor",
+                    "type": "string"
+                },
+                {
+                    "description": "the date the volume was attached to a VM instance",
+                    "name": "attached",
+                    "type": "date"
+                },
+                {
+                    "description": "shared or local storage",
+                    "name": "storagetype",
+                    "type": "string"
+                },
+                {
+                    "description": "name of the primary storage hosting the disk volume",
+                    "name": "storage",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the template for the virtual machine. A -1 is returned if the virtual machine was created from an ISO file.",
+                    "name": "templateid",
+                    "type": "string"
+                },
+                {
+                    "description": "name of the availability zone",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the boolean state of whether the volume is destroyed or not",
+                    "name": "destroyed",
+                    "type": "boolean"
+                },
+                {
+                    "description": "ID of the service offering for root disk",
+                    "name": "serviceofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "an optional field whether to the display the volume to the end user or not.",
+                    "name": "displayvolume",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "Creates a load balancer health check policy",
+            "isasync": true,
+            "name": "createLBHealthCheckPolicy",
+            "params": [
+                {
+                    "description": "HTTP ping path",
+                    "length": 255,
+                    "name": "pingpath",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "an optional field, whether to the display the rule to the end user or not",
+                    "length": 255,
+                    "name": "fordisplay",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the ID of the load balancer rule",
+                    "length": 255,
+                    "name": "lbruleid",
+                    "related": "",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the description of the load balancer health check policy",
+                    "length": 255,
+                    "name": "description",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "Amount of time between health checks (1 sec - 20940 sec)",
+                    "length": 255,
+                    "name": "intervaltime",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "Time to wait when receiving a response from the health check (2sec - 60 sec)",
+                    "length": 255,
+                    "name": "responsetimeout",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "Number of consecutive health check failures before declaring an instance unhealthy",
+                    "length": 255,
+                    "name": "unhealthythreshold",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "Number of consecutive health check success before declaring an instance healthy",
+                    "length": 255,
+                    "name": "healthythreshold",
+                    "required": false,
+                    "type": "integer"
+                }
+            ],
+            "related": "listLBHealthCheckPolicies",
+            "response": [
+                {
+                    "description": "the list of healthcheckpolicies",
+                    "name": "healthcheckpolicy",
+                    "response": [
+                        {
+                            "description": "the description of the healthcheck policy",
+                            "name": "description",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the state of the policy",
+                            "name": "state",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Number of consecutive health check failures before declaring an instance unhealthy.",
+                            "name": "unhealthcheckthresshold",
+                            "type": "int"
+                        },
+                        {
+                            "description": "Time to wait when receiving a response from the health check",
+                            "name": "responsetime",
+                            "type": "int"
+                        },
+                        {
+                            "description": "Number of consecutive health check success before declaring an instance healthy",
+                            "name": "healthcheckthresshold",
+                            "type": "int"
+                        },
+                        {
+                            "description": "the LB HealthCheck policy ID",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Amount of time between health checks",
+                            "name": "healthcheckinterval",
+                            "type": "int"
+                        },
+                        {
+                            "description": "the pingpath  of the healthcheck policy",
+                            "name": "pingpath",
+                            "type": "string"
+                        },
+                        {
+                            "description": "is policy for display to the regular user",
+                            "name": "fordisplay",
+                            "type": "boolean"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "the domain of the HealthCheck policy",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the account of the HealthCheck policy",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the id of the zone the HealthCheck policy belongs to",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain ID of the HealthCheck policy",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the LB rule ID",
+                    "name": "lbruleid",
+                    "type": "string"
+                }
+            ],
+            "since": "4.2.0"
+        },
+        {
+            "description": "Locks a user account",
+            "isasync": false,
+            "name": "lockUser",
+            "params": [
+                {
+                    "description": "Locks user by user ID.",
+                    "length": 255,
+                    "name": "id",
+                    "related": "disableUser,lockUser,enableUser,getUser,listUsers,updateUser,createUser",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "disableUser,enableUser,getUser,listUsers,updateUser,createUser",
+            "response": [
+                {
+                    "description": "the user name",
+                    "name": "username",
+                    "type": "string"
+                },
+                {
+                    "description": "the date and time the user account was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the account ID of the user",
+                    "name": "accountid",
+                    "type": "string"
+                },
+                {
+                    "description": "true if user is default, false otherwise",
+                    "name": "isdefault",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the account name of the user",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the boolean value representing if the updating target is in caller's child domain",
+                    "name": "iscallerchilddomain",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the user email address",
+                    "name": "email",
+                    "type": "string"
+                },
+                {
+                    "description": "the user ID",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the type of the role",
+                    "name": "roletype",
+                    "type": "string"
+                },
+                {
+                    "description": "the api key of the user",
+                    "name": "apikey",
+                    "type": "string"
+                },
+                {
+                    "description": "the user firstname",
+                    "name": "firstname",
+                    "type": "string"
+                },
+                {
+                    "description": "the account type of the user",
+                    "name": "accounttype",
+                    "type": "short"
+                },
+                {
+                    "description": "the user state",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the role",
+                    "name": "rolename",
+                    "type": "string"
+                },
+                {
+                    "description": "the timezone user was created in",
+                    "name": "timezone",
+                    "type": "string"
+                },
+                {
+                    "description": "the secret key of the user",
+                    "name": "secretkey",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain name of the user",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain ID of the user",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the user lastname",
+                    "name": "lastname",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the role",
+                    "name": "roleid",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Lists load balancer health check policies.",
+            "isasync": false,
+            "name": "listLBHealthCheckPolicies",
+            "params": [
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "the ID of the health check policy",
+                    "length": 255,
+                    "name": "id",
+                    "related": "listLBHealthCheckPolicies",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "the ID of the load balancer rule",
+                    "length": 255,
+                    "name": "lbruleid",
+                    "related": "",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "list resources by display flag; only ROOT admin is eligible to pass this parameter",
+                    "length": 255,
+                    "name": "fordisplay",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "boolean"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the account of the HealthCheck policy",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of healthcheckpolicies",
+                    "name": "healthcheckpolicy",
+                    "response": [
+                        {
+                            "description": "Amount of time between health checks",
+                            "name": "healthcheckinterval",
+                            "type": "int"
+                        },
+                        {
+                            "description": "Number of consecutive health check failures before declaring an instance unhealthy.",
+                            "name": "unhealthcheckthresshold",
+                            "type": "int"
+                        },
+                        {
+                            "description": "the pingpath  of the healthcheck policy",
+                            "name": "pingpath",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the description of the healthcheck policy",
+                            "name": "description",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Number of consecutive health check success before declaring an instance healthy",
+                            "name": "healthcheckthresshold",
+                            "type": "int"
+                        },
+                        {
+                            "description": "is policy for display to the regular user",
+                            "name": "fordisplay",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "the state of the policy",
+                            "name": "state",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Time to wait when receiving a response from the health check",
+                            "name": "responsetime",
+                            "type": "int"
+                        },
+                        {
+                            "description": "the LB HealthCheck policy ID",
+                            "name": "id",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "the LB rule ID",
+                    "name": "lbruleid",
+                    "type": "string"
+                },
+                {
+                    "description": "the id of the zone the HealthCheck policy belongs to",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain of the HealthCheck policy",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain ID of the HealthCheck policy",
+                    "name": "domainid",
+                    "type": "string"
+                }
+            ],
+            "since": "4.2.0"
+        },
+        {
+            "description": "Creates a network",
+            "isasync": false,
+            "name": "createNetwork",
+            "params": [
+                {
+                    "description": "the gateway of the IPv6 network. Required for Shared networks",
+                    "length": 255,
+                    "name": "ip6gateway",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the netmask of the network. Required for shared networks and isolated networks when it belongs to VPC",
+                    "length": 255,
+                    "name": "netmask",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "an optional field, whether to the display the network to the end user or not.",
+                    "length": 255,
+                    "name": "displaynetwork",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "the zone ID for the network",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones,listZones,createZone",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the ending IPv6 address in the IPv6 network range",
+                    "length": 255,
+                    "name": "endipv6",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the ending IP address in the network IP range. If not specified, will be defaulted to startIP",
+                    "length": 255,
+                    "name": "endip",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the CIDR of IPv6 network, must be at least /64",
+                    "length": 255,
+                    "name": "ip6cidr",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the gateway of the network. Required for shared networks and isolated networks when it belongs to VPC",
+                    "length": 255,
+                    "name": "gateway",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the display text of the network",
+                    "length": 255,
+                    "name": "displaytext",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the beginning IP address in the network IP range",
+                    "length": 255,
+                    "name": "startip",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "domain ID of the account owning a network",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the ID or VID of the network",
+                    "length": 255,
+                    "name": "vlan",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the isolated private VLAN for this network",
+                    "length": 255,
+                    "name": "isolatedpvlan",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the network offering ID",
+                    "length": 255,
+                    "name": "networkofferingid",
+                    "related": "listNetworkOfferings",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "Defines whether to allow subdomains to use networks dedicated to their parent domain(s). Should be used with aclType=Domain, defaulted to allow.subdomain.network.access global config if not specified",
+                    "length": 255,
+                    "name": "subdomainaccess",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "the beginning IPv6 address in the IPv6 network range",
+                    "length": 255,
+                    "name": "startipv6",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "an optional project for the SSH key",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "suspendProject,activateProject,updateProject",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "Access control type; supported values are account and domain. In 3.0 all shared networks should have aclType=Domain, and all isolated networks - Account. Account means that only the account owner can use the network, domain - all accounts in the domain can use the network",
+                    "length": 255,
+                    "name": "acltype",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the physical network ID the network belongs to",
+                    "length": 255,
+                    "name": "physicalnetworkid",
+                    "related": "createPhysicalNetwork",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the VPC network belongs to",
+                    "length": 255,
+                    "name": "vpcid",
+                    "related": "restartVPC,listVPCs,updateVPC,listVPCs,createVPC",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "account that will own the network",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the network",
+                    "length": 255,
+                    "name": "name",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "network domain",
+                    "length": 255,
+                    "name": "networkdomain",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "Network ACL ID associated for the network",
+                    "length": 255,
+                    "name": "aclid",
+                    "related": "createNetworkACLList",
+                    "required": false,
+                    "type": "uuid"
+                }
+            ],
+            "related": "updateNetwork,listBrocadeVcsDeviceNetworks,createNetwork,listNetworks,listNetscalerLoadBalancerNetworks,listF5LoadBalancerNetworks",
+            "response": [
+                {
+                    "description": "the name of the network",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "true if network offering is ip conserve mode enabled",
+                    "name": "networkofferingconservemode",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the cidr of IPv6 network",
+                    "name": "ip6cidr",
+                    "type": "string"
+                },
+                {
+                    "description": "display text of the network offering the network is created from",
+                    "name": "networkofferingdisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "true if network is system, false otherwise",
+                    "name": "issystem",
+                    "type": "boolean"
+                },
+                {
+                    "description": "Broadcast domain type of the network",
+                    "name": "broadcastdomaintype",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the zone the network belongs to",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "broadcast uri of the network. This parameter is visible to ROOT admins only",
+                    "name": "broadcasturi",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of services",
+                    "name": "service",
+                    "response": [
+                        {
+                            "description": "the service name",
+                            "name": "name",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of capabilities",
+                            "name": "capability",
+                            "response": [
+                                {
+                                    "description": "can this service capability value can be choosable while creatine network offerings",
+                                    "name": "canchooseservicecapability",
+                                    "type": "boolean"
+                                },
+                                {
+                                    "description": "the capability value",
+                                    "name": "value",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the capability name",
+                                    "name": "name",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "list"
+                        },
+                        {
+                            "description": "the service provider name",
+                            "name": "provider",
+                            "response": [
+                                {
+                                    "description": "the physical network this belongs to",
+                                    "name": "physicalnetworkid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the destination physical network",
+                                    "name": "destinationphysicalnetworkid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "true if individual services can be enabled/disabled",
+                                    "name": "canenableindividualservice",
+                                    "type": "boolean"
+                                },
+                                {
+                                    "description": "state of the network provider",
+                                    "name": "state",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "services for this provider",
+                                    "name": "servicelist",
+                                    "type": "list"
+                                },
+                                {
+                                    "description": "uuid of the network provider",
+                                    "name": "id",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the provider name",
+                                    "name": "name",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "list"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "true network requires restart",
+                    "name": "restartrequired",
+                    "type": "boolean"
+                },
+                {
+                    "description": "name of the network offering the network is created from",
+                    "name": "networkofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "the network's netmask",
+                    "name": "netmask",
+                    "type": "string"
+                },
+                {
+                    "description": "list networks available for vm deployment",
+                    "name": "canusefordeploy",
+                    "type": "boolean"
+                },
+                {
+                    "description": "availability of the network offering the network is created from",
+                    "name": "networkofferingavailability",
+                    "type": "string"
+                },
+                {
+                    "description": "network offering id the network is created from",
+                    "name": "networkofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "list networks that are persistent",
+                    "name": "ispersistent",
+                    "type": "boolean"
+                },
+                {
+                    "description": "If a network is enabled for 'streched l2 subnet' then represents zones on which network currently spans",
+                    "name": "zonesnetworkspans",
+                    "type": "set"
+                },
+                {
+                    "description": "The vlan of the network. This parameter is visible to ROOT admins only",
+                    "name": "vlan",
+                    "type": "string"
+                },
+                {
+                    "description": "the owner of the network",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the network CIDR of the guest network configured with IP reservation. It is the summation of CIDR and RESERVED_IP_RANGE",
+                    "name": "networkcidr",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of resource tags associated with network",
+                    "name": "tags",
+                    "response": [
+                        {
+                            "description": "tag value",
+                            "name": "value",
+                            "type": "string"
+                        },
+                        {
+                            "description": "customer associated with the tag",
+                            "name": "customer",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag key name",
+                            "name": "key",
+                            "type": "string"
+                        },
+                        {
+                            "description": "id of the resource",
+                            "name": "resourceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name where tag belongs to",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account associated with the tag",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain associated with the tag",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project id the tag belongs to",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the domain associated with the tag",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "resource type",
+                            "name": "resourcetype",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "the second DNS for the network",
+                    "name": "dns2",
+                    "type": "string"
+                },
+                {
+                    "description": "true if network supports specifying ip ranges, false otherwise",
+                    "name": "specifyipranges",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the displaytext of the network",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "ACL Id associated with the VPC network",
+                    "name": "aclid",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the address",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain id of the network owner",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "zone id of the network",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the ipaddress",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "acl type - access type to the network",
+                    "name": "acltype",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain name of the network owner",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "state of the network",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "an optional field, whether to the display the network to the end user or not.",
+                    "name": "displaynetwork",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the gateway of IPv6 network",
+                    "name": "ip6gateway",
+                    "type": "string"
+                },
+                {
+                    "description": "the network's IP range not to be used by CloudStack guest VMs and can be used for non CloudStack purposes",
+                    "name": "reservediprange",
+                    "type": "string"
+                },
+                {
+                    "description": "the id of the network",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the type of the network",
+                    "name": "type",
+                    "type": "string"
+                },
+                {
+                    "description": "VPC the network belongs to",
+                    "name": "vpcid",
+                    "type": "string"
+                },
+                {
+                    "description": "true if users from subdomains can access the domain level network",
+                    "name": "subdomainaccess",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the network domain",
+                    "name": "networkdomain",
+                    "type": "string"
+                },
+                {
+                    "description": "Cloudstack managed address space, all CloudStack managed VMs get IP address from CIDR",
+                    "name": "cidr",
+                    "type": "string"
+                },
+                {
+                    "description": "the network's gateway",
+                    "name": "gateway",
+                    "type": "string"
+                },
+                {
+                    "description": "the first DNS for the network",
+                    "name": "dns1",
+                    "type": "string"
+                },
+                {
+                    "description": "the physical network id",
+                    "name": "physicalnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "the traffic type of the network",
+                    "name": "traffictype",
+                    "type": "string"
+                },
+                {
+                    "description": "true if network can span multiple zones",
+                    "name": "strechedl2subnet",
+                    "type": "boolean"
+                },
+                {
+                    "description": "related to what other network configuration",
+                    "name": "related",
+                    "type": "string"
+                },
+                {
+                    "description": "true if network is default, false otherwise",
+                    "name": "isdefault",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "Lists all available network offerings.",
+            "isasync": false,
+            "name": "listNetworkOfferings",
+            "params": [
+                {
+                    "description": "true if need to list only default network offerings. Default value is false",
+                    "length": 255,
+                    "name": "isdefault",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "list network offerings by guest type: shared or isolated",
+                    "length": 255,
+                    "name": "guestiptype",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the network offering can be used only for network creation inside the VPC",
+                    "length": 255,
+                    "name": "forvpc",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if need to list only network offerings which support specifying ip ranges",
+                    "length": 255,
+                    "name": "specifyipranges",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if offering has tags specified",
+                    "length": 255,
+                    "name": "istagged",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "the ID of the network. Pass this in if you want to see the available network offering that a network can be changed to.",
+                    "length": 255,
+                    "name": "networkid",
+                    "related": "updateNetwork,listBrocadeVcsDeviceNetworks,createNetwork,listNetworks,listNetscalerLoadBalancerNetworks,listF5LoadBalancerNetworks",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list network offerings supporting certain services",
+                    "length": 255,
+                    "name": "supportedservices",
+                    "required": false,
+                    "type": "list"
+                },
+                {
+                    "description": "list by traffic type",
+                    "length": 255,
+                    "name": "traffictype",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "list network offerings available for network creation in specific zone",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones,listZones,createZone",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "true if need to list only netwok offerings where source NAT is supported, false otherwise",
+                    "length": 255,
+                    "name": "sourcenatsupported",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "list network offerings by display text",
+                    "length": 255,
+                    "name": "displaytext",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the availability of network offering. Default value is required",
+                    "length": 255,
+                    "name": "availability",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "list network offerings by name",
+                    "length": 255,
+                    "name": "name",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "list network offerings by ID",
+                    "length": 255,
+                    "name": "id",
+                    "related": "listNetworkOfferings",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list network offerings by tags",
+                    "length": 4096,
+                    "name": "tags",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "list network offerings by state",
+                    "length": 255,
+                    "name": "state",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the tags for the network offering.",
+                    "length": 255,
+                    "name": "specifyvlan",
+                    "required": false,
+                    "type": "boolean"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "true if network offering can be used by VPC networks only",
+                    "name": "forvpc",
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if guest network default egress policy is allow; false if default egress policy is deny",
+                    "name": "egressdefaultpolicy",
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if network offering supports vlans, false otherwise",
+                    "name": "specifyvlan",
+                    "type": "boolean"
+                },
+                {
+                    "description": "guest type of the network offering, can be Shared or Isolated",
+                    "name": "guestiptype",
+                    "type": "string"
+                },
+                {
+                    "description": "the traffic type for the network offering, supported types are Public, Management, Control, Guest, Vlan or Storage.",
+                    "name": "traffictype",
+                    "type": "string"
+                },
+                {
+                    "description": "the id of the network offering",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the tags for the network offering",
+                    "name": "tags",
+                    "type": "string"
+                },
+                {
+                    "description": "availability of the network offering",
+                    "name": "availability",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of supported services",
+                    "name": "service",
+                    "response": [
+                        {
+                            "description": "the service provider name",
+                            "name": "provider",
+                            "response": [
+                                {
+                                    "description": "uuid of the network provider",
+                                    "name": "id",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the destination physical network",
+                                    "name": "destinationphysicalnetworkid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "services for this provider",
+                                    "name": "servicelist",
+                                    "type": "list"
+                                },
+                                {
+                                    "description": "the physical network this belongs to",
+                                    "name": "physicalnetworkid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the provider name",
+                                    "name": "name",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "state of the network provider",
+                                    "name": "state",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "true if individual services can be enabled/disabled",
+                                    "name": "canenableindividualservice",
+                                    "type": "boolean"
+                                }
+                            ],
+                            "type": "list"
+                        },
+                        {
+                            "description": "the list of capabilities",
+                            "name": "capability",
+                            "response": [
+                                {
+                                    "description": "can this service capability value can be choosable while creatine network offerings",
+                                    "name": "canchooseservicecapability",
+                                    "type": "boolean"
+                                },
+                                {
+                                    "description": "the capability name",
+                                    "name": "name",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the capability value",
+                                    "name": "value",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "list"
+                        },
+                        {
+                            "description": "the service name",
+                            "name": "name",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "data transfer rate in megabits per second allowed.",
+                    "name": "networkrate",
+                    "type": "integer"
+                },
+                {
+                    "description": "the date this network offering was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the ID of the service offering used by virtual router provider",
+                    "name": "serviceofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "true if network offering supports persistent networks, false otherwise",
+                    "name": "ispersistent",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the name of the network offering",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "additional key/value details tied with network offering",
+                    "name": "details",
+                    "type": "map"
+                },
+                {
+                    "description": "state of the network offering. Can be Disabled/Enabled/Inactive",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "true if network offering supports specifying ip ranges, false otherwise",
+                    "name": "specifyipranges",
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if network offering is ip conserve mode enabled",
+                    "name": "conservemode",
+                    "type": "boolean"
+                },
+                {
+                    "description": "maximum number of concurrents connections to be handled by lb",
+                    "name": "maxconnections",
+                    "type": "integer"
+                },
+                {
+                    "description": "an alternate display text of the network offering.",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "true if network offering supports network that span multiple zones",
+                    "name": "supportsstrechedl2subnet",
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if network offering is default, false otherwise",
+                    "name": "isdefault",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "Lists dedicated pods.",
+            "isasync": false,
+            "name": "listDedicatedPods",
+            "params": [
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "the ID of the pod",
+                    "length": 255,
+                    "name": "podid",
+                    "related": "updatePod",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list dedicated pods by affinity group",
+                    "length": 255,
+                    "name": "affinitygroupid",
+                    "related": "",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the name of the account associated with the pod. Must be used with domainId.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the domain associated with the pod",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the Name of the Pod",
+                    "name": "podname",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the Pod",
+                    "name": "podid",
+                    "type": "string"
+                },
+                {
+                    "description": "the Dedication Affinity Group ID of the pod",
+                    "name": "affinitygroupid",
+                    "type": "string"
+                },
+                {
+                    "description": "the Account Id to which the Pod is dedicated",
+                    "name": "accountid",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain ID to which the Pod is dedicated",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the dedicated resource",
+                    "name": "id",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Lists VPCs",
+            "isasync": false,
+            "name": "listVPCs",
+            "params": [
+                {
+                    "description": "list VPC supporting certain services",
+                    "length": 255,
+                    "name": "supportedservices",
+                    "required": false,
+                    "type": "list"
+                },
+                {
+                    "description": "list objects by project",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "suspendProject,activateProject,updateProject",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list VPCs by restartRequired option",
+                    "length": 255,
+                    "name": "restartrequired",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "list resources by display flag; only ROOT admin is eligible to pass this parameter",
+                    "length": 255,
+                    "name": "fordisplay",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "boolean"
+                },
+                {
+                    "description": "list by ID of the VPC offering",
+                    "length": 255,
+                    "name": "vpcofferingid",
+                    "related": "updateVPCOffering",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list resources by account. Must be used with the domainId parameter.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "List resources by tags (key/value pairs)",
+                    "length": 255,
+                    "name": "tags",
+                    "required": false,
+                    "type": "map"
+                },
+                {
+                    "description": "List by display text of the VPC",
+                    "length": 255,
+                    "name": "displaytext",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "list VPC by id",
+                    "length": 255,
+                    "name": "id",
+                    "related": "restartVPC,listVPCs,updateVPC,listVPCs,createVPC",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list by zone",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones,listZones,createZone",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list VPCs by state",
+                    "length": 255,
+                    "name": "state",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "If set to false, list only resources belonging to the command's caller; if set to true - list resources that the caller is authorized to see. Default value is false",
+                    "length": 255,
+                    "name": "listall",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "list by cidr of the VPC. All VPC guest networks' cidrs should be within this CIDR",
+                    "length": 255,
+                    "name": "cidr",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.",
+                    "length": 255,
+                    "name": "isrecursive",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "list only resources belonging to the domain specified",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "list by name of the VPC",
+                    "length": 255,
+                    "name": "name",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "restartVPC,updateVPC,listVPCs,createVPC",
+            "response": [
+                {
+                    "description": "the project name of the VPC",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the id of the VPC",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain name of the owner",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "is vpc for display to the regular user",
+                    "name": "fordisplay",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the list of networks belongign to the VPC",
+                    "name": "network",
+                    "response": [
+                        {
+                            "description": "the network CIDR of the guest network configured with IP reservation. It is the summation of CIDR and RESERVED_IP_RANGE",
+                            "name": "networkcidr",
+                            "type": "string"
+                        },
+                        {
+                            "description": "related to what other network configuration",
+                            "name": "related",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the name of the zone the network belongs to",
+                            "name": "zonename",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the physical network id",
+                            "name": "physicalnetworkid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "name of the network offering the network is created from",
+                            "name": "networkofferingname",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the type of the network",
+                            "name": "type",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if network is default, false otherwise",
+                            "name": "isdefault",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "true if network offering is ip conserve mode enabled",
+                            "name": "networkofferingconservemode",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "the network's IP range not to be used by CloudStack guest VMs and can be used for non CloudStack purposes",
+                            "name": "reservediprange",
+                            "type": "string"
+                        },
+                        {
+                            "description": "state of the network",
+                            "name": "state",
+                            "type": "string"
+                        },
+                        {
+                            "description": "network offering id the network is created from",
+                            "name": "networkofferingid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if network supports specifying ip ranges, false otherwise",
+                            "name": "specifyipranges",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "The vlan of the network. This parameter is visible to ROOT admins only",
+                            "name": "vlan",
+                            "type": "string"
+                        },
+                        {
+                            "description": "an optional field, whether to the display the network to the end user or not.",
+                            "name": "displaynetwork",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "If a network is enabled for 'streched l2 subnet' then represents zones on which network currently spans",
+                            "name": "zonesnetworkspans",
+                            "type": "set"
+                        },
+                        {
+                            "description": "the traffic type of the network",
+                            "name": "traffictype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the second DNS for the network",
+                            "name": "dns2",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true network requires restart",
+                            "name": "restartrequired",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "availability of the network offering the network is created from",
+                            "name": "networkofferingavailability",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if network is system, false otherwise",
+                            "name": "issystem",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "the network's netmask",
+                            "name": "netmask",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project id of the ipaddress",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "list networks available for vm deployment",
+                            "name": "canusefordeploy",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "the project name of the address",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the first DNS for the network",
+                            "name": "dns1",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the network domain",
+                            "name": "networkdomain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the gateway of IPv6 network",
+                            "name": "ip6gateway",
+                            "type": "string"
+                        },
+                        {
+                            "description": "zone id of the network",
+                            "name": "zoneid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "display text of the network offering the network is created from",
+                            "name": "networkofferingdisplaytext",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain name of the network owner",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Broadcast domain type of the network",
+                            "name": "broadcastdomaintype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the network's gateway",
+                            "name": "gateway",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the cidr of IPv6 network",
+                            "name": "ip6cidr",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Cloudstack managed address space, all CloudStack managed VMs get IP address from CIDR",
+                            "name": "cidr",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the name of the network",
+                            "name": "name",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the displaytext of the network",
+                            "name": "displaytext",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain id of the network owner",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of resource tags associated with network",
+                            "name": "tags",
+                            "response": [
+                                {
+                                    "description": "customer associated with the tag",
+                                    "name": "customer",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the domain associated with the tag",
+                                    "name": "domain",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the ID of the domain associated with the tag",
+                                    "name": "domainid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the project id the tag belongs to",
+                                    "name": "projectid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "id of the resource",
+                                    "name": "resourceid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "tag key name",
+                                    "name": "key",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "resource type",
+                                    "name": "resourcetype",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the project name where tag belongs to",
+                                    "name": "project",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "tag value",
+                                    "name": "value",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the account associated with the tag",
+                                    "name": "account",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "list"
+                        },
+                        {
+                            "description": "the owner of the network",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "broadcast uri of the network. This parameter is visible to ROOT admins only",
+                            "name": "broadcasturi",
+                            "type": "string"
+                        },
+                        {
+                            "description": "ACL Id associated with the VPC network",
+                            "name": "aclid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of services",
+                            "name": "service",
+                            "response": [
+                                {
+                                    "description": "the service provider name",
+                                    "name": "provider",
+                                    "response": [
+                                        {
+                                            "description": "the destination physical network",
+                                            "name": "destinationphysicalnetworkid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "services for this provider",
+                                            "name": "servicelist",
+                                            "type": "list"
+                                        },
+                                        {
+                                            "description": "state of the network provider",
+                                            "name": "state",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "true if individual services can be enabled/disabled",
+                                            "name": "canenableindividualservice",
+                                            "type": "boolean"
+                                        },
+                                        {
+                                            "description": "uuid of the network provider",
+                                            "name": "id",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the provider name",
+                                            "name": "name",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the physical network this belongs to",
+                                            "name": "physicalnetworkid",
+                                            "type": "string"
+                                        }
+                                    ],
+                                    "type": "list"
+                                },
+                                {
+                                    "description": "the service name",
+                                    "name": "name",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the list of capabilities",
+                                    "name": "capability",
+                                    "response": [
+                                        {
+                                            "description": "the capability name",
+                                            "name": "name",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the capability value",
+                                            "name": "value",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "can this service capability value can be choosable while creatine network offerings",
+                                            "name": "canchooseservicecapability",
+                                            "type": "boolean"
+                                        }
+                                    ],
+                                    "type": "list"
+                                }
+                            ],
+                            "type": "list"
+                        },
+                        {
+                            "description": "list networks that are persistent",
+                            "name": "ispersistent",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "true if users from subdomains can access the domain level network",
+                            "name": "subdomainaccess",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "VPC the network belongs to",
+                            "name": "vpcid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the id of the network",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if network can span multiple zones",
+                            "name": "strechedl2subnet",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "acl type - access type to the network",
+                            "name": "acltype",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "the network domain of the VPC",
+                    "name": "networkdomain",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of resource tags associated with the project",
+                    "name": "tags",
+                    "response": [
+                        {
+                            "description": "tag value",
+                            "name": "value",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project id the tag belongs to",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the domain associated with the tag",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain associated with the tag",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "customer associated with the tag",
+                            "name": "customer",
+                            "type": "string"
+                        },
+                        {
+                            "description": "resource type",
+                            "name": "resourcetype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "id of the resource",
+                            "name": "resourceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name where tag belongs to",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag key name",
+                            "name": "key",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account associated with the tag",
+                            "name": "account",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "the date this VPC was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "zone id of the vpc",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the VPC",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the zone the VPC belongs to",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the cidr the VPC",
+                    "name": "cidr",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain id of the VPC owner",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "vpc offering id the VPC is created from",
+                    "name": "vpcofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "if this VPC has redundant router",
+                    "name": "redundantvpcrouter",
+                    "type": "boolean"
+                },
+                {
+                    "description": "is VPC uses distributed router for one hop forwarding and host based network ACL's",
+                    "name": "distributedvpcrouter",
+                    "type": "boolean"
+                },
+                {
+                    "description": "state of the VPC. Can be Inactive/Enabled",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of supported services",
+                    "name": "service",
+                    "response": [
+                        {
+                            "description": "the service name",
+                            "name": "name",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of capabilities",
+                            "name": "capability",
+                            "response": [
+                                {
+                                    "description": "can this service capability value can be choosable while creatine network offerings",
+                                    "name": "canchooseservicecapability",
+                                    "type": "boolean"
+                                },
+                                {
+                                    "description": "the capability value",
+                                    "name": "value",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the capability name",
+                                    "name": "name",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "list"
+                        },
+                        {
+                            "description": "the service provider name",
+                            "name": "provider",
+                            "response": [
+                                {
+                                    "description": "true if individual services can be enabled/disabled",
+                                    "name": "canenableindividualservice",
+                                    "type": "boolean"
+                                },
+                                {
+                                    "description": "the provider name",
+                                    "name": "name",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the physical network this belongs to",
+                                    "name": "physicalnetworkid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "services for this provider",
+                                    "name": "servicelist",
+                                    "type": "list"
+                                },
+                                {
+                                    "description": "the destination physical network",
+                                    "name": "destinationphysicalnetworkid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "state of the network provider",
+                                    "name": "state",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "uuid of the network provider",
+                                    "name": "id",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "list"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "the owner of the VPC",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "an alternate display text of the VPC.",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "true if VPC is region level",
+                    "name": "regionlevelvpc",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the name of the VPC",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "true VPC requires restart",
+                    "name": "restartrequired",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "Attempts Migration of a VM with its volumes to a different host",
+            "isasync": true,
+            "name": "migrateVirtualMachineWithVolume",
+            "params": [
+                {
+                    "description": "the ID of the virtual machine",
+                    "length": 255,
+                    "name": "virtualmachineid",
+                    "related": "updateVMAffinityGroup,resetSSHKeyForVirtualMachine,migrateVirtualMachineWithVolume,attachIso,removeNicFromVirtualMachine,recoverVirtualMachine,updateVMAffinityGroup,rebootVirtualMachine,restoreVirtualMachine,destroyVirtualMachine,stopVirtualMachine,detachIso,deployVirtualMachine,updateVirtualMachine,revertToVMSnapshot,resetPasswordForVirtualMachine,startVirtualMachine,updateDefaultNicForVirtualMachine,startVirtualMachine,attachIso,listVirtualMachines,addNicToVirtualMachine,stopVirtualMachine,destroyVirtualMachine,removeNicFromVirtualMachine,changeServiceForVirtualMachine",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "Storage to pool mapping. This parameter specifies the mapping between a volume and a pool where you want to migrate that volume. Format of this parameter: migrateto[volume-index].volume=<uuid>&migrateto[volume-index].pool=<uuid>Where, [volume-index] indicates the index to identify the volume that you want to migrate, volume=<uuid> indicates the UUID of the volume that you want to migrate, and pool=<uuid> indicates the UUID of the pool where you want to migrate the volume. Example: migrateto[0].volume=<71f43cd6-69b0-4d3b-9fbc-67f50963d60b>&migrateto[0].pool=<a382f181-3d2b-4413-b92d-b8931befa7e1>&migrateto[1].volume=<88de0173-55c0-4c1c-a269-83d0279eeedf>&migrateto[1].pool=<95d6e97c-6766-4d67-9a30-c449c15011d1>&migrateto[2].volume=<1b331390-59f2-4796-9993-bf11c6e76225>&migrateto[2].pool=<41fdb564-9d3b-447d-88ed-7628f7640cbc>",
+                    "length": 255,
+                    "name": "migrateto",
+                    "required": false,
+                    "type": "map"
+                },
+                {
+                    "description": "Destination Host ID to migrate VM to.",
+                    "length": 255,
+                    "name": "hostid",
+                    "related": "addBaremetalHost,reconnectHost,addHost",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "updateVMAffinityGroup,resetSSHKeyForVirtualMachine,attachIso,removeNicFromVirtualMachine,recoverVirtualMachine,updateVMAffinityGroup,rebootVirtualMachine,restoreVirtualMachine,destroyVirtualMachine,stopVirtualMachine,detachIso,deployVirtualMachine,updateVirtualMachine,revertToVMSnapshot,resetPasswordForVirtualMachine,startVirtualMachine,updateDefaultNicForVirtualMachine,startVirtualMachine,attachIso,listVirtualMachines,addNicToVirtualMachine,stopVirtualMachine,destroyVirtualMachine,removeNicFromVirtualMachine,changeServiceForVirtualMachine",
+            "response": [
+                {
+                    "description": "the outgoing network traffic on the host",
+                    "name": "networkkbswrite",
+                    "type": "long"
+                },
+                {
+                    "description": "the name of the service offering of the virtual machine",
+                    "name": "serviceofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "public IP address id associated with vm via Static nat rule",
+                    "name": "publicipid",
+                    "type": "string"
+                },
+                {
+                    "description": "Vm details in key/value pairs.",
+                    "name": "details",
+                    "type": "map"
+                },
+                {
+                    "description": "the amount of the vm's CPU currently used",
+                    "name": "cpuused",
+                    "type": "string"
+                },
+                {
+                    "description": "the write (bytes) of disk on the vm",
+                    "name": "diskkbswrite",
+                    "type": "long"
+                },
+                {
+                    "description": "the read (io) of disk on the vm",
+                    "name": "diskioread",
+                    "type": "long"
+                },
+                {
+                    "description": "list of security groups associated with the virtual machine",
+                    "name": "securitygroup",
+                    "response": [
+                        {
+                            "description": "the list of ingress rules associated with the security group",
+                            "name": "ingressrule",
+                            "response": [
+                                {
+                                    "description": "the type of the ICMP message response",
+                                    "name": "icmptype",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the starting IP of the security group rule",
+                                    "name": "startport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the protocol of the security group rule",
+                                    "name": "protocol",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the code for the ICMP message response",
+                                    "name": "icmpcode",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "account owning the security group rule",
+                                    "name": "account",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the list of resource tags associated with the rule",
+                                    "name": "tags",
+                                    "response": [
+                                        {
+                                            "description": "the project id the tag belongs to",
+                                            "name": "projectid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the account associated with the tag",
+                                            "name": "account",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag value",
+                                            "name": "value",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag key name",
+                                            "name": "key",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "resource type",
+                                            "name": "resourcetype",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project name where tag belongs to",
+                                            "name": "project",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the domain associated with the tag",
+                                            "name": "domain",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "id of the resource",
+                                            "name": "resourceid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the ID of the domain associated with the tag",
+                                            "name": "domainid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "customer associated with the tag",
+                                            "name": "customer",
+                                            "type": "string"
+                                        }
+                                    ],
+                                    "type": "set"
+                                },
+                                {
+                                    "description": "security group name",
+                                    "name": "securitygroupname",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the ending IP of the security group rule ",
+                                    "name": "endport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the CIDR notation for the base IP address of the security group rule",
+                                    "name": "cidr",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the id of the security group rule",
+                                    "name": "ruleid",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "set"
+                        },
+                        {
+                            "description": "the project id of the group",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the description of the security group",
+                            "name": "description",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of egress rules associated with the security group",
+                            "name": "egressrule",
+                            "response": [
+                                {
+                                    "description": "the code for the ICMP message response",
+                                    "name": "icmpcode",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "account owning the security group rule",
+                                    "name": "account",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the protocol of the security group rule",
+                                    "name": "protocol",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the ending IP of the security group rule ",
+                                    "name": "endport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the CIDR notation for the base IP address of the security group rule",
+                                    "name": "cidr",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "security group name",
+                                    "name": "securitygroupname",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the starting IP of the security group rule",
+                                    "name": "startport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the id of the security group rule",
+                                    "name": "ruleid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the list of resource tags associated with the rule",
+                                    "name": "tags",
+                                    "response": [
+                                        {
+                                            "description": "the project id the tag belongs to",
+                                            "name": "projectid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag value",
+                                            "name": "value",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the account associated with the tag",
+                                            "name": "account",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the ID of the domain associated with the tag",
+                                            "name": "domainid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag key name",
+                                            "name": "key",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the domain associated with the tag",
+                                            "name": "domain",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "customer associated with the tag",
+                                            "name": "customer",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "id of the resource",
+                                            "name": "resourceid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project name where tag belongs to",
+                                            "name": "project",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "resource type",
+                                            "name": "resourcetype",
+                                            "type": "string"
+                                        }
+                                    ],
+                                    "type": "set"
+                                },
+                                {
+                                    "description": "the type of the ICMP message response",
+                                    "name": "icmptype",
+                                    "type": "integer"
+                                }
+                            ],
+                            "type": "set"
+                        },
+                        {
+                            "description": "the account owning the security group",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain name of the security group",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain ID of the security group",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name of the group",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of resource tags associated with the rule",
+                            "name": "tags",
+                            "response": [
+                                {
+                                    "description": "the ID of the domain associated with the tag",
+                                    "name": "domainid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "tag key name",
+                                    "name": "key",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "id of the resource",
+                                    "name": "resourceid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the domain associated with the tag",
+                                    "name": "domain",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the project id the tag belongs to",
+                                    "name": "projectid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the project name where tag belongs to",
+                                    "name": "project",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "tag value",
+                                    "name": "value",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "resource type",
+                                    "name": "resourcetype",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the account associated with the tag",
+                                    "name": "account",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "customer associated with the tag",
+                                    "name": "customer",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "set"
+                        },
+                        {
+                            "description": "the ID of the security group",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the name of the security group",
+                            "name": "name",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the number of virtualmachines associated with this securitygroup",
+                            "name": "virtualmachinecount",
+                            "type": "integer"
+                        },
+                        {
+                            "description": "the list of virtualmachine ids associated with this securitygroup",
+                            "name": "virtualmachineids",
+                            "type": "set"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "the incoming network traffic on the vm",
+                    "name": "networkkbsread",
+                    "type": "long"
+                },
+                {
+                    "description": "the date when this virtual machine was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the project name of the vm",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "ssh key-pair",
+                    "name": "keypair",
+                    "type": "string"
+                },
+                {
+                    "description": "the group ID of the virtual machine",
+                    "name": "groupid",
+                    "type": "string"
+                },
+                {
+                    "description": "the hypervisor on which the template runs",
+                    "name": "hypervisor",
+                    "type": "string"
+                },
+                {
+
+                },
+                {
+                    "description": "the speed of each cpu",
+                    "name": "cpuspeed",
+                    "type": "integer"
+                },
+                {
+                    "description": "true if vm contains XS/VMWare tools inorder to support dynamic scaling of VM cpu/memory.",
+                    "name": "isdynamicallyscalable",
+                    "type": "boolean"
+                },
+                {
+                    "description": " an alternate display text of the template for the virtual machine",
+                    "name": "templatedisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "OS type id of the vm",
+                    "name": "ostypeid",
+                    "type": "long"
+                },
+                {
+                    "description": "the user's name who deployed the virtual machine",
+                    "name": "username",
+                    "type": "string"
+                },
+                {
+                    "description": "public IP address id associated with vm via Static nat rule",
+                    "name": "publicip",
+                    "type": "string"
+                },
+                {
+                    "description": "device ID of the root volume",
+                    "name": "rootdeviceid",
+                    "type": "long"
+                },
+                {
+                    "description": "the memory allocated for the virtual machine",
+                    "name": "memory",
+                    "type": "integer"
+                },
+                {
+                    "description": "the name of the virtual machine",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the group name of the virtual machine",
+                    "name": "group",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the ISO attached to the virtual machine",
+                    "name": "isoname",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the template for the virtual machine",
+                    "name": "templatename",
+                    "type": "string"
+                },
+                {
+                    "description": "the virtual network for the service offering",
+                    "name": "forvirtualnetwork",
+                    "type": "boolean"
+                },
+                {
+                    "description": "Os type ID of the virtual machine",
+                    "name": "guestosid",
+                    "type": "string"
+                },
+                {
+                    "description": "State of the Service from LB rule",
+                    "name": "servicestate",
+                    "type": "string"
+                },
+                {
+                    "description": "the vgpu type used by the virtual machine",
+                    "name": "vgpu",
+                    "type": "string"
+                },
+                {
+                    "description": "the memory used by the vm",
+                    "name": "memorykbs",
+                    "type": "long"
+                },
+                {
+                    "description": "the name of the availability zone for the virtual machine",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "true if the password rest feature is enabled, false otherwise",
+                    "name": "passwordenabled",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the password (if exists) of the virtual machine",
+                    "name": "password",
+                    "type": "string"
+                },
+                {
+                    "description": "device type of the root volume",
+                    "name": "rootdevicetype",
+                    "type": "string"
+                },
+                {
+                    "description": "the number of cpu this virtual machine is running with",
+                    "name": "cpunumber",
+                    "type": "integer"
+                },
+                {
+                    "description": "the read (bytes) of disk on the vm",
+                    "name": "diskkbsread",
+                    "type": "long"
+                },
+                {
+                    "description": "user generated name. The name of the virtual machine is returned if no displayname exists.",
+                    "name": "displayname",
+                    "type": "string"
+                },
+                {
+                    "description": "the internal memory thats free in vm",
+                    "name": "memoryintfreekbs",
+                    "type": "long"
+                },
+                {
+                    "description": "the name of the disk offering of the virtual machine",
+                    "name": "diskofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "the target memory in vm",
+                    "name": "memorytargetkbs",
+                    "type": "long"
+                },
+                {
+                    "description": "the ID of the host for the virtual machine",
+                    "name": "hostid",
+                    "type": "string"
+                },
+                {
+                    "description": "instance name of the user vm; this parameter is returned to the ROOT admin only",
+                    "name": "instancename",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the disk offering of the virtual machine",
+                    "name": "diskofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "the user's ID who deployed the virtual machine",
+                    "name": "userid",
+                    "type": "string"
+                },
+                {
+                    "description": "list of affinity groups associated with the virtual machine",
+                    "name": "affinitygroup",
+                    "response": [
+                        {
+                            "description": "the description of the affinity group",
+                            "name": "description",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the type of the affinity group",
+                            "name": "type",
+                            "type": "string"
+                        },
+                        {
+                            "description": "virtual machine IDs associated with this affinity group",
+                            "name": "virtualmachineIds",
+                            "type": "list"
+                        },
+                        {
+                            "description": "the project ID of the affinity group",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the name of the affinity group",
+                            "name": "name",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account owning the affinity group",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain ID of the affinity group",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the affinity group",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain name of the affinity group",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name of the affinity group",
+                            "name": "project",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "the ID of the virtual machine",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the ISO attached to the virtual machine",
+                    "name": "isoid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the availablility zone for the virtual machine",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of the virtual machine",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the domain in which the virtual machine exists",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "true if high-availability is enabled, false otherwise",
+                    "name": "haenable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "an optional field whether to the display the vm to the end user or not.",
+                    "name": "displayvm",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the list of nics associated with vm",
+                    "name": "nic",
+                    "response": [
+                        {
+                            "description": "the name of the corresponding network",
+                            "name": "networkname",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the IPv6 address of network",
+                            "name": "ip6address",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if nic is default, false otherwise",
+                            "name": "isdefault",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "Id of the NSX Logical Switch Port (if NSX based), null otherwise",
+                            "name": "nsxlogicalswitchport",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the gateway of the nic",
+                            "name": "gateway",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the broadcast uri of the nic",
+                            "name": "broadcasturi",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the netmask of the nic",
+                            "name": "netmask",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the isolation uri of the nic",
+                            "name": "isolationuri",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the gateway of IPv6 network",
+                            "name": "ip6gateway",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the cidr of IPv6 network",
+                            "name": "ip6cidr",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the NSX Logical Switch (if NSX based), null otherwise",
+                            "name": "nsxlogicalswitch",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the corresponding network",
+                            "name": "networkid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the traffic type of the nic",
+                            "name": "traffictype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "device id for the network when plugged into the virtual machine",
+                            "name": "deviceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the vm to which the nic belongs",
+                            "name": "virtualmachineid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ip address of the nic",
+                            "name": "ipaddress",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if nic is default, false otherwise",
+                            "name": "macaddress",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the nic",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the type of the nic",
+                            "name": "type",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the Secondary ipv4 addr of nic",
+                            "name": "secondaryip",
+                            "type": "list"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "the name of the domain in which the virtual machine exists",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the service offering of the virtual machine",
+                    "name": "serviceofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the template for the virtual machine. A -1 is returned if the virtual machine was created from an ISO file.",
+                    "name": "templateid",
+                    "type": "string"
+                },
+                {
+                    "description": "an alternate display text of the ISO attached to the virtual machine",
+                    "name": "isodisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "the write (io) of disk on the vm",
+                    "name": "diskiowrite",
+                    "type": "long"
+                },
+                {
+                    "description": "the name of the host for the virtual machine",
+                    "name": "hostname",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the vm",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the account associated with the virtual machine",
+                    "name": "account",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Adds a network device of one of the following types: ExternalDhcp, ExternalFirewall, ExternalLoadBalancer, PxeServer",
+            "isasync": false,
+            "name": "addNetworkDevice",
+            "params": [
+                {
+                    "description": "Network device type, now supports ExternalDhcp, PxeServer, NetscalerMPXLoadBalancer, NetscalerVPXLoadBalancer, NetscalerSDXLoadBalancer, F5BigIpLoadBalancer, JuniperSRXFirewall, PaloAltoFirewall",
+                    "length": 255,
+                    "name": "networkdevicetype",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "parameters for network device",
+                    "length": 255,
+                    "name": "networkdeviceparameterlist",
+                    "required": false,
+                    "type": "map"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the ID of the network device",
+                    "name": "id",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Updates a user account",
+            "isasync": false,
+            "name": "updateUser",
+            "params": [
+                {
+                    "description": "The secret key for the user. Must be specified with userSecretKey",
+                    "length": 255,
+                    "name": "usersecretkey",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "email",
+                    "length": 255,
+                    "name": "email",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "last name",
+                    "length": 255,
+                    "name": "lastname",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "Clear text password (default hashed to SHA256SALT). If you wish to use any other hasing algorithm, you would need to write a custom authentication adapter. Can't be passed when command is executed via integration.api.port",
+                    "length": 255,
+                    "name": "password",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "Specifies a timezone for this command. For more information on the timezone parameter, see Time Zone Format.",
+                    "length": 255,
+                    "name": "timezone",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "first name",
+                    "length": 255,
+                    "name": "firstname",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "Unique username",
+                    "length": 255,
+                    "name": "username",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "The API key for the user. Must be specified with userSecretKey",
+                    "length": 255,
+                    "name": "userapikey",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "User uuid",
+                    "length": 255,
+                    "name": "id",
+                    "related": "disableUser,enableUser,getUser,listUsers,updateUser,createUser",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "disableUser,enableUser,getUser,listUsers,createUser",
+            "response": [
+                {
+                    "description": "the name of the role",
+                    "name": "rolename",
+                    "type": "string"
+                },
+                {
+                    "description": "the timezone user was created in",
+                    "name": "timezone",
+                    "type": "string"
+                },
+                {
+                    "description": "the api key of the user",
+                    "name": "apikey",
+                    "type": "string"
+                },
+                {
+                    "description": "the user ID",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain name of the user",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the user name",
+                    "name": "username",
+                    "type": "string"
+                },
+                {
+                    "description": "the user email address",
+                    "name": "email",
+                    "type": "string"
+                },
+                {
+                    "description": "the account name of the user",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the user state",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the boolean value representing if the updating target is in caller's child domain",
+                    "name": "iscallerchilddomain",
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if user is default, false otherwise",
+                    "name": "isdefault",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the type of the role",
+                    "name": "roletype",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain ID of the user",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the secret key of the user",
+                    "name": "secretkey",
+                    "type": "string"
+                },
+                {
+                    "description": "the user firstname",
+                    "name": "firstname",
+                    "type": "string"
+                },
+                {
+                    "description": "the date and time the user account was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the ID of the role",
+                    "name": "roleid",
+                    "type": "string"
+                },
+                {
+                    "description": "the user lastname",
+                    "name": "lastname",
+                    "type": "string"
+                },
+                {
+                    "description": "the account ID of the user",
+                    "name": "accountid",
+                    "type": "string"
+                },
+                {
+                    "description": "the account type of the user",
+                    "name": "accounttype",
+                    "type": "short"
+                }
+            ]
+        },
+        {
+            "description": "Restarts a VPC",
+            "isasync": true,
+            "name": "restartVPC",
+            "params": [
+                {
+                    "description": "the id of the VPC",
+                    "length": 255,
+                    "name": "id",
+                    "related": "restartVPC,updateVPC,listVPCs,createVPC",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "If cleanup old network elements",
+                    "length": 255,
+                    "name": "cleanup",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "Turn a single VPC into a redundant one.",
+                    "length": 255,
+                    "name": "makeredundant",
+                    "required": false,
+                    "type": "boolean"
+                }
+            ],
+            "related": "updateVPC,listVPCs,createVPC",
+            "response": [
+                {
+                    "description": "the id of the VPC",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "vpc offering id the VPC is created from",
+                    "name": "vpcofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of supported services",
+                    "name": "service",
+                    "response": [
+                        {
+                            "description": "the list of capabilities",
+                            "name": "capability",
+                            "response": [
+                                {
+                                    "description": "the capability value",
+                                    "name": "value",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the capability name",
+                                    "name": "name",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "can this service capability value can be choosable while creatine network offerings",
+                                    "name": "canchooseservicecapability",
+                                    "type": "boolean"
+                                }
+                            ],
+                            "type": "list"
+                        },
+                        {
+                            "description": "the service name",
+                            "name": "name",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the service provider name",
+                            "name": "provider",
+                            "response": [
+                                {
+                                    "description": "the provider name",
+                                    "name": "name",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "state of the network provider",
+                                    "name": "state",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "uuid of the network provider",
+                                    "name": "id",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the physical network this belongs to",
+                                    "name": "physicalnetworkid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the destination physical network",
+                                    "name": "destinationphysicalnetworkid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "services for this provider",
+                                    "name": "servicelist",
+                                    "type": "list"
+                                },
+                                {
+                                    "description": "true if individual services can be enabled/disabled",
+                                    "name": "canenableindividualservice",
+                                    "type": "boolean"
+                                }
+                            ],
+                            "type": "list"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "the network domain of the VPC",
+                    "name": "networkdomain",
+                    "type": "string"
+                },
+                {
+                    "description": "is vpc for display to the regular user",
+                    "name": "fordisplay",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the date this VPC was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the list of networks belongign to the VPC",
+                    "name": "network",
+                    "response": [
+                        {
+                            "description": "the domain id of the network owner",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if network is default, false otherwise",
+                            "name": "isdefault",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "network offering id the network is created from",
+                            "name": "networkofferingid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of services",
+                            "name": "service",
+                            "response": [
+                                {
+                                    "description": "the list of capabilities",
+                                    "name": "capability",
+                                    "response": [
+                                        {
+                                            "description": "the capability value",
+                                            "name": "value",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "can this service capability value can be choosable while creatine network offerings",
+                                            "name": "canchooseservicecapability",
+                                            "type": "boolean"
+                                        },
+                                        {
+                                            "description": "the capability name",
+                                            "name": "name",
+                                            "type": "string"
+                                        }
+                                    ],
+                                    "type": "list"
+                                },
+                                {
+                                    "description": "the service provider name",
+                                    "name": "provider",
+                                    "response": [
+                                        {
+                                            "description": "the destination physical network",
+                                            "name": "destinationphysicalnetworkid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "state of the network provider",
+                                            "name": "state",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "true if individual services can be enabled/disabled",
+                                            "name": "canenableindividualservice",
+                                            "type": "boolean"
+                                        },
+                                        {
+                                            "description": "uuid of the network provider",
+                                            "name": "id",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the physical network this belongs to",
+                                            "name": "physicalnetworkid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "services for this provider",
+                                            "name": "servicelist",
+                                            "type": "list"
+                                        },
+                                        {
+                                            "description": "the provider name",
+                                            "name": "name",
+                                            "type": "string"
+                                        }
+                                    ],
+                                    "type": "list"
+                                },
+                                {
+                                    "description": "the service name",
+                                    "name": "name",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "list"
+                        },
+                        {
+                            "description": "the network's gateway",
+                            "name": "gateway",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain name of the network owner",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the displaytext of the network",
+                            "name": "displaytext",
+                            "type": "string"
+                        },
+                        {
+                            "description": "name of the network offering the network is created from",
+                            "name": "networkofferingname",
+                            "type": "string"
+                        },
+                        {
+                            "description": "acl type - access type to the network",
+                            "name": "acltype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true network requires restart",
+                            "name": "restartrequired",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "the network's IP range not to be used by CloudStack guest VMs and can be used for non CloudStack purposes",
+                            "name": "reservediprange",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the second DNS for the network",
+                            "name": "dns2",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the owner of the network",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if network offering is ip conserve mode enabled",
+                            "name": "networkofferingconservemode",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "the physical network id",
+                            "name": "physicalnetworkid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the network's netmask",
+                            "name": "netmask",
+                            "type": "string"
+                        },
+                        {
+                            "description": "list networks available for vm deployment",
+                            "name": "canusefordeploy",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "the project name of the address",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "state of the network",
+                            "name": "state",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the gateway of IPv6 network",
+                            "name": "ip6gateway",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the cidr of IPv6 network",
+                            "name": "ip6cidr",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the first DNS for the network",
+                            "name": "dns1",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if users from subdomains can access the domain level network",
+                            "name": "subdomainaccess",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "true if network supports specifying ip ranges, false otherwise",
+                            "name": "specifyipranges",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "the id of the network",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the network CIDR of the guest network configured with IP reservation. It is the summation of CIDR and RESERVED_IP_RANGE",
+                            "name": "networkcidr",
+                            "type": "string"
+                        },
+                        {
+                            "description": "If a network is enabled for 'streched l2 subnet' then represents zones on which network currently spans",
+                            "name": "zonesnetworkspans",
+                            "type": "set"
+                        },
+                        {
+                            "description": "display text of the network offering the network is created from",
+                            "name": "networkofferingdisplaytext",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the network domain",
+                            "name": "networkdomain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if network can span multiple zones",
+                            "name": "strechedl2subnet",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "broadcast uri of the network. This parameter is visible to ROOT admins only",
+                            "name": "broadcasturi",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Broadcast domain type of the network",
+                            "name": "broadcastdomaintype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "ACL Id associated with the VPC network",
+                            "name": "aclid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "an optional field, whether to the display the network to the end user or not.",
+                            "name": "displaynetwork",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "the name of the zone the network belongs to",
+                            "name": "zonename",
+                            "type": "string"
+                        },
+                        {
+                            "description": "availability of the network offering the network is created from",
+                            "name": "networkofferingavailability",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the name of the network",
+                            "name": "name",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the traffic type of the network",
+                            "name": "traffictype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "The vlan of the network. This parameter is visible to ROOT admins only",
+                            "name": "vlan",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if network is system, false otherwise",
+                            "name": "issystem",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "list networks that are persistent",
+                            "name": "ispersistent",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "the list of resource tags associated with network",
+                            "name": "tags",
+                            "response": [
+                                {
+                                    "description": "the ID of the domain associated with the tag",
+                                    "name": "domainid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the project id the tag belongs to",
+                                    "name": "projectid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "tag value",
+                                    "name": "value",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the account associated with the tag",
+                                    "name": "account",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "customer associated with the tag",
+                                    "name": "customer",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "resource type",
+                                    "name": "resourcetype",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "id of the resource",
+                                    "name": "resourceid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the project name where tag belongs to",
+                                    "name": "project",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the domain associated with the tag",
+                                    "name": "domain",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "tag key name",
+                                    "name": "key",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "list"
+                        },
+                        {
+                            "description": "zone id of the network",
+                            "name": "zoneid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the type of the network",
+                            "name": "type",
+                            "type": "string"
+                        },
+                        {
+                            "description": "related to what other network configuration",
+                            "name": "related",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project id of the ipaddress",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "VPC the network belongs to",
+                            "name": "vpcid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Cloudstack managed address space, all CloudStack managed VMs get IP address from CIDR",
+                            "name": "cidr",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "an alternate display text of the VPC.",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the VPC",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "is VPC uses distributed router for one hop forwarding and host based network ACL's",
+                    "name": "distributedvpcrouter",
+                    "type": "boolean"
+                },
+                {
+                    "description": "state of the VPC. Can be Inactive/Enabled",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the VPC",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain name of the owner",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the cidr the VPC",
+                    "name": "cidr",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the zone the VPC belongs to",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the owner of the VPC",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain id of the VPC owner",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "true if VPC is region level",
+                    "name": "regionlevelvpc",
+                    "type": "boolean"
+                },
+                {
+                    "description": "if this VPC has redundant router",
+                    "name": "redundantvpcrouter",
+                    "type": "boolean"
+                },
+                {
+                    "description": "true VPC requires restart",
+                    "name": "restartrequired",
+                    "type": "boolean"
+                },
+                {
+                    "description": "zone id of the vpc",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the VPC",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of resource tags associated with the project",
+                    "name": "tags",
+                    "response": [
+                        {
+                            "description": "the project id the tag belongs to",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name where tag belongs to",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "id of the resource",
+                            "name": "resourceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag key name",
+                            "name": "key",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account associated with the tag",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "resource type",
+                            "name": "resourcetype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the domain associated with the tag",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain associated with the tag",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag value",
+                            "name": "value",
+                            "type": "string"
+                        },
+                        {
+                            "description": "customer associated with the tag",
+                            "name": "customer",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                }
+            ]
+        },
+        {
+            "description": "Removes a certificate from a load balancer rule",
+            "isasync": true,
+            "name": "removeCertFromLoadBalancer",
+            "params": [
+                {
+                    "description": "the ID of the load balancer rule",
+                    "length": 255,
+                    "name": "lbruleid",
+                    "related": "",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "Adds a new host.",
+            "isasync": false,
+            "name": "addHost",
+            "params": [
+                {
+                    "description": "the Zone ID for the host",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones,listZones,createZone",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "hypervisor type of the host",
+                    "length": 255,
+                    "name": "hypervisor",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the cluster ID for the host",
+                    "length": 255,
+                    "name": "clusterid",
+                    "related": "addCluster",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "Allocation state of this Host for allocation of new resources",
+                    "length": 255,
+                    "name": "allocationstate",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the username for the host",
+                    "length": 255,
+                    "name": "username",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the host URL",
+                    "length": 255,
+                    "name": "url",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "list of tags to be added to the host",
+                    "length": 255,
+                    "name": "hosttags",
+                    "required": false,
+                    "type": "list"
+                },
+                {
+                    "description": "the cluster name for the host",
+                    "length": 255,
+                    "name": "clustername",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the Pod ID for the host",
+                    "length": 255,
+                    "name": "podid",
+                    "related": "updatePod",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the password for the host",
+                    "length": 255,
+                    "name": "password",
+                    "required": true,
+                    "type": "string"
+                }
+            ],
+            "related": "addBaremetalHost,reconnectHost",
+            "response": [
+                {
+                    "description": "the host out-of-band management information",
+                    "name": "outofbandmanagement",
+                    "type": "outofbandmanagementresponse"
+                },
+                {
+                    "description": "the hypervisor version",
+                    "name": "hypervisorversion",
+                    "type": "string"
+                },
+                {
+                    "description": "the date and time the host was last pinged",
+                    "name": "lastpinged",
+                    "type": "date"
+                },
+                {
+                    "description": "the cluster type of the cluster that host belongs to",
+                    "name": "clustertype",
+                    "type": "string"
+                },
+                {
+                    "description": "the cluster name of the host",
+                    "name": "clustername",
+                    "type": "string"
+                },
+                {
+                    "description": "the OS category name of the host",
+                    "name": "oscategoryname",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the host",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the host hypervisor",
+                    "name": "hypervisor",
+                    "type": "hypervisortype"
+                },
+                {
+                    "description": "true if the host is disconnected. False otherwise.",
+                    "name": "disconnected",
+                    "type": "date"
+                },
+                {
+                    "description": "the Pod name of the host",
+                    "name": "podname",
+                    "type": "string"
+                },
+                {
+                    "description": "the IP address of the host",
+                    "name": "ipaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the CPU number of the host",
+                    "name": "cpunumber",
+                    "type": "integer"
+                },
+                {
+                    "description": "the amount of the host's CPU after applying the cpu.overprovisioning.factor ",
+                    "name": "cpuwithoverprovisioning",
+                    "type": "string"
+                },
+                {
+                    "description": "the total disk size of the host",
+                    "name": "disksizetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the ID of the host",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the outgoing network traffic on the host",
+                    "name": "networkkbswrite",
+                    "type": "long"
+                },
+                {
+                    "description": "true if local storage is active, false otherwise",
+                    "name": "islocalstorageactive",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the date and time the host was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the amount of the host's memory currently allocated",
+                    "name": "memoryallocated",
+                    "type": "long"
+                },
+                {
+                    "description": "the Pod ID of the host",
+                    "name": "podid",
+                    "type": "string"
+                },
+                {
+                    "description": "the memory total of the host",
+                    "name": "memorytotal",
+                    "type": "long"
+                },
+                {
+                    "description": "true if this host is suitable(has enough capacity and satisfies all conditions like hosttags, max guests vm limit etc) to migrate a VM to it , false otherwise",
+                    "name": "suitableformigration",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the host version",
+                    "name": "version",
+                    "type": "string"
+                },
+                {
+                    "description": "the date and time the host was removed",
+                    "name": "removed",
+                    "type": "date"
+                },
+                {
+                    "description": "the CPU speed of the host",
+                    "name": "cpuspeed",
+                    "type": "long"
+                },
+                {
+                    "description": "the amount of the host's CPU currently allocated",
+                    "name": "cpuallocated",
+                    "type": "string"
+                },
+                {
+                    "description": "the resource state of the host",
+                    "name": "resourcestate",
+                    "type": "string"
+                },
+                {
+                    "description": "the OS category ID of the host",
+                    "name": "oscategoryid",
+                    "type": "string"
+                },
+                {
+                    "description": "the management server ID of the host",
+                    "name": "managementserverid",
+                    "type": "long"
+                },
+                {
+                    "description": "Host details in key/value pairs.",
+                    "name": "details",
+                    "type": "map"
+                },
+                {
+                    "description": "the state of the host",
+                    "name": "state",
+                    "type": "status"
+                },
+                {
+                    "description": "the amount of the host's CPU currently used",
+                    "name": "cpuused",
+                    "type": "string"
+                },
+                {
+                    "description": "events available for the host",
+                    "name": "events",
+                    "type": "string"
+                },
+                {
+                    "description": "the host type",
+                    "name": "type",
+                    "type": "type"
+                },
+                {
+                    "description": "the number of CPU sockets on the host",
+                    "name": "cpusockets",
+                    "type": "integer"
+                },
+                {
+                    "description": "the cluster ID of the host",
+                    "name": "clusterid",
+                    "type": "string"
+                },
+                {
+                    "description": "true if this host has enough CPU and RAM capacity to migrate a VM to it, false otherwise",
+                    "name": "hasenoughcapacity",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the incoming network traffic on the host",
+                    "name": "networkkbsread",
+                    "type": "long"
+                },
+                {
+                    "description": "the amount of the host's memory currently used",
+                    "name": "memoryused",
+                    "type": "long"
+                },
+                {
+                    "description": "the host's currently allocated disk size",
+                    "name": "disksizeallocated",
+                    "type": "long"
+                },
+                {
+                    "description": "comma-separated list of tags for the host",
+                    "name": "hosttags",
+                    "type": "string"
+                },
+                {
+                    "description": "true if the host is Ha host (dedicated to vms started by HA process; false otherwise",
+                    "name": "hahost",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the Zone ID of the host",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the cpu average load on the host",
+                    "name": "averageload",
+                    "type": "long"
+                },
+                {
+                    "description": "the Zone name of the host",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "GPU cards present in the host",
+                    "name": "gpugroup",
+                    "response": [
+                        {
+                            "description": "GPU cards present in the host",
+                            "name": "gpugroupname",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of enabled vGPUs",
+                            "name": "vgpu",
+                            "response": [
+                                {
+                                    "description": "Maximum displays per user",
+                                    "name": "maxheads",
+                                    "type": "long"
+                                },
+                                {
+                                    "description": "Remaining capacity in terms of no. of more VMs that can be deployped with this vGPU type",
+                                    "name": "remainingcapacity",
+                                    "type": "long"
+                                },
+                                {
+                                    "description": "Maximum vgpu can be created with this vgpu type on the given gpu group",
+                                    "name": "maxcapacity",
+                                    "type": "long"
+                                },
+                                {
+                                    "description": "Maximum Y resolution per display",
+                                    "name": "maxresolutiony",
+                                    "type": "long"
+                                },
+                                {
+                                    "description": "Video RAM for this vGPU type",
+                                    "name": "videoram",
+                                    "type": "long"
+                                },
+                                {
+                                    "description": "Maximum no. of vgpu per gpu card (pgpu)",
+                                    "name": "maxvgpuperpgpu",
+                                    "type": "long"
+                                },
+                                {
+                                    "description": "Maximum X resolution per display",
+                                    "name": "maxresolutionx",
+                                    "type": "long"
+                                },
+                                {
+                                    "description": "Model Name of vGPU",
+                                    "name": "vgputype",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "list"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "capabilities of the host",
+                    "name": "capabilities",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Attaches a disk volume to a virtual machine.",
+            "isasync": true,
+            "name": "attachVolume",
+            "params": [
+                {
+                    "description": "the ID of the device to map the volume to within the guest OS. If no deviceId is passed in, the next available deviceId will be chosen. Possible values for a Linux OS are:* 0 - /dev/xvda* 1 - /dev/xvdb* 2 - /dev/xvdc* 4 - /dev/xvde* 5 - /dev/xvdf* 6 - /dev/xvdg* 7 - /dev/xvdh* 8 - /dev/xvdi* 9 - /dev/xvdj",
+                    "length": 255,
+                    "name": "deviceid",
+                    "required": false,
+                    "type": "long"
+                },
+                {
+                    "description": "    the ID of the virtual machine",
+                    "length": 255,
+                    "name": "virtualmachineid",
+                    "related": "updateVMAffinityGroup,resetSSHKeyForVirtualMachine,attachIso,removeNicFromVirtualMachine,recoverVirtualMachine,updateVMAffinityGroup,rebootVirtualMachine,restoreVirtualMachine,destroyVirtualMachine,stopVirtualMachine,detachIso,deployVirtualMachine,updateVirtualMachine,revertToVMSnapshot,resetPasswordForVirtualMachine,startVirtualMachine,updateDefaultNicForVirtualMachine,startVirtualMachine,attachIso,listVirtualMachines,addNicToVirtualMachine,stopVirtualMachine,destroyVirtualMachine,removeNicFromVirtualMachine,changeServiceForVirtualMachine",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the ID of the disk volume",
+                    "length": 255,
+                    "name": "id",
+                    "related": "attachVolume,updateVolume,migrateVolume,createVolume,listVolumes,uploadVolume,attachVolume,detachVolume,resizeVolume,migrateVolume,createVolume",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "updateVolume,migrateVolume,createVolume,listVolumes,uploadVolume,attachVolume,detachVolume,resizeVolume,migrateVolume,createVolume",
+            "response": [
+                {
+                    "description": "the state of the disk volume",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the display text of the disk offering",
+                    "name": "diskofferingdisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "name of the availability zone",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the date the disk volume was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "bytes read rate of the disk volume",
+                    "name": "diskBytesReadRate",
+                    "type": "long"
+                },
+                {
+                    "description": "ID of the snapshot from which this volume was created",
+                    "name": "snapshotid",
+                    "type": "string"
+                },
+                {
+                    "description": "size of the disk volume",
+                    "name": "size",
+                    "type": "long"
+                },
+                {
+                    "description": "an alternate display text of the ISO attached to the virtual machine",
+                    "name": "isodisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "bytes write rate of the disk volume",
+                    "name": "diskBytesWriteRate",
+                    "type": "long"
+                },
+                {
+                    "description": "id of the virtual machine",
+                    "name": "virtualmachineid",
+                    "type": "string"
+                },
+                {
+                    "description": "ID of the availability zone",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "max iops of the disk volume",
+                    "name": "maxiops",
+                    "type": "long"
+                },
+                {
+                    "description": "io requests read rate of the disk volume",
+                    "name": "diskIopsReadRate",
+                    "type": "long"
+                },
+                {
+                    "description": "the ID of the domain associated with the disk volume",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "ID of the disk offering",
+                    "name": "diskofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "true if the volume is extractable, false otherwise",
+                    "name": "isextractable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the date the volume was attached to a VM instance",
+                    "name": "attached",
+                    "type": "date"
+                },
+                {
+                    "description": "name of the disk volume",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "display name of the virtual machine",
+                    "name": "vmdisplayname",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the device on user vm the volume is attahed to. This tag is not returned when the volume is detached.",
+                    "name": "deviceid",
+                    "type": "long"
+                },
+                {
+                    "description": "name of the virtual machine",
+                    "name": "vmname",
+                    "type": "string"
+                },
+                {
+                    "description": "min iops of the disk volume",
+                    "name": "miniops",
+                    "type": "long"
+                },
+                {
+                    "description": "the name of the ISO attached to the virtual machine",
+                    "name": "isoname",
+                    "type": "string"
+                },
+                {
+                    "description": " an alternate display text of the template for the virtual machine",
+                    "name": "templatedisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "type of the disk volume (ROOT or DATADISK)",
+                    "name": "type",
+                    "type": "string"
+                },
+                {
+                    "description": "ID of the disk volume",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the ISO attached to the virtual machine",
+                    "name": "isoid",
+                    "type": "string"
+                },
+                {
+                    "description": "the account associated with the disk volume",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "Hypervisor the volume belongs to",
+                    "name": "hypervisor",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the vpn",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "an optional field whether to the display the volume to the end user or not.",
+                    "name": "displayvolume",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the status of the volume",
+                    "name": "status",
+                    "type": "string"
+                },
+                {
+                    "description": "name of the disk offering",
+                    "name": "diskofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "name of the service offering for root disk",
+                    "name": "serviceofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "the display text of the service offering for root disk",
+                    "name": "serviceofferingdisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the template for the virtual machine. A -1 is returned if the virtual machine was created from an ISO file.",
+                    "name": "templateid",
+                    "type": "string"
+                },
+                {
+                    "description": "provisioning type used to create volumes.",
+                    "name": "provisioningtype",
+                    "type": "string"
+                },
+                {
+                    "description": "id of the primary storage hosting the disk volume; returned to admin user only",
+                    "name": "storageid",
+                    "type": "string"
+                },
+                {
+                    "description": "state of the virtual machine",
+                    "name": "vmstate",
+                    "type": "string"
+                },
+                {
+                    "description": "the boolean state of whether the volume is destroyed or not",
+                    "name": "destroyed",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the domain associated with the disk volume",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "io requests write rate of the disk volume",
+                    "name": "diskIopsWriteRate",
+                    "type": "long"
+                },
+                {
+                    "description": "ID of the service offering for root disk",
+                    "name": "serviceofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the template for the virtual machine",
+                    "name": "templatename",
+                    "type": "string"
+                },
+                {
+                    "description": "the chain info of the volume",
+                    "name": "chaininfo",
+                    "type": "string"
+                },
+                {
+                    "description": "the path of the volume",
+                    "name": "path",
+                    "type": "string"
+                },
+                {
+                    "description": "need quiesce vm or not when taking snapshot",
+                    "name": "quiescevm",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the project id of the vpn",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "shared or local storage",
+                    "name": "storagetype",
+                    "type": "string"
+                },
+                {
+                    "description": "name of the primary storage hosting the disk volume",
+                    "name": "storage",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "adds a baremetal dhcp server",
+            "isasync": true,
+            "name": "addBaremetalDhcp",
+            "params": [
+                {
+                    "description": "Credentials to reach external dhcp device",
+                    "length": 255,
+                    "name": "username",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "Credentials to reach external dhcp device",
+                    "length": 255,
+                    "name": "password",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the Physical Network ID",
+                    "length": 255,
+                    "name": "physicalnetworkid",
+                    "related": "createPhysicalNetwork",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "Type of dhcp device",
+                    "length": 255,
+                    "name": "dhcpservertype",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "URL of the external dhcp appliance.",
+                    "length": 255,
+                    "name": "url",
+                    "required": true,
+                    "type": "string"
+                }
+            ],
+            "related": "listBaremetalDhcp",
+            "response": [
+                {
+                    "description": "url",
+                    "name": "url",
+                    "type": "string"
+                },
+                {
+                    "description": "name of the provider",
+                    "name": "provider",
+                    "type": "string"
+                },
+                {
+                    "description": "device id of ",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the physical network to which this external dhcp device belongs to",
+                    "name": "physicalnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "name of the provider",
+                    "name": "dhcpservertype",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Adds Traffic Monitor Host for Direct Network Usage",
+            "isasync": false,
+            "name": "addTrafficMonitor",
+            "params": [
+                {
+                    "description": "Traffic going into the listed zones will not be metered",
+                    "length": 255,
+                    "name": "excludezones",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "Traffic going into the listed zones will be metered",
+                    "length": 255,
+                    "name": "includezones",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "URL of the traffic monitor Host",
+                    "length": 255,
+                    "name": "url",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "Zone in which to add the external firewall appliance.",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones,listZones,createZone",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the number of times to retry requests to the external firewall",
+                    "name": "numretries",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the external firewall",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the management IP address of the external firewall",
+                    "name": "ipaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the timeout (in seconds) for requests to the external firewall",
+                    "name": "timeout",
+                    "type": "string"
+                },
+                {
+                    "description": "the zone ID of the external firewall",
+                    "name": "zoneid",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Lists load balancers",
+            "isasync": false,
+            "name": "listLoadBalancers",
+            "params": [
+                {
+                    "description": "list objects by project",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "suspendProject,activateProject,updateProject",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "If set to false, list only resources belonging to the command's caller; if set to true - list resources that the caller is authorized to see. Default value is false",
+                    "length": 255,
+                    "name": "listall",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "list only resources belonging to the domain specified",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.",
+                    "length": 255,
+                    "name": "isrecursive",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "list resources by display flag; only ROOT admin is eligible to pass this parameter",
+                    "length": 255,
+                    "name": "fordisplay",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "boolean"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "the name of the load balancer",
+                    "length": 255,
+                    "name": "name",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the load balancer",
+                    "length": 255,
+                    "name": "id",
+                    "related": "",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the scheme of the load balancer. Supported value is internal in the current release",
+                    "length": 255,
+                    "name": "scheme",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "List resources by tags (key/value pairs)",
+                    "length": 255,
+                    "name": "tags",
+                    "required": false,
+                    "type": "map"
+                },
+                {
+                    "description": "the source IP address of the load balancer",
+                    "length": 255,
+                    "name": "sourceipaddress",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "list resources by account. Must be used with the domainId parameter.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the network ID of the load balancer",
+                    "length": 255,
+                    "name": "networkid",
+                    "related": "updateNetwork,listBrocadeVcsDeviceNetworks,createNetwork,listNetworks,listNetscalerLoadBalancerNetworks,listF5LoadBalancerNetworks",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the network ID of the source IP address",
+                    "length": 255,
+                    "name": "sourceipaddressnetworkid",
+                    "related": "updateNetwork,listBrocadeVcsDeviceNetworks,createNetwork,listNetworks,listNetscalerLoadBalancerNetworks,listF5LoadBalancerNetworks",
+                    "required": false,
+                    "type": "uuid"
+                }
+            ],
+            "related": "createLoadBalancer",
+            "response": [
+                {
+                    "description": "Load Balancer source ip network id",
+                    "name": "sourceipaddressnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "the load balancer algorithm (source, roundrobin, leastconn)",
+                    "name": "algorithm",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the Load Balancer",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of instances associated with the Load Balancer",
+                    "name": "loadbalancerinstance",
+                    "response": [
+                        {
+                            "description": "the instance ID",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ip address of the instance",
+                            "name": "ipaddress",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the state of the instance",
+                            "name": "state",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the name of the instance",
+                            "name": "name",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "the Load Balancer ID",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain ID of the Load Balancer",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain of the Load Balancer",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "is rule for display to the regular user",
+                    "name": "fordisplay",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the account of the Load Balancer",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the Load Balancer",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the description of the Load Balancer",
+                    "name": "description",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of resource tags associated with the Load Balancer",
+                    "name": "tags",
+                    "response": [
+                        {
+                            "description": "id of the resource",
+                            "name": "resourceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag key name",
+                            "name": "key",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account associated with the tag",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name where tag belongs to",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "resource type",
+                            "name": "resourcetype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag value",
+                            "name": "value",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the domain associated with the tag",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain associated with the tag",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "customer associated with the tag",
+                            "name": "customer",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project id the tag belongs to",
+                            "name": "projectid",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "Load Balancer network id",
+                    "name": "networkid",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the Load Balancer",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "Load Balancer source ip",
+                    "name": "sourceipaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of rules associated with the Load Balancer",
+                    "name": "loadbalancerrule",
+                    "response": [
+                        {
+                            "description": "instance port of the load balancer rule",
+                            "name": "instanceport",
+                            "type": "integer"
+                        },
+                        {
+                            "description": "the state of the load balancer rule",
+                            "name": "state",
+                            "type": "string"
+                        },
+                        {
+                            "description": "source port of the load balancer rule",
+                            "name": "sourceport",
+                            "type": "integer"
+                        }
+                    ],
+                    "type": "list"
+                }
+            ],
+            "since": "4.2.0"
+        },
+        {
+            "description": "Updates a project",
+            "isasync": true,
+            "name": "updateProject",
+            "params": [
+                {
+                    "description": "id of the project to be modified",
+                    "length": 255,
+                    "name": "id",
+                    "related": "suspendProject,activateProject,updateProject",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "new Admin account for the project",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "display text of the project",
+                    "length": 255,
+                    "name": "displaytext",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "suspendProject,activateProject",
+            "response": [
+                {
+                    "description": "the total number of networks the project can own",
+                    "name": "networklimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the project",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of vpcs the project can own",
+                    "name": "vpclimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total memory (in MB) the project can own",
+                    "name": "memorylimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of public ip addresses allocated for this project",
+                    "name": "iptotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of public ip addresses this project can acquire",
+                    "name": "iplimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of the project",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of vpcs owned by project",
+                    "name": "vpctotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total volume being used by this project",
+                    "name": "volumetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the displaytext of the project",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "the total primary storage space (in GiB) owned by project",
+                    "name": "primarystoragetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of snapshots stored by this project",
+                    "name": "snapshottotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of virtual machines that can be deployed by this project",
+                    "name": "vmlimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of snapshots which can be stored by this project",
+                    "name": "snapshotlimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of virtual machines running for this project",
+                    "name": "vmrunning",
+                    "type": "integer"
+                },
+                {
+                    "description": "the total number of cpu cores owned by project",
+                    "name": "cputotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total volume which can be used by this project",
+                    "name": "volumelimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of virtual machines stopped for this project",
+                    "name": "vmstopped",
+                    "type": "integer"
+                },
+                {
+                    "description": "the total primary storage space (in GiB) the project can own",
+                    "name": "primarystoragelimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of public ip addresses available for this project to acquire",
+                    "name": "ipavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of networks owned by project",
+                    "name": "networktotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of cpu cores the project can own",
+                    "name": "cpulimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total volume available for this project",
+                    "name": "volumeavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of networks available to be created for this project",
+                    "name": "networkavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of virtual machines available for this project to acquire",
+                    "name": "vmavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of vpcs available to be created for this project",
+                    "name": "vpcavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of templates available to be created by this project",
+                    "name": "templateavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total secondary storage space (in GiB) owned by project",
+                    "name": "secondarystoragetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of snapshots available for this project",
+                    "name": "snapshotavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of templates which have been created by this project",
+                    "name": "templatetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the account name of the project's owner",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain name where the project belongs to",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of resource tags associated with vm",
+                    "name": "tags",
+                    "response": [
+                        {
+                            "description": "tag value",
+                            "name": "value",
+                            "type": "string"
+                        },
+                        {
+                            "description": "resource type",
+                            "name": "resourcetype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "id of the resource",
+                            "name": "resourceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project id the tag belongs to",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account associated with the tag",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the domain associated with the tag",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain associated with the tag",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag key name",
+                            "name": "key",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name where tag belongs to",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "customer associated with the tag",
+                            "name": "customer",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "the total memory (in MB) owned by project",
+                    "name": "memorytotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total memory (in MB) available to be created for this project",
+                    "name": "memoryavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total primary storage space (in GiB) available to be used for this project",
+                    "name": "primarystorageavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the id of the project",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the total secondary storage space (in GiB) the project can own",
+                    "name": "secondarystoragelimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of cpu cores available to be created for this project",
+                    "name": "cpuavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of virtual machines deployed by this project",
+                    "name": "vmtotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of templates which can be created by this project",
+                    "name": "templatelimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total secondary storage space (in GiB) available to be used for this project",
+                    "name": "secondarystorageavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain id the project belongs to",
+                    "name": "domainid",
+                    "type": "string"
+                }
+            ],
+            "since": "3.0.0"
+        },
+        {
+            "description": "Deletes a load balancer stickiness policy.",
+            "isasync": true,
+            "name": "deleteLBStickinessPolicy",
+            "params": [
+                {
+                    "description": "the ID of the LB stickiness policy",
+                    "length": 255,
+                    "name": "id",
+                    "related": "listLBStickinessPolicies,createLBStickinessPolicy",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                },
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                }
+            ],
+            "since": "3.0.0"
+        },
+        {
+            "description": "Lists user accounts",
+            "isasync": false,
+            "name": "listUsers",
+            "params": [
+                {
+                    "description": "List users by account type. Valid types include admin, domain-admin, read-only-admin, or user.",
+                    "length": 255,
+                    "name": "accounttype",
+                    "required": false,
+                    "type": "long"
+                },
+                {
+                    "description": "List users by state of the user account.",
+                    "length": 255,
+                    "name": "state",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "List user by the username",
+                    "length": 255,
+                    "name": "username",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "List user by ID.",
+                    "length": 255,
+                    "name": "id",
+                    "related": "disableUser,enableUser,getUser,listUsers,createUser",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "list resources by account. Must be used with the domainId parameter.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "list only resources belonging to the domain specified",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.",
+                    "length": 255,
+                    "name": "isrecursive",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "If set to false, list only resources belonging to the command's caller; if set to true - list resources that the caller is authorized to see. Default value is false",
+                    "length": 255,
+                    "name": "listall",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                }
+            ],
+            "related": "disableUser,enableUser,getUser,createUser",
+            "response": [
+                {
+                    "description": "the boolean value representing if the updating target is in caller's child domain",
+                    "name": "iscallerchilddomain",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the user name",
+                    "name": "username",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain ID of the user",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the type of the role",
+                    "name": "roletype",
+                    "type": "string"
+                },
+                {
+                    "description": "the user lastname",
+                    "name": "lastname",
+                    "type": "string"
+                },
+                {
+                    "description": "the timezone user was created in",
+                    "name": "timezone",
+                    "type": "string"
+                },
+                {
+                    "description": "the user ID",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the api key of the user",
+                    "name": "apikey",
+                    "type": "string"
+                },
+                {
+                    "description": "the user email address",
+                    "name": "email",
+                    "type": "string"
+                },
+                {
+                    "description": "the account type of the user",
+                    "name": "accounttype",
+                    "type": "short"
+                },
+                {
+                    "description": "the user state",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the date and time the user account was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the account name of the user",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the role",
+                    "name": "rolename",
+                    "type": "string"
+                },
+                {
+                    "description": "the account ID of the user",
+                    "name": "accountid",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain name of the user",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the role",
+                    "name": "roleid",
+                    "type": "string"
+                },
+                {
+                    "description": "the secret key of the user",
+                    "name": "secretkey",
+                    "type": "string"
+                },
+                {
+                    "description": "the user firstname",
+                    "name": "firstname",
+                    "type": "string"
+                },
+                {
+                    "description": "true if user is default, false otherwise",
+                    "name": "isdefault",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "This command allows a user to register for the developer API, returning a secret key and an API key. This request is made through the integration API port, so it is a privileged command and must be made on behalf of a user. It is up to the implementer just how the username and password are entered, and then how that translates to an integration API request. Both secret key and API key should be returned to the user",
+            "isasync": false,
+            "name": "registerUserKeys",
+            "params": [
+                {
+                    "description": "User id",
+                    "length": 255,
+                    "name": "id",
+                    "related": "disableUser,enableUser,getUser,createUser",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the api key of the registered user",
+                    "name": "apikey",
+                    "type": "string"
+                },
+                {
+                    "description": "the secret key of the registered user",
+                    "name": "secretkey",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Lists site to site vpn connection gateways",
+            "isasync": false,
+            "name": "listVpnConnections",
+            "params": [
+                {
+                    "description": "id of vpc",
+                    "length": 255,
+                    "name": "vpcid",
+                    "related": "updateVPC,listVPCs,createVPC",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list resources by display flag; only ROOT admin is eligible to pass this parameter",
+                    "length": 255,
+                    "name": "fordisplay",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "boolean"
+                },
+                {
+                    "description": "If set to false, list only resources belonging to the command's caller; if set to true - list resources that the caller is authorized to see. Default value is false",
+                    "length": 255,
+                    "name": "listall",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "id of the vpn connection",
+                    "length": 255,
+                    "name": "id",
+                    "related": "createVpnConnection,listVpnConnections",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "list objects by project",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "suspendProject,activateProject",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list resources by account. Must be used with the domainId parameter.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "list only resources belonging to the domain specified",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.",
+                    "length": 255,
+                    "name": "isrecursive",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "createVpnConnection",
+            "response": [
+                {
+                    "description": "guest cidr list of the customer gateway",
+                    "name": "cidrlist",
+                    "type": "string"
+                },
+                {
+                    "description": "the date and time the host was removed",
+                    "name": "removed",
+                    "type": "date"
+                },
+                {
+                    "description": "State of vpn connection",
+                    "name": "passive",
+                    "type": "boolean"
+                },
+                {
+                    "description": "IKE policy of the customer gateway",
+                    "name": "ikepolicy",
+                    "type": "string"
+                },
+                {
+                    "description": "public ip address id of the customer gateway",
+                    "name": "gateway",
+                    "type": "string"
+                },
+                {
+                    "description": "the customer gateway ID",
+                    "name": "s2scustomergatewayid",
+                    "type": "string"
+                },
+                {
+                    "description": "Lifetime of ESP SA of customer gateway",
+                    "name": "esplifetime",
+                    "type": "long"
+                },
+                {
+                    "description": "ESP policy of the customer gateway",
+                    "name": "esppolicy",
+                    "type": "string"
+                },
+                {
+                    "description": "IPsec Preshared-Key of the customer gateway",
+                    "name": "ipsecpsk",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain id of the owner",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "if DPD is enabled for customer gateway",
+                    "name": "dpd",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the owner",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the connection ID",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the public IP address",
+                    "name": "publicip",
+                    "type": "string"
+                },
+                {
+                    "description": "if Force NAT Encapsulation is enabled for customer gateway",
+                    "name": "forceencap",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the domain name of the owner",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "is connection for display to the regular user",
+                    "name": "fordisplay",
+                    "type": "boolean"
+                },
+                {
+                    "description": "Lifetime of IKE SA of customer gateway",
+                    "name": "ikelifetime",
+                    "type": "long"
+                },
+                {
+                    "description": "State of vpn connection",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the vpn gateway ID",
+                    "name": "s2svpngatewayid",
+                    "type": "string"
+                },
+                {
+                    "description": "the date and time the host was created",
+                    "name": "created",
+                    "type": "date"
+                }
+            ]
+        },
+        {
+            "description": "Lists resource limits.",
+            "isasync": false,
+            "name": "listResourceLimits",
+            "params": [
+                {
+                    "description": "If set to false, list only resources belonging to the command's caller; if set to true - list resources that the caller is authorized to see. Default value is false",
+                    "length": 255,
+                    "name": "listall",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "Type of resource. Values are 0, 1, 2, 3, 4, 6, 7, 8, 9, 10 and 11. 0 - Instance. Number of instances a user can create. 1 - IP. Number of public IP addresses an account can own. 2 - Volume. Number of disk volumes an account can own. 3 - Snapshot. Number of snapshots an account can own. 4 - Template. Number of templates an account can register/create. 5 - Project. Number of projects an account can own. 6 - Network. Number of networks an account can own. 7 - VPC. Number of VPC an account can own. 8 - CPU. Number of CPU an account can allocate for his resources. 9 - Memory. Amount of RAM an account can allocate for his resources. 10 - PrimaryStorage. Total primary storage space (in GiB) a user can use. 11 - SecondaryStorage. Total secondary storage space (in GiB) a user can use. ",
+                    "length": 255,
+                    "name": "resourcetype",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "list resources by account. Must be used with the domainId parameter.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "Lists resource limits by ID.",
+                    "length": 255,
+                    "name": "id",
+                    "required": false,
+                    "type": "long"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "list only resources belonging to the domain specified",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list objects by project",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "suspendProject,activateProject",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.",
+                    "length": 255,
+                    "name": "isrecursive",
+                    "required": false,
+                    "type": "boolean"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the project id of the resource limit",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain ID of the resource limit",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the maximum number of the resource. A -1 means the resource currently has no limit.",
+                    "name": "max",
+                    "type": "long"
+                },
+                {
+                    "description": "the project name of the resource limit",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the account of the resource limit",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain name of the resource limit",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "resource type. Values include 0, 1, 2, 3, 4, 6, 7, 8, 9, 10, 11. See the resourceType parameter for more information on these values.",
+                    "name": "resourcetype",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Disables a user account",
+            "isasync": true,
+            "name": "disableUser",
+            "params": [
+                {
+                    "description": "Disables user by user ID.",
+                    "length": 255,
+                    "name": "id",
+                    "related": "disableUser,enableUser,getUser,createUser",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "enableUser,getUser,createUser",
+            "response": [
+                {
+                    "description": "the user email address",
+                    "name": "email",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the role",
+                    "name": "rolename",
+                    "type": "string"
+                },
+                {
+                    "description": "the account ID of the user",
+                    "name": "accountid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the role",
+                    "name": "roleid",
+                    "type": "string"
+                },
+                {
+                    "description": "the secret key of the user",
+                    "name": "secretkey",
+                    "type": "string"
+                },
+                {
+                    "description": "the user firstname",
+                    "name": "firstname",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain name of the user",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the type of the role",
+                    "name": "roletype",
+                    "type": "string"
+                },
+                {
+                    "description": "the user state",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the date and time the user account was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the api key of the user",
+                    "name": "apikey",
+                    "type": "string"
+                },
+                {
+                    "description": "the user name",
+                    "name": "username",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain ID of the user",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the user lastname",
+                    "name": "lastname",
+                    "type": "string"
+                },
+                {
+                    "description": "the timezone user was created in",
+                    "name": "timezone",
+                    "type": "string"
+                },
+                {
+                    "description": "the user ID",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the boolean value representing if the updating target is in caller's child domain",
+                    "name": "iscallerchilddomain",
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if user is default, false otherwise",
+                    "name": "isdefault",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the account name of the user",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the account type of the user",
+                    "name": "accounttype",
+                    "type": "short"
+                }
+            ]
+        },
+        {
+            "description": "Lists all available ISO files.",
+            "isasync": false,
+            "name": "listIsos",
+            "params": [
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "If set to false, list only resources belonging to the command's caller; if set to true - list resources that the caller is authorized to see. Default value is false",
+                    "length": 255,
+                    "name": "listall",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if this ISO is ready to be deployed",
+                    "length": 255,
+                    "name": "isready",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "list resources by account. Must be used with the domainId parameter.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.",
+                    "length": 255,
+                    "name": "isrecursive",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if the ISO is bootable, false otherwise",
+                    "length": 255,
+                    "name": "bootable",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "List resources by tags (key/value pairs)",
+                    "length": 255,
+                    "name": "tags",
+                    "required": false,
+                    "type": "map"
+                },
+                {
+                    "description": "list objects by project",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "suspendProject,activateProject",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list only resources belonging to the domain specified",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the hypervisor for which to restrict the search",
+                    "length": 255,
+                    "name": "hypervisor",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "possible values are \"featured\", \"self\", \"selfexecutable\",\"sharedexecutable\",\"executable\", and \"community\". * featured : templates that have been marked as featured and public. * self : templates that have been registered or created by the calling user. * selfexecutable : same as self, but only returns templates that can be used to deploy a new VM. * sharedexecutable : templates ready to be deployed that have been granted to the calling user by another user. * executable : templates that are owned by the calling user, or public templates, that can be used to deploy a VM. * community : templates that have been marked as public but not featured. * all : all templates (only usable by admins).",
+                    "length": 255,
+                    "name": "isofilter",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "show removed ISOs as well",
+                    "length": 255,
+                    "name": "showremoved",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "list all ISOs by name",
+                    "length": 255,
+                    "name": "name",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "list ISO by ID",
+                    "length": 255,
+                    "name": "id",
+                    "related": "registerTemplate,listIsos,copyTemplate,registerTemplate,listTemplates,registerIso,listIsos,createTemplate,copyIso",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "true if the ISO is publicly available to all users, false otherwise.",
+                    "length": 255,
+                    "name": "ispublic",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "the ID of the zone",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones,listZones,createZone",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                }
+            ],
+            "related": "registerTemplate,copyTemplate,registerTemplate,listTemplates,registerIso,listIsos,createTemplate,copyIso",
+            "response": [
+                {
+                    "description": "the template display text",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "the template name",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "checksum of the template",
+                    "name": "checksum",
+                    "type": "string"
+                },
+                {
+                    "description": "the date this template was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the date this template was removed",
+                    "name": "removed",
+                    "type": "date"
+                },
+                {
+                    "description": "true if the reset password feature is enabled, false otherwise",
+                    "name": "passwordenabled",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the tag of this template",
+                    "name": "templatetag",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the zone for this template",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the domain to which the template belongs",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the size of the template",
+                    "name": "size",
+                    "type": "long"
+                },
+                {
+                    "description": "true if this template is a public template, false otherwise",
+                    "name": "ispublic",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the hypervisor on which the template runs",
+                    "name": "hypervisor",
+                    "type": "string"
+                },
+                {
+                    "description": "true if template is sshkey enabled, false otherwise",
+                    "name": "sshkeyenabled",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the format of the template.",
+                    "name": "format",
+                    "type": "imageformat"
+                },
+                {
+                    "description": "true if the ISO is bootable, false otherwise",
+                    "name": "bootable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the status of the template",
+                    "name": "status",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the OS type for this template.",
+                    "name": "ostypeid",
+                    "type": "string"
+                },
+                {
+                    "description": "true if the template is managed across all Zones, false otherwise",
+                    "name": "crossZones",
+                    "type": "boolean"
+                },
+                {
+                    "description": "additional key/value details tied with template",
+                    "name": "details",
+                    "type": "map"
+                },
+                {
+                    "description": "the template ID",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the template",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the type of the template",
+                    "name": "templatetype",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the secondary storage host for the template",
+                    "name": "hostname",
+                    "type": "string"
+                },
+                {
+                    "description": "true if this template is a featured template, false otherwise",
+                    "name": "isfeatured",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the account id to which the template belongs",
+                    "name": "accountid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the domain to which the template belongs",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the template",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the template ID of the parent template if present",
+                    "name": "sourcetemplateid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the secondary storage host for the template",
+                    "name": "hostid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the OS type for this template.",
+                    "name": "ostypename",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the zone for this template",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "true if the template is ready to be deployed from, false otherwise.",
+                    "name": "isready",
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if the template is extractable, false otherwise",
+                    "name": "isextractable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the account name to which the template belongs",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "true if template contains XS/VMWare tools inorder to support dynamic scaling of VM cpu/memory",
+                    "name": "isdynamicallyscalable",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "Migrate current NFS secondary storages to use object store.",
+            "isasync": false,
+            "name": "updateCloudToUseObjectStore",
+            "params": [
+                {
+                    "description": "the URL for the image store",
+                    "length": 255,
+                    "name": "url",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the image store provider name",
+                    "length": 255,
+                    "name": "provider",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the name for the image store",
+                    "length": 255,
+                    "name": "name",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the details for the image store. Example: details[0].key=accesskey&details[0].value=s389ddssaa&details[1].key=secretkey&details[1].value=8dshfsss",
+                    "length": 255,
+                    "name": "details",
+                    "required": false,
+                    "type": "map"
+                }
+            ],
+            "related": "addImageStoreS3,listSwifts,listImageStores",
+            "response": [
+                {
+                    "description": "the details of the image store",
+                    "name": "details",
+                    "type": "set"
+                },
+                {
+                    "description": "the ID of the image store",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the image store",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the scope of the image store",
+                    "name": "scope",
+                    "type": "scopetype"
+                },
+                {
+                    "description": "the provider name of the image store",
+                    "name": "providername",
+                    "type": "string"
+                },
+                {
+                    "description": "the url of the image store",
+                    "name": "url",
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone ID of the image store",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the protocol of the image store",
+                    "name": "protocol",
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone name of the image store",
+                    "name": "zonename",
+                    "type": "string"
+                }
+            ],
+            "since": "4.3.0"
+        },
+        {
+            "description": "Lists autoscale policies.",
+            "isasync": false,
+            "name": "listAutoScalePolicies",
+            "params": [
+                {
+                    "description": "list resources by account. Must be used with the domainId parameter.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the action to be executed if all the conditions evaluate to true for the specified duration.",
+                    "length": 255,
+                    "name": "action",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the autoscale policy",
+                    "length": 255,
+                    "name": "id",
+                    "related": "listAutoScalePolicies",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the ID of the condition of the policy",
+                    "length": 255,
+                    "name": "conditionid",
+                    "related": "",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "If set to false, list only resources belonging to the command's caller; if set to true - list resources that the caller is authorized to see. Default value is false",
+                    "length": 255,
+                    "name": "listall",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "list only resources belonging to the domain specified",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.",
+                    "length": 255,
+                    "name": "isrecursive",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "the ID of the autoscale vm group",
+                    "length": 255,
+                    "name": "vmgroupid",
+                    "related": "listAutoScaleVmGroups",
+                    "required": false,
+                    "type": "uuid"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the action to be executed if all the conditions evaluate to true for the specified duration.",
+                    "name": "action",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id autoscale policy",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the autoscale policy ID",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the duration for which the conditions have to be true before action is taken",
+                    "name": "duration",
+                    "type": "integer"
+                },
+                {
+                    "description": "the account owning the autoscale policy",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain ID of the autoscale policy",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the cool down period for which the policy should not be evaluated after the action has been taken",
+                    "name": "quiettime",
+                    "type": "integer"
+                },
+                {
+                    "description": "the list of IDs of the conditions that are being evaluated on every interval",
+                    "name": "conditions",
+                    "type": "list"
+                },
+                {
+                    "description": "the project name of the autoscale policy",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain name of the autoscale policy",
+                    "name": "domain",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "adds baremetal rack configuration text",
+            "isasync": true,
+            "name": "addBaremetalRct",
+            "params": [
+                {
+                    "description": "http url to baremetal RCT configuration",
+                    "length": 255,
+                    "name": "baremetalrcturl",
+                    "required": true,
+                    "type": "object"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "id of rct",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "url",
+                    "name": "url",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Updates a role",
+            "isasync": false,
+            "name": "updateRole",
+            "params": [
+                {
+                    "description": "The description of the role",
+                    "length": 255,
+                    "name": "description",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "The type of the role, valid options are: Admin, ResourceAdmin, DomainAdmin, User",
+                    "length": 255,
+                    "name": "type",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "creates a role with this unique name",
+                    "length": 255,
+                    "name": "name",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "ID of the role",
+                    "length": 255,
+                    "name": "id",
+                    "related": "listRoles",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                }
+            ],
+            "since": "4.9.0"
+        },
+        {
+            "description": "Retrieves VMware DC(s) associated with a zone.",
+            "isasync": false,
+            "name": "listVmwareDcs",
+            "params": [
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "Id of the CloudStack zone.",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones,listZones,createZone",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "addVmwareDc",
+            "response": [
+                {
+                    "description": "The VMware Datacenter name",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "The VMware Datacenter ID",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone ID associated with this VMware Datacenter",
+                    "name": "zoneid",
+                    "type": "long"
+                },
+                {
+                    "description": "The VMware vCenter name/ip",
+                    "name": "vcenter",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Lists zones",
+            "isasync": false,
+            "name": "listZones",
+            "params": [
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "List zones by resource tags (key/value pairs)",
+                    "length": 255,
+                    "name": "tags",
+                    "required": false,
+                    "since": "4.3",
+                    "type": "map"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "flag to display the capacity of the zones",
+                    "length": 255,
+                    "name": "showcapacities",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the zone",
+                    "length": 255,
+                    "name": "name",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the domain associated with the zone",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the network type of the zone that the virtual machine belongs to",
+                    "length": 255,
+                    "name": "networktype",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "true if you want to retrieve all available Zones. False if you only want to return the Zones from which you have at least one VM. Default is false.",
+                    "length": 255,
+                    "name": "available",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "the ID of the zone",
+                    "length": 255,
+                    "name": "id",
+                    "related": "listZones,listZones,createZone",
+                    "required": false,
+                    "type": "uuid"
+                }
+            ],
+            "related": "listZones,createZone",
+            "response": [
+                {
+                    "description": "Zone name",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "Zone description",
+                    "name": "description",
+                    "type": "string"
+                },
+                {
+
+                },
+                {
+                    "description": "the second DNS for the Zone",
+                    "name": "dns2",
+                    "type": "string"
+                },
+                {
+                    "description": "the UUID of the containing domain, null for public zones",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "true if security groups support is enabled, false otherwise",
+                    "name": "securitygroupsenabled",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the display text of the zone",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "the network type of the zone; can be Basic or Advanced",
+                    "name": "networktype",
+                    "type": "string"
+                },
+                {
+                    "description": "the first DNS for the Zone",
+                    "name": "dns1",
+                    "type": "string"
+                },
+                {
+                    "description": "the second IPv6 DNS for the Zone",
+                    "name": "ip6dns2",
+                    "type": "string"
+                },
+                {
+                    "description": "the first internal DNS for the Zone",
+                    "name": "internaldns1",
+                    "type": "string"
+                },
+                {
+                    "description": "Network domain name for the networks in the zone",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the containing domain, null for public zones",
+                    "name": "domainname",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of resource tags associated with zone.",
+                    "name": "tags",
+                    "response": [
+                        {
+                            "description": "tag key name",
+                            "name": "key",
+                            "type": "string"
+                        },
+                        {
+                            "description": "resource type",
+                            "name": "resourcetype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account associated with the tag",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "customer associated with the tag",
+                            "name": "customer",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name where tag belongs to",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag value",
+                            "name": "value",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project id the tag belongs to",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "id of the resource",
+                            "name": "resourceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the domain associated with the tag",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain associated with the tag",
+                            "name": "domain",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "Meta data associated with the zone (key/value pairs)",
+                    "name": "resourcedetails",
+                    "type": "map"
+                },
+                {
+                    "description": "true if local storage offering enabled, false otherwise",
+                    "name": "localstorageenabled",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the allocation state of the cluster",
+                    "name": "allocationstate",
+                    "type": "string"
+                },
+                {
+                    "description": "the second internal DNS for the Zone",
+                    "name": "internaldns2",
+                    "type": "string"
+                },
+                {
+                    "description": "the guest CIDR address for the Zone",
+                    "name": "guestcidraddress",
+                    "type": "string"
+                },
+                {
+                    "description": "Zone id",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "Zone Token",
+                    "name": "zonetoken",
+                    "type": "string"
+                },
+                {
+                    "description": "the capacity of the Zone",
+                    "name": "capacity",
+                    "response": [
+                        {
+                            "description": "the percentage of capacity currently in use",
+                            "name": "percentused",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the Cluster ID",
+                            "name": "clusterid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the capacity currently in use",
+                            "name": "capacityused",
+                            "type": "long"
+                        },
+                        {
+                            "description": "the Zone name",
+                            "name": "zonename",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the Zone ID",
+                            "name": "zoneid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the capacity type",
+                            "name": "type",
+                            "type": "short"
+                        },
+                        {
+                            "description": "the Pod ID",
+                            "name": "podid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the total capacity available",
+                            "name": "capacitytotal",
+                            "type": "long"
+                        },
+                        {
+                            "description": "the Pod name",
+                            "name": "podname",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the Cluster name",
+                            "name": "clustername",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "the dhcp Provider for the Zone",
+                    "name": "dhcpprovider",
+                    "type": "string"
+                },
+                {
+                    "description": "the first IPv6 DNS for the Zone",
+                    "name": "ip6dns1",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Lists remote access vpns",
+            "isasync": false,
+            "name": "listRemoteAccessVpns",
+            "params": [
+                {
+                    "description": "list objects by project",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "suspendProject,activateProject",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "Lists remote access vpn rule with the specified ID",
+                    "length": 255,
+                    "name": "id",
+                    "related": "updateRemoteAccessVpn,listRemoteAccessVpns",
+                    "required": false,
+                    "since": "4.3",
+                    "type": "uuid"
+                },
+                {
+                    "description": "list remote access VPNs for ceratin network",
+                    "length": 255,
+                    "name": "networkid",
+                    "related": "updateNetwork,listBrocadeVcsDeviceNetworks,createNetwork,listNetworks,listNetscalerLoadBalancerNetworks,listF5LoadBalancerNetworks",
+                    "required": false,
+                    "since": "4.3",
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "list resources by display flag; only ROOT admin is eligible to pass this parameter",
+                    "length": 255,
+                    "name": "fordisplay",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "boolean"
+                },
+                {
+                    "description": "If set to false, list only resources belonging to the command's caller; if set to true - list resources that the caller is authorized to see. Default value is false",
+                    "length": 255,
+                    "name": "listall",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "public ip address id of the vpn server",
+                    "length": 255,
+                    "name": "publicipid",
+                    "related": "updateIpAddress,associateIpAddress,listPublicIpAddresses",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.",
+                    "length": 255,
+                    "name": "isrecursive",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "list resources by account. Must be used with the domainId parameter.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "list only resources belonging to the domain specified",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "updateRemoteAccessVpn",
+            "response": [
+                {
+                    "description": "the project name of the vpn",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the ipsec preshared key",
+                    "name": "presharedkey",
+                    "type": "string"
+                },
+                {
+                    "description": "the range of ips to allocate to the clients",
+                    "name": "iprange",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain id of the account of the remote access vpn",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of the rule",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "is vpn for display to the regular user",
+                    "name": "fordisplay",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the public ip address of the vpn server",
+                    "name": "publicipid",
+                    "type": "string"
+                },
+                {
+                    "description": "the account of the remote access vpn",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the public ip address of the vpn server",
+                    "name": "publicip",
+                    "type": "string"
+                },
+                {
+                    "description": "the id of the remote access vpn",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the vpn",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain name of the account of the remote access vpn",
+                    "name": "domain",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Deletes a network ACL",
+            "isasync": true,
+            "name": "deleteNetworkACLList",
+            "params": [
+                {
+                    "description": "the ID of the network ACL",
+                    "length": 255,
+                    "name": "id",
+                    "related": "createNetworkACLList",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "Creates a system virtual-machine that implements network services",
+            "isasync": true,
+            "name": "createServiceInstance",
+            "params": [
+                {
+                    "description": "Availability zone for the service instance",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones,createZone",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "An optional domainId for the virtual machine. If the account parameter is used, domainId must also be used.",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "The template ID that specifies the image for the service appliance",
+                    "length": 255,
+                    "name": "templateid",
+                    "related": "registerTemplate,copyTemplate,registerTemplate,listTemplates,registerIso,listIsos,createTemplate,copyIso",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "The right (outside) network ID for the service instance",
+                    "length": 255,
+                    "name": "rightnetworkid",
+                    "related": "updateNetwork,listBrocadeVcsDeviceNetworks,createNetwork,listNetworks,listNetscalerLoadBalancerNetworks,listF5LoadBalancerNetworks",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "An optional account for the virtual machine. Must be used with domainId.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "Project ID for the service instance",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "suspendProject,activateProject",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "The service offering ID that defines the resources consumed by the service appliance",
+                    "length": 255,
+                    "name": "serviceofferingid",
+                    "related": "updateServiceOffering,listServiceOfferings",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "The left (inside) network for service instance",
+                    "length": 255,
+                    "name": "leftnetworkid",
+                    "related": "updateNetwork,listBrocadeVcsDeviceNetworks,createNetwork,listNetworks,listNetscalerLoadBalancerNetworks,listF5LoadBalancerNetworks",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "The name of the service instance",
+                    "length": 255,
+                    "name": "name",
+                    "required": true,
+                    "type": "string"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "user generated name. The name of the virtual machine is returned if no displayname exists.",
+                    "name": "displayname",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the virtual machine",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the vm",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the account associated with the virtual machine",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the virtual machine",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the vm",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the domain in which the virtual machine exists",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the domain in which the virtual machine exists",
+                    "name": "domainid",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Removes secondary IP from the NIC.",
+            "isasync": true,
+            "name": "removeIpFromNic",
+            "params": [
+                {
+                    "description": "the ID of the secondary ip address to nic",
+                    "length": 255,
+                    "name": "id",
+                    "related": "",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                },
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Releases a Public IP range back to the system pool",
+            "isasync": false,
+            "name": "releasePublicIpRange",
+            "params": [
+                {
+                    "description": "the id of the Public IP range",
+                    "length": 255,
+                    "name": "id",
+                    "related": "dedicatePublicIpRange",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                },
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "lists network that are using a netscaler load balancer device",
+            "isasync": false,
+            "name": "listNetscalerLoadBalancerNetworks",
+            "params": [
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "netscaler load balancer device ID",
+                    "length": 255,
+                    "name": "lbdeviceid",
+                    "related": "addNetscalerLoadBalancer,listNetscalerLoadBalancers",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                }
+            ],
+            "related": "updateNetwork,listBrocadeVcsDeviceNetworks,createNetwork,listNetworks,listF5LoadBalancerNetworks",
+            "response": [
+                {
+                    "description": "the list of resource tags associated with network",
+                    "name": "tags",
+                    "response": [
+                        {
+                            "description": "the project name where tag belongs to",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain associated with the tag",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag key name",
+                            "name": "key",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag value",
+                            "name": "value",
+                            "type": "string"
+                        },
+                        {
+                            "description": "id of the resource",
+                            "name": "resourceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project id the tag belongs to",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "resource type",
+                            "name": "resourcetype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the domain associated with the tag",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "customer associated with the tag",
+                            "name": "customer",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account associated with the tag",
+                            "name": "account",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "the list of services",
+                    "name": "service",
+                    "response": [
+                        {
+                            "description": "the service provider name",
+                            "name": "provider",
+                            "response": [
+                                {
+                                    "description": "the provider name",
+                                    "name": "name",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the destination physical network",
+                                    "name": "destinationphysicalnetworkid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "true if individual services can be enabled/disabled",
+                                    "name": "canenableindividualservice",
+                                    "type": "boolean"
+                                },
+                                {
+                                    "description": "the physical network this belongs to",
+                                    "name": "physicalnetworkid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "state of the network provider",
+                                    "name": "state",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "uuid of the network provider",
+                                    "name": "id",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "services for this provider",
+                                    "name": "servicelist",
+                                    "type": "list"
+                                }
+                            ],
+                            "type": "list"
+                        },
+                        {
+                            "description": "the service name",
+                            "name": "name",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of capabilities",
+                            "name": "capability",
+                            "response": [
+                                {
+                                    "description": "the capability name",
+                                    "name": "name",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the capability value",
+                                    "name": "value",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "can this service capability value can be choosable while creatine network offerings",
+                                    "name": "canchooseservicecapability",
+                                    "type": "boolean"
+                                }
+                            ],
+                            "type": "list"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "the name of the network",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "display text of the network offering the network is created from",
+                    "name": "networkofferingdisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "network offering id the network is created from",
+                    "name": "networkofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "list networks available for vm deployment",
+                    "name": "canusefordeploy",
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if users from subdomains can access the domain level network",
+                    "name": "subdomainaccess",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the network's IP range not to be used by CloudStack guest VMs and can be used for non CloudStack purposes",
+                    "name": "reservediprange",
+                    "type": "string"
+                },
+                {
+                    "description": "the network's netmask",
+                    "name": "netmask",
+                    "type": "string"
+                },
+                {
+                    "description": "The vlan of the network. This parameter is visible to ROOT admins only",
+                    "name": "vlan",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain id of the network owner",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "true if network can span multiple zones",
+                    "name": "strechedl2subnet",
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if network is default, false otherwise",
+                    "name": "isdefault",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the project id of the ipaddress",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the type of the network",
+                    "name": "type",
+                    "type": "string"
+                },
+                {
+                    "description": "VPC the network belongs to",
+                    "name": "vpcid",
+                    "type": "string"
+                },
+                {
+                    "description": "the network CIDR of the guest network configured with IP reservation. It is the summation of CIDR and RESERVED_IP_RANGE",
+                    "name": "networkcidr",
+                    "type": "string"
+                },
+                {
+                    "description": "acl type - access type to the network",
+                    "name": "acltype",
+                    "type": "string"
+                },
+                {
+                    "description": "the network domain",
+                    "name": "networkdomain",
+                    "type": "string"
+                },
+                {
+                    "description": "Cloudstack managed address space, all CloudStack managed VMs get IP address from CIDR",
+                    "name": "cidr",
+                    "type": "string"
+                },
+                {
+                    "description": "zone id of the network",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "If a network is enabled for 'streched l2 subnet' then represents zones on which network currently spans",
+                    "name": "zonesnetworkspans",
+                    "type": "set"
+                },
+                {
+                    "description": "the project name of the address",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the zone the network belongs to",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "true if network is system, false otherwise",
+                    "name": "issystem",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the second DNS for the network",
+                    "name": "dns2",
+                    "type": "string"
+                },
+                {
+                    "description": "true if network offering is ip conserve mode enabled",
+                    "name": "networkofferingconservemode",
+                    "type": "boolean"
+                },
+                {
+                    "description": "availability of the network offering the network is created from",
+                    "name": "networkofferingavailability",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain name of the network owner",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "an optional field, whether to the display the network to the end user or not.",
+                    "name": "displaynetwork",
+                    "type": "boolean"
+                },
+                {
+                    "description": "ACL Id associated with the VPC network",
+                    "name": "aclid",
+                    "type": "string"
+                },
+                {
+                    "description": "the first DNS for the network",
+                    "name": "dns1",
+                    "type": "string"
+                },
+                {
+                    "description": "the owner of the network",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the cidr of IPv6 network",
+                    "name": "ip6cidr",
+                    "type": "string"
+                },
+                {
+                    "description": "the displaytext of the network",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "Broadcast domain type of the network",
+                    "name": "broadcastdomaintype",
+                    "type": "string"
+                },
+                {
+                    "description": "the gateway of IPv6 network",
+                    "name": "ip6gateway",
+                    "type": "string"
+                },
+                {
+                    "description": "the network's gateway",
+                    "name": "gateway",
+                    "type": "string"
+                },
+                {
+                    "description": "the id of the network",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "name of the network offering the network is created from",
+                    "name": "networkofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "the physical network id",
+                    "name": "physicalnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "state of the network",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "true network requires restart",
+                    "name": "restartrequired",
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if network supports specifying ip ranges, false otherwise",
+                    "name": "specifyipranges",
+                    "type": "boolean"
+                },
+                {
+                    "description": "related to what other network configuration",
+                    "name": "related",
+                    "type": "string"
+                },
+                {
+                    "description": "broadcast uri of the network. This parameter is visible to ROOT admins only",
+                    "name": "broadcasturi",
+                    "type": "string"
+                },
+                {
+                    "description": "list networks that are persistent",
+                    "name": "ispersistent",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the traffic type of the network",
+                    "name": "traffictype",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Starts a system virtual machine.",
+            "isasync": true,
+            "name": "startSystemVm",
+            "params": [
+                {
+                    "description": "The ID of the system virtual machine",
+                    "length": 255,
+                    "name": "id",
+                    "related": "migrateSystemVm,startSystemVm",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "migrateSystemVm",
+            "response": [
+                {
+                    "description": "the Zone name for the system VM",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the private netmask for the system VM",
+                    "name": "privatenetmask",
+                    "type": "string"
+                },
+                {
+                    "description": "the private MAC address for the system VM",
+                    "name": "privatemacaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the date and time the system VM was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the first DNS for the system VM",
+                    "name": "dns1",
+                    "type": "string"
+                },
+                {
+                    "description": "the template ID for the system VM",
+                    "name": "templateid",
+                    "type": "string"
+                },
+                {
+                    "description": "the system VM type",
+                    "name": "systemvmtype",
+                    "type": "string"
+                },
+                {
+                    "description": "the public MAC address for the system VM",
+                    "name": "publicmacaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the number of active console sessions for the console proxy system vm",
+                    "name": "activeviewersessions",
+                    "type": "integer"
+                },
+                {
+                    "description": "the second DNS for the system VM",
+                    "name": "dns2",
+                    "type": "string"
+                },
+                {
+                    "description": "the link local netmask for the system vm",
+                    "name": "linklocalnetmask",
+                    "type": "string"
+                },
+                {
+                    "description": "the public netmask for the system VM",
+                    "name": "publicnetmask",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the system VM",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of the system VM",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the private IP address for the system VM",
+                    "name": "privateip",
+                    "type": "string"
+                },
+                {
+                    "description": "the hostname for the system VM",
+                    "name": "hostname",
+                    "type": "string"
+                },
+                {
+                    "description": "the hypervisor on which the template runs",
+                    "name": "hypervisor",
+                    "type": "string"
+                },
+                {
+                    "description": "the gateway for the system VM",
+                    "name": "gateway",
+                    "type": "string"
+                },
+                {
+                    "description": "the Pod ID for the system VM",
+                    "name": "podid",
+                    "type": "string"
+                },
+                {
+                    "description": "the host ID for the system VM",
+                    "name": "hostid",
+                    "type": "string"
+                },
+                {
+                    "description": "the link local MAC address for the system vm",
+                    "name": "linklocalmacaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the public IP address for the system VM",
+                    "name": "publicip",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the system VM",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the job status associated with the system VM.  This is only displayed if the router listed is part of a currently running asynchronous job.",
+                    "name": "jobstatus",
+                    "type": "integer"
+                },
+                {
+                    "description": "the job ID associated with the system VM. This is only displayed if the router listed is part of a currently running asynchronous job.",
+                    "name": "jobid",
+                    "type": "string"
+                },
+                {
+                    "description": "the network domain for the system VM",
+                    "name": "networkdomain",
+                    "type": "string"
+                },
+                {
+                    "description": "the link local IP address for the system vm",
+                    "name": "linklocalip",
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone ID for the system VM",
+                    "name": "zoneid",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Lists supported methods of network isolation",
+            "isasync": false,
+            "name": "listNetworkIsolationMethods",
+            "params": [
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "Network isolation method name",
+                    "name": "name",
+                    "type": "string"
+                }
+            ],
+            "since": "4.2.0"
+        },
+        {
+            "description": "List a storage network IP range.",
+            "isasync": false,
+            "name": "listStorageNetworkIpRange",
+            "params": [
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "optional parameter. Zone uuid, if specicied and both pod uuid and range uuid are absent, using it to search the range.",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones,createZone",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "optional parameter. Storaget network IP range uuid, if specicied, using it to search the range.",
+                    "length": 255,
+                    "name": "id",
+                    "related": "createStorageNetworkIpRange,listStorageNetworkIpRange",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "optional parameter. Pod uuid, if specicied and range uuid is absent, using it to search the range.",
+                    "length": 255,
+                    "name": "podid",
+                    "related": "updatePod",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "createStorageNetworkIpRange",
+            "response": [
+                {
+                    "description": "the ID or VID of the VLAN.",
+                    "name": "vlan",
+                    "type": "integer"
+                },
+                {
+                    "description": "the Zone uuid of the storage network IP range",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the uuid of storage network IP range.",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the start ip of the storage network IP range",
+                    "name": "startip",
+                    "type": "string"
+                },
+                {
+                    "description": "the end ip of the storage network IP range",
+                    "name": "endip",
+                    "type": "string"
+                },
+                {
+                    "description": "the gateway of the storage network IP range",
+                    "name": "gateway",
+                    "type": "string"
+                },
+                {
+                    "description": "the netmask of the storage network IP range",
+                    "name": "netmask",
+                    "type": "string"
+                },
+                {
+                    "description": "the network uuid of storage network IP range",
+                    "name": "networkid",
+                    "type": "string"
+                },
+                {
+                    "description": "the Pod uuid for the storage network IP range",
+                    "name": "podid",
+                    "type": "string"
+                }
+            ],
+            "since": "3.0.0"
+        },
+        {
+            "description": "Deletes a specified domain",
+            "isasync": true,
+            "name": "deleteDomain",
+            "params": [
+                {
+                    "description": "true if all domain resources (child domains, accounts) have to be cleaned up, false otherwise",
+                    "length": 255,
+                    "name": "cleanup",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "ID of domain to delete",
+                    "length": 255,
+                    "name": "id",
+                    "related": "listDomainChildren,listDomains",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                },
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Configures a virtual router element.",
+            "isasync": true,
+            "name": "configureVirtualRouterElement",
+            "params": [
+                {
+                    "description": "the ID of the virtual router provider",
+                    "length": 255,
+                    "name": "id",
+                    "related": "listVirtualRouterElements,configureVirtualRouterElement",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "Enabled/Disabled the service provider",
+                    "length": 255,
+                    "name": "enabled",
+                    "required": true,
+                    "type": "boolean"
+                }
+            ],
+            "related": "listVirtualRouterElements",
+            "response": [
+                {
+                    "description": "the domain ID associated with the provider",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the ipaddress",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the address",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "Enabled/Disabled the service provider",
+                    "name": "enabled",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the account associated with the provider",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the id of the router",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the physical network service provider id of the provider",
+                    "name": "nspid",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain associated with the provider",
+                    "name": "domain",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Migrate volume",
+            "isasync": true,
+            "name": "migrateVolume",
+            "params": [
+                {
+                    "description": "the ID of the volume",
+                    "length": 255,
+                    "name": "volumeid",
+                    "related": "updateVolume,migrateVolume,createVolume,listVolumes,uploadVolume,attachVolume,detachVolume,resizeVolume,migrateVolume,createVolume",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "if the volume should be live migrated when it is attached to a running vm",
+                    "length": 255,
+                    "name": "livemigrate",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "destination storage pool ID to migrate the volume to",
+                    "length": 255,
+                    "name": "storageid",
+                    "related": "createStoragePool,findStoragePoolsForMigration,enableStorageMaintenance,cancelStorageMaintenance",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "updateVolume,createVolume,listVolumes,uploadVolume,attachVolume,detachVolume,resizeVolume,migrateVolume,createVolume",
+            "response": [
+                {
+                    "description": "provisioning type used to create volumes.",
+                    "name": "provisioningtype",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the template for the virtual machine. A -1 is returned if the virtual machine was created from an ISO file.",
+                    "name": "templateid",
+                    "type": "string"
+                },
+                {
+                    "description": "name of the disk offering",
+                    "name": "diskofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the vpn",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "name of the disk volume",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain associated with the disk volume",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the chain info of the volume",
+                    "name": "chaininfo",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the device on user vm the volume is attahed to. This tag is not returned when the volume is detached.",
+                    "name": "deviceid",
+                    "type": "long"
+                },
+                {
+                    "description": " an alternate display text of the template for the virtual machine",
+                    "name": "templatedisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "ID of the disk offering",
+                    "name": "diskofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "id of the primary storage hosting the disk volume; returned to admin user only",
+                    "name": "storageid",
+                    "type": "string"
+                },
+                {
+                    "description": "ID of the service offering for root disk",
+                    "name": "serviceofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "the status of the volume",
+                    "name": "status",
+                    "type": "string"
+                },
+                {
+                    "description": "Hypervisor the volume belongs to",
+                    "name": "hypervisor",
+                    "type": "string"
+                },
+                {
+                    "description": "shared or local storage",
+                    "name": "storagetype",
+                    "type": "string"
+                },
+                {
+                    "description": "io requests read rate of the disk volume",
+                    "name": "diskIopsReadRate",
+                    "type": "long"
+                },
+                {
+                    "description": "an optional field whether to the display the volume to the end user or not.",
+                    "name": "displayvolume",
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if the volume is extractable, false otherwise",
+                    "name": "isextractable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "bytes write rate of the disk volume",
+                    "name": "diskBytesWriteRate",
+                    "type": "long"
+                },
+                {
+                    "description": "the state of the disk volume",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the vpn",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "an alternate display text of the ISO attached to the virtual machine",
+                    "name": "isodisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "ID of the availability zone",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "type of the disk volume (ROOT or DATADISK)",
+                    "name": "type",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the ISO attached to the virtual machine",
+                    "name": "isoid",
+                    "type": "string"
+                },
+                {
+                    "description": "display name of the virtual machine",
+                    "name": "vmdisplayname",
+                    "type": "string"
+                },
+                {
+                    "description": "ID of the snapshot from which this volume was created",
+                    "name": "snapshotid",
+                    "type": "string"
+                },
+                {
+                    "description": "id of the virtual machine",
+                    "name": "virtualmachineid",
+                    "type": "string"
+                },
+                {
+                    "description": "the date the volume was attached to a VM instance",
+                    "name": "attached",
+                    "type": "date"
+                },
+                {
+                    "description": "name of the availability zone",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "name of the virtual machine",
+                    "name": "vmname",
+                    "type": "string"
+                },
+                {
+                    "description": "max iops of the disk volume",
+                    "name": "maxiops",
+                    "type": "long"
+                },
+                {
+                    "description": "the boolean state of whether the volume is destroyed or not",
+                    "name": "destroyed",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the ID of the domain associated with the disk volume",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "min iops of the disk volume",
+                    "name": "miniops",
+                    "type": "long"
+                },
+                {
+                    "description": "the date the disk volume was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "name of the primary storage hosting the disk volume",
+                    "name": "storage",
+                    "type": "string"
+                },
+                {
+                    "description": "the display text of the service offering for root disk",
+                    "name": "serviceofferingdisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "the display text of the disk offering",
+                    "name": "diskofferingdisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "need quiesce vm or not when taking snapshot",
+                    "name": "quiescevm",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the account associated with the disk volume",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "name of the service offering for root disk",
+                    "name": "serviceofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the ISO attached to the virtual machine",
+                    "name": "isoname",
+                    "type": "string"
+                },
+                {
+                    "description": "ID of the disk volume",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the template for the virtual machine",
+                    "name": "templatename",
+                    "type": "string"
+                },
+                {
+                    "description": "state of the virtual machine",
+                    "name": "vmstate",
+                    "type": "string"
+                },
+                {
+                    "description": "io requests write rate of the disk volume",
+                    "name": "diskIopsWriteRate",
+                    "type": "long"
+                },
+                {
+                    "description": "the path of the volume",
+                    "name": "path",
+                    "type": "string"
+                },
+                {
+                    "description": "size of the disk volume",
+                    "name": "size",
+                    "type": "long"
+                },
+                {
+                    "description": "bytes read rate of the disk volume",
+                    "name": "diskBytesReadRate",
+                    "type": "long"
+                }
+            ],
+            "since": "3.0.0"
+        },
+        {
+            "description": "Updates the affinity/anti-affinity group associations of a virtual machine. The VM has to be stopped and restarted for the new properties to take effect.",
+            "isasync": true,
+            "name": "updateVMAffinityGroup",
+            "params": [
+                {
+                    "description": "comma separated list of affinity groups id that are going to be applied to the virtual machine. Should be passed only when vm is created from a zone with Basic Network support. Mutually exclusive with securitygroupnames parameter",
+                    "length": 255,
+                    "name": "affinitygroupids",
+                    "related": "",
+                    "required": false,
+                    "type": "list"
+                },
+                {
+                    "description": "The ID of the virtual machine",
+                    "length": 255,
+                    "name": "id",
+                    "related": "updateVMAffinityGroup,resetSSHKeyForVirtualMachine,attachIso,removeNicFromVirtualMachine,recoverVirtualMachine,updateVMAffinityGroup,rebootVirtualMachine,restoreVirtualMachine,destroyVirtualMachine,stopVirtualMachine,detachIso,deployVirtualMachine,updateVirtualMachine,revertToVMSnapshot,resetPasswordForVirtualMachine,startVirtualMachine,updateDefaultNicForVirtualMachine,startVirtualMachine,attachIso,listVirtualMachines,addNicToVirtualMachine,stopVirtualMachine,destroyVirtualMachine,removeNicFromVirtualMachine,changeServiceForVirtualMachine",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "comma separated list of affinity groups names that are going to be applied to the virtual machine. Should be passed only when vm is created from a zone with Basic Network support. Mutually exclusive with securitygroupids parameter",
+                    "length": 255,
+                    "name": "affinitygroupnames",
+                    "related": "",
+                    "required": false,
+                    "type": "list"
+                }
+            ],
+            "related": "resetSSHKeyForVirtualMachine,attachIso,removeNicFromVirtualMachine,recoverVirtualMachine,updateVMAffinityGroup,rebootVirtualMachine,restoreVirtualMachine,destroyVirtualMachine,stopVirtualMachine,detachIso,deployVirtualMachine,updateVirtualMachine,revertToVMSnapshot,resetPasswordForVirtualMachine,startVirtualMachine,updateDefaultNicForVirtualMachine,startVirtualMachine,attachIso,listVirtualMachines,addNicToVirtualMachine,stopVirtualMachine,destroyVirtualMachine,removeNicFromVirtualMachine,changeServiceForVirtualMachine",
+            "response": [
+                {
+                    "description": "the account associated with the virtual machine",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "Vm details in key/value pairs.",
+                    "name": "details",
+                    "type": "map"
+                },
+                {
+                    "description": "the name of the template for the virtual machine",
+                    "name": "templatename",
+                    "type": "string"
+                },
+                {
+                    "description": "ssh key-pair",
+                    "name": "keypair",
+                    "type": "string"
+                },
+                {
+                    "description": "the number of cpu this virtual machine is running with",
+                    "name": "cpunumber",
+                    "type": "integer"
+                },
+                {
+                    "description": "the amount of the vm's CPU currently used",
+                    "name": "cpuused",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the domain in which the virtual machine exists",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "Os type ID of the virtual machine",
+                    "name": "guestosid",
+                    "type": "string"
+                },
+                {
+                    "description": "the date when this virtual machine was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the ID of the virtual machine",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": " an alternate display text of the template for the virtual machine",
+                    "name": "templatedisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "the password (if exists) of the virtual machine",
+                    "name": "password",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the template for the virtual machine. A -1 is returned if the virtual machine was created from an ISO file.",
+                    "name": "templateid",
+                    "type": "string"
+                },
+                {
+                    "description": "the read (bytes) of disk on the vm",
+                    "name": "diskkbsread",
+                    "type": "long"
+                },
+                {
+                    "description": "the target memory in vm",
+                    "name": "memorytargetkbs",
+                    "type": "long"
+                },
+                {
+                    "description": "list of security groups associated with the virtual machine",
+                    "name": "securitygroup",
+                    "response": [
+                        {
+                            "description": "the description of the security group",
+                            "name": "description",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account owning the security group",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the security group",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain ID of the security group",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the name of the security group",
+                            "name": "name",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project id of the group",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of resource tags associated with the rule",
+                            "name": "tags",
+                            "response": [
+                                {
+                                    "description": "tag key name",
+                                    "name": "key",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the ID of the domain associated with the tag",
+                                    "name": "domainid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the domain associated with the tag",
+                                    "name": "domain",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "tag value",
+                                    "name": "value",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "customer associated with the tag",
+                                    "name": "customer",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the project id the tag belongs to",
+                                    "name": "projectid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the project name where tag belongs to",
+                                    "name": "project",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "resource type",
+                                    "name": "resourcetype",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "id of the resource",
+                                    "name": "resourceid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the account associated with the tag",
+                                    "name": "account",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "set"
+                        },
+                        {
+                            "description": "the domain name of the security group",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of virtualmachine ids associated with this securitygroup",
+                            "name": "virtualmachineids",
+                            "type": "set"
+                        },
+                        {
+                            "description": "the list of ingress rules associated with the security group",
+                            "name": "ingressrule",
+                            "response": [
+                                {
+                                    "description": "the protocol of the security group rule",
+                                    "name": "protocol",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the type of the ICMP message response",
+                                    "name": "icmptype",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the list of resource tags associated with the rule",
+                                    "name": "tags",
+                                    "response": [
+                                        {
+                                            "description": "resource type",
+                                            "name": "resourcetype",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "id of the resource",
+                                            "name": "resourceid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project id the tag belongs to",
+                                            "name": "projectid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project name where tag belongs to",
+                                            "name": "project",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag key name",
+                                            "name": "key",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "customer associated with the tag",
+                                            "name": "customer",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag value",
+                                            "name": "value",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the domain associated with the tag",
+                                            "name": "domain",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the account associated with the tag",
+                                            "name": "account",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the ID of the domain associated with the tag",
+                                            "name": "domainid",
+                                            "type": "string"
+                                        }
+                                    ],
+                                    "type": "set"
+                                },
+                                {
+                                    "description": "the ending IP of the security group rule ",
+                                    "name": "endport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the starting IP of the security group rule",
+                                    "name": "startport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the id of the security group rule",
+                                    "name": "ruleid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the CIDR notation for the base IP address of the security group rule",
+                                    "name": "cidr",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the code for the ICMP message response",
+                                    "name": "icmpcode",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "security group name",
+                                    "name": "securitygroupname",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "account owning the security group rule",
+                                    "name": "account",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "set"
+                        },
+                        {
+                            "description": "the project name of the group",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of egress rules associated with the security group",
+                            "name": "egressrule",
+                            "response": [
+                                {
+                                    "description": "the protocol of the security group rule",
+                                    "name": "protocol",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the type of the ICMP message response",
+                                    "name": "icmptype",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the list of resource tags associated with the rule",
+                                    "name": "tags",
+                                    "response": [
+                                        {
+                                            "description": "the domain associated with the tag",
+                                            "name": "domain",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag value",
+                                            "name": "value",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "resource type",
+                                            "name": "resourcetype",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the account associated with the tag",
+                                            "name": "account",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "id of the resource",
+                                            "name": "resourceid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the ID of the domain associated with the tag",
+                                            "name": "domainid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "customer associated with the tag",
+                                            "name": "customer",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag key name",
+                                            "name": "key",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project id the tag belongs to",
+                                            "name": "projectid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project name where tag belongs to",
+                                            "name": "project",
+                                            "type": "string"
+                                        }
+                                    ],
+                                    "type": "set"
+                                },
+                                {
+                                    "description": "the id of the security group rule",
+                                    "name": "ruleid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the code for the ICMP message response",
+                                    "name": "icmpcode",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "security group name",
+                                    "name": "securitygroupname",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the CIDR notation for the base IP address of the security group rule",
+                                    "name": "cidr",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the ending IP of the security group rule ",
+                                    "name": "endport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the starting IP of the security group rule",
+                                    "name": "startport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "account owning the security group rule",
+                                    "name": "account",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "set"
+                        },
+                        {
+                            "description": "the number of virtualmachines associated with this securitygroup",
+                            "name": "virtualmachinecount",
+                            "type": "integer"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "instance name of the user vm; this parameter is returned to the ROOT admin only",
+                    "name": "instancename",
+                    "type": "string"
+                },
+                {
+                    "description": "the incoming network traffic on the vm",
+                    "name": "networkkbsread",
+                    "type": "long"
+                },
+                {
+                    "description": "the ID of the availablility zone for the virtual machine",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the availability zone for the virtual machine",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the outgoing network traffic on the host",
+                    "name": "networkkbswrite",
+                    "type": "long"
+                },
+                {
+                    "description": "the group ID of the virtual machine",
+                    "name": "groupid",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of the virtual machine",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the disk offering of the virtual machine",
+                    "name": "diskofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "the write (bytes) of disk on the vm",
+                    "name": "diskkbswrite",
+                    "type": "long"
+                },
+                {
+                    "description": "the virtual network for the service offering",
+                    "name": "forvirtualnetwork",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the ID of the ISO attached to the virtual machine",
+                    "name": "isoid",
+                    "type": "string"
+                },
+                {
+                    "description": "true if the password rest feature is enabled, false otherwise",
+                    "name": "passwordenabled",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the name of the domain in which the virtual machine exists",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the user's ID who deployed the virtual machine",
+                    "name": "userid",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the vm",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the service offering of the virtual machine",
+                    "name": "serviceofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "OS type id of the vm",
+                    "name": "ostypeid",
+                    "type": "long"
+                },
+                {
+                    "description": "true if vm contains XS/VMWare tools inorder to support dynamic scaling of VM cpu/memory.",
+                    "name": "isdynamicallyscalable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "State of the Service from LB rule",
+                    "name": "servicestate",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the vm",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "an alternate display text of the ISO attached to the virtual machine",
+                    "name": "isodisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "an optional field whether to the display the vm to the end user or not.",
+                    "name": "displayvm",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the read (io) of disk on the vm",
+                    "name": "diskioread",
+                    "type": "long"
+                },
+                {
+                    "description": "the name of the virtual machine",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the host for the virtual machine",
+                    "name": "hostname",
+                    "type": "string"
+                },
+                {
+                    "description": "the memory used by the vm",
+                    "name": "memorykbs",
+                    "type": "long"
+                },
+                {
+                    "description": "the ID of the service offering of the virtual machine",
+                    "name": "serviceofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "the internal memory thats free in vm",
+                    "name": "memoryintfreekbs",
+                    "type": "long"
+                },
+                {
+                    "description": "device ID of the root volume",
+                    "name": "rootdeviceid",
+                    "type": "long"
+                },
+                {
+
+                },
+                {
+                    "description": "the name of the ISO attached to the virtual machine",
+                    "name": "isoname",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of nics associated with vm",
+                    "name": "nic",
+                    "response": [
+                        {
+                            "description": "the ip address of the nic",
+                            "name": "ipaddress",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the netmask of the nic",
+                            "name": "netmask",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the NSX Logical Switch Port (if NSX based), null otherwise",
+                            "name": "nsxlogicalswitchport",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if nic is default, false otherwise",
+                            "name": "isdefault",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "Id of the vm to which the nic belongs",
+                            "name": "virtualmachineid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the corresponding network",
+                            "name": "networkid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if nic is default, false otherwise",
+                            "name": "macaddress",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the cidr of IPv6 network",
+                            "name": "ip6cidr",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the gateway of IPv6 network",
+                            "name": "ip6gateway",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the NSX Logical Switch (if NSX based), null otherwise",
+                            "name": "nsxlogicalswitch",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the gateway of the nic",
+                            "name": "gateway",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the isolation uri of the nic",
+                            "name": "isolationuri",
+                            "type": "string"
+                        },
+                        {
+                            "description": "device id for the network when plugged into the virtual machine",
+                            "name": "deviceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the broadcast uri of the nic",
+                            "name": "broadcasturi",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the name of the corresponding network",
+                            "name": "networkname",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the type of the nic",
+                            "name": "type",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the Secondary ipv4 addr of nic",
+                            "name": "secondaryip",
+                            "type": "list"
+                        },
+                        {
+                            "description": "the traffic type of the nic",
+                            "name": "traffictype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the nic",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the IPv6 address of network",
+                            "name": "ip6address",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "true if high-availability is enabled, false otherwise",
+                    "name": "haenable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "user generated name. The name of the virtual machine is returned if no displayname exists.",
+                    "name": "displayname",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the disk offering of the virtual machine",
+                    "name": "diskofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the host for the virtual machine",
+                    "name": "hostid",
+                    "type": "string"
+                },
+                {
+                    "description": "the memory allocated for the virtual machine",
+                    "name": "memory",
+                    "type": "integer"
+                },
+                {
+                    "description": "public IP address id associated with vm via Static nat rule",
+                    "name": "publicip",
+                    "type": "string"
+                },
+                {
+                    "description": "public IP address id associated with vm via Static nat rule",
+                    "name": "publicipid",
+                    "type": "string"
+                },
+                {
+                    "description": "device type of the root volume",
+                    "name": "rootdevicetype",
+                    "type": "string"
+                },
+                {
+                    "description": "the write (io) of disk on the vm",
+                    "name": "diskiowrite",
+                    "type": "long"
+                },
+                {
+                    "description": "list of affinity groups associated with the virtual machine",
+                    "name": "affinitygroup",
+                    "response": [
+                        {
+                            "description": "virtual machine IDs associated with this affinity group",
+                            "name": "virtualmachineIds",
+                            "type": "list"
+                        },
+                        {
+                            "description": "the account owning the affinity group",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the description of the affinity group",
+                            "name": "description",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project ID of the affinity group",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the affinity group",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the name of the affinity group",
+                            "name": "name",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain name of the affinity group",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name of the affinity group",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the type of the affinity group",
+                            "name": "type",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain ID of the affinity group",
+                            "name": "domainid",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "the hypervisor on which the template runs",
+                    "name": "hypervisor",
+                    "type": "string"
+                },
+                {
+                    "description": "the speed of each cpu",
+                    "name": "cpuspeed",
+                    "type": "integer"
+                },
+                {
+                    "description": "the vgpu type used by the virtual machine",
+                    "name": "vgpu",
+                    "type": "string"
+                },
+                {
+                    "description": "the user's name who deployed the virtual machine",
+                    "name": "username",
+                    "type": "string"
+                },
+                {
+                    "description": "the group name of the virtual machine",
+                    "name": "group",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "A command to list events.",
+            "isasync": false,
+            "name": "listEvents",
+            "params": [
+                {
+                    "description": "the time the event was entered",
+                    "length": 255,
+                    "name": "entrytime",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "list only resources belonging to the domain specified",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the event level (INFO, WARN, ERROR)",
+                    "length": 255,
+                    "name": "level",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the event type (see event types)",
+                    "length": 255,
+                    "name": "type",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "list resources by account. Must be used with the domainId parameter.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the start date range of the list you want to retrieve (use format \"yyyy-MM-dd\" or the new format \"yyyy-MM-dd HH:mm:ss\")",
+                    "length": 255,
+                    "name": "startdate",
+                    "required": false,
+                    "type": "date"
+                },
+                {
+                    "description": "the ID of the event",
+                    "length": 255,
+                    "name": "id",
+                    "related": "listEvents",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "If set to false, list only resources belonging to the command's caller; if set to true - list resources that the caller is authorized to see. Default value is false",
+                    "length": 255,
+                    "name": "listall",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "the duration of the event",
+                    "length": 255,
+                    "name": "duration",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "the end date range of the list you want to retrieve (use format \"yyyy-MM-dd\" or the new format \"yyyy-MM-dd HH:mm:ss\")",
+                    "length": 255,
+                    "name": "enddate",
+                    "required": false,
+                    "type": "date"
+                },
+                {
+                    "description": "defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.",
+                    "length": 255,
+                    "name": "isrecursive",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "list objects by project",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "suspendProject,activateProject",
+                    "required": false,
+                    "type": "uuid"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the project name of the address",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the id of the account's domain",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the date the event was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "whether the event is parented",
+                    "name": "parentid",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of the event",
+                    "name": "state",
+                    "type": "state"
+                },
+                {
+                    "description": "the type of the event (see event types)",
+                    "name": "type",
+                    "type": "string"
+                },
+                {
+                    "description": "the event level (INFO, WARN, ERROR)",
+                    "name": "level",
+                    "type": "string"
+                },
+                {
+                    "description": "the account name for the account that owns the object being acted on in the event (e.g. the owner of the virtual machine, ip address, or security group)",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "a brief description of the event",
+                    "name": "description",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the account's domain",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the ipaddress",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the event",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the user who performed the action (can be different from the account if an admin is performing an action for a user, e.g. starting/stopping a user's virtual machine)",
+                    "name": "username",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Creates resource tag(s)",
+            "isasync": true,
+            "name": "createTags",
+            "params": [
+                {
+                    "description": "list of resources to create the tags for",
+                    "length": 255,
+                    "name": "resourceids",
+                    "required": true,
+                    "type": "list"
+                },
+                {
+                    "description": "type of the resource",
+                    "length": 255,
+                    "name": "resourcetype",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "Map of tags (key/value pairs)",
+                    "length": 255,
+                    "name": "tags",
+                    "required": true,
+                    "type": "map"
+                },
+                {
+                    "description": "identifies client specific tag. When the value is not null, the tag can't be used by cloudStack code internally",
+                    "length": 255,
+                    "name": "customer",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "response": [
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                }
+            ],
+            "since": "4.0.0"
+        },
+        {
+            "description": "Configures a SRX firewall device",
+            "isasync": true,
+            "name": "configureSrxFirewall",
+            "params": [
+                {
+                    "description": "SRX firewall device ID",
+                    "length": 255,
+                    "name": "fwdeviceid",
+                    "related": "configureSrxFirewall",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "capacity of the firewall device, Capacity will be interpreted as number of networks device can handle",
+                    "length": 255,
+                    "name": "fwdevicecapacity",
+                    "required": false,
+                    "type": "long"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the public security zone of the external firewall",
+                    "name": "publiczone",
+                    "type": "string"
+                },
+                {
+                    "description": "device id of the SRX firewall",
+                    "name": "fwdeviceid",
+                    "type": "string"
+                },
+                {
+                    "description": "the zone ID of the external firewall",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the public interface of the external firewall",
+                    "name": "publicinterface",
+                    "type": "string"
+                },
+                {
+                    "description": "device capacity",
+                    "name": "fwdevicecapacity",
+                    "type": "long"
+                },
+                {
+                    "description": "the private security zone of the external firewall",
+                    "name": "privatezone",
+                    "type": "string"
+                },
+                {
+                    "description": "name of the provider",
+                    "name": "provider",
+                    "type": "string"
+                },
+                {
+                    "description": "device state",
+                    "name": "fwdevicestate",
+                    "type": "string"
+                },
+                {
+                    "description": "device name",
+                    "name": "fwdevicename",
+                    "type": "string"
+                },
+                {
+                    "description": "the management IP address of the external firewall",
+                    "name": "ipaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the number of times to retry requests to the external firewall",
+                    "name": "numretries",
+                    "type": "string"
+                },
+                {
+                    "description": "the timeout (in seconds) for requests to the external firewall",
+                    "name": "timeout",
+                    "type": "string"
+                },
+                {
+                    "description": "the physical network to which this SRX firewall belongs to",
+                    "name": "physicalnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "the username that's used to log in to the external firewall",
+                    "name": "username",
+                    "type": "string"
+                },
+                {
+                    "description": "the usage interface of the external firewall",
+                    "name": "usageinterface",
+                    "type": "string"
+                },
+                {
+                    "description": "the private interface of the external firewall",
+                    "name": "privateinterface",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Reset api count",
+            "isasync": false,
+            "name": "resetApiLimit",
+            "params": [
+                {
+                    "description": "the ID of the acount whose limit to be reset",
+                    "length": 255,
+                    "name": "account",
+                    "related": "listAccounts,listAccounts,enableAccount",
+                    "required": false,
+                    "type": "uuid"
+                }
+            ],
+            "related": "getApiLimit",
+            "response": [
+                {
+                    "description": "currently allowed number of apis",
+                    "name": "apiAllowed",
+                    "type": "int"
+                },
+                {
+                    "description": "number of api already issued",
+                    "name": "apiIssued",
+                    "type": "int"
+                },
+                {
+                    "description": "the account uuid of the api remaining count",
+                    "name": "accountid",
+                    "type": "string"
+                },
+                {
+                    "description": "the account name of the api remaining count",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "seconds left to reset counters",
+                    "name": "expireAfter",
+                    "type": "long"
+                }
+            ]
+        },
+        {
+            "description": "Create an Internal Load Balancer element.",
+            "isasync": true,
+            "name": "createInternalLoadBalancerElement",
+            "params": [
+                {
+                    "description": "the network service provider ID of the internal load balancer element",
+                    "length": 255,
+                    "name": "nspid",
+                    "related": "listNetworkServiceProviders",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "configureInternalLoadBalancerElement",
+            "response": [
+                {
+                    "description": "the physical network service provider id of the element",
+                    "name": "nspid",
+                    "type": "string"
+                },
+                {
+                    "description": "the id of the internal load balancer element",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "Enabled/Disabled the element",
+                    "name": "enabled",
+                    "type": "boolean"
+                }
+            ],
+            "since": "4.2.0"
+        },
+        {
+            "description": "Creates a VLAN IP range.",
+            "isasync": false,
+            "name": "deleteVlanIpRange",
+            "params": [
+                {
+                    "description": "the id of the VLAN IP range",
+                    "length": 255,
+                    "name": "id",
+                    "related": "dedicatePublicIpRange",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                },
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Generates an alert",
+            "isasync": true,
+            "name": "generateAlert",
+            "params": [
+                {
+                    "description": "Alert description",
+                    "length": 999,
+                    "name": "description",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "Zone id for which alert is generated",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones,createZone",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "Pod id for which alert is generated",
+                    "length": 255,
+                    "name": "podid",
+                    "related": "updatePod",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "Type of the alert",
+                    "length": 255,
+                    "name": "type",
+                    "required": true,
+                    "type": "short"
+                },
+                {
+                    "description": "Name of the alert",
+                    "length": 255,
+                    "name": "name",
+                    "required": true,
+                    "type": "string"
+                }
+            ],
+            "response": [
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                },
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                }
+            ],
+            "since": "4.3"
+        },
+        {
+            "description": "Add a new Ldap Configuration",
+            "isasync": false,
+            "name": "addLdapConfiguration",
+            "params": [
+                {
+                    "description": "Hostname",
+                    "length": 255,
+                    "name": "hostname",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "Port",
+                    "length": 255,
+                    "name": "port",
+                    "required": true,
+                    "type": "integer"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "port",
+                    "name": "port",
+                    "type": "int"
+                },
+                {
+                    "description": "hostname",
+                    "name": "hostname",
+                    "type": "string"
+                }
+            ],
+            "since": "4.2.0"
+        },
+        {
+            "description": "Configure the LDAP context for this site.",
+            "isasync": false,
+            "name": "ldapConfig",
+            "params": [
+                {
+                    "description": "Specify the distinguished name of a user with the search permission on the directory.",
+                    "length": 255,
+                    "name": "binddn",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "Enter the password for trust store.",
+                    "length": 255,
+                    "name": "truststorepass",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "Enter the password.",
+                    "length": 255,
+                    "name": "bindpass",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "Hostname or ip address of the ldap server eg: my.ldap.com",
+                    "length": 255,
+                    "name": "hostname",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "Enter the path to trust certificates store.",
+                    "length": 255,
+                    "name": "truststore",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "You specify a query filter here, which narrows down the users, who can be part of this domain.",
+                    "length": 255,
+                    "name": "queryfilter",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "The search base defines the starting point for the search in the directory tree Example:  dc=cloud,dc=com.",
+                    "length": 255,
+                    "name": "searchbase",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "Specify the LDAP port if required, default is 389.",
+                    "length": 255,
+                    "name": "port",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "Check Use SSL if the external LDAP server is configured for LDAP over SSL.",
+                    "length": 255,
+                    "name": "ssl",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "If true return current LDAP configuration",
+                    "length": 255,
+                    "name": "listall",
+                    "required": false,
+                    "type": "boolean"
+                }
+            ],
+            "related": "ldapRemove",
+            "response": [
+                {
+                    "description": "The search base defines the starting point for the search in the directory tree Example:  dc=cloud,dc=com",
+                    "name": "searchbase",
+                    "type": "string"
+                },
+                {
+                    "description": "Specify the distinguished name of a user with the search permission on the directory",
+                    "name": "binddn",
+                    "type": "string"
+                },
+                {
+                    "description": "Check Use SSL if the external LDAP server is configured for LDAP over SSL",
+                    "name": "ssl",
+                    "type": "string"
+                },
+                {
+                    "description": "Specify the LDAP port if required, default is 389",
+                    "name": "port",
+                    "type": "string"
+                },
+                {
+                    "description": "Hostname or ip address of the ldap server eg: my.ldap.com",
+                    "name": "hostname",
+                    "type": "string"
+                },
+                {
+                    "description": "DN password",
+                    "name": "bindpass",
+                    "type": "string"
+                },
+                {
+                    "description": "You specify a query filter here, which narrows down the users, who can be part of this domain",
+                    "name": "queryfilter",
+                    "type": "string"
+                }
+            ],
+            "since": "3.0.0"
+        },
+        {
+            "description": "Deletes a port forwarding rule",
+            "isasync": true,
+            "name": "deletePortForwardingRule",
+            "params": [
+                {
+                    "description": "the ID of the port forwarding rule",
+                    "length": 255,
+                    "name": "id",
+                    "related": "",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "Deletes a global load balancer rule.",
+            "isasync": true,
+            "name": "deleteGlobalLoadBalancerRule",
+            "params": [
+                {
+                    "description": "the ID of the global load balancer rule",
+                    "length": 255,
+                    "name": "id",
+                    "related": "",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "Lists BigSwitch BCF Controller devices",
+            "isasync": false,
+            "name": "listBigSwitchBcfDevices",
+            "params": [
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "the Physical Network ID",
+                    "length": 255,
+                    "name": "physicalnetworkid",
+                    "related": "createPhysicalNetwork",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "bigswitch BCF controller device ID",
+                    "length": 255,
+                    "name": "bcfdeviceid",
+                    "related": "listBigSwitchBcfDevices",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the controller password",
+                    "name": "password",
+                    "type": "string"
+                },
+                {
+                    "description": "NAT support",
+                    "name": "nat",
+                    "type": "boolean"
+                },
+                {
+                    "description": "device name",
+                    "name": "bigswitchdevicename",
+                    "type": "string"
+                },
+                {
+                    "description": "the physical network to which this BigSwitch BCF segment belongs to",
+                    "name": "physicalnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "name of the provider",
+                    "name": "provider",
+                    "type": "string"
+                },
+                {
+                    "description": "the controller Ip address",
+                    "name": "hostname",
+                    "type": "string"
+                },
+                {
+                    "description": "device id of the BigSwitch BCF Controller",
+                    "name": "bcfdeviceid",
+                    "type": "string"
+                },
+                {
+                    "description": "the controller username",
+                    "name": "username",
+                    "type": "string"
+                }
+            ],
+            "since": "4.6.0"
+        },
+        {
+            "description": "Updates a configuration.",
+            "isasync": false,
+            "name": "updateConfiguration",
+            "params": [
+                {
+                    "description": "the ID of the Account to update the parameter value for corresponding account",
+                    "length": 255,
+                    "name": "accountid",
+                    "related": "listAccounts,listAccounts,enableAccount",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the ID of the Zone to update the parameter value for corresponding zone",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones,createZone",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the ID of the Storage pool to update the parameter value for corresponding storage pool",
+                    "length": 255,
+                    "name": "storageid",
+                    "related": "createStoragePool,findStoragePoolsForMigration,enableStorageMaintenance,cancelStorageMaintenance",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the ID of the Cluster to update the parameter value for corresponding cluster",
+                    "length": 255,
+                    "name": "clusterid",
+                    "related": "addCluster",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the name of the configuration",
+                    "length": 255,
+                    "name": "name",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the value of the configuration",
+                    "length": 4095,
+                    "name": "value",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the value of the configuration",
+                    "name": "id",
+                    "type": "long"
+                },
+                {
+                    "description": "scope(zone/cluster/pool/account) of the parameter that needs to be updated",
+                    "name": "scope",
+                    "type": "string"
+                },
+                {
+                    "description": "the category of the configuration",
+                    "name": "category",
+                    "type": "string"
+                },
+                {
+                    "description": "the description of the configuration",
+                    "name": "description",
+                    "type": "string"
+                },
+                {
+                    "description": "the value of the configuration",
+                    "name": "value",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the configuration",
+                    "name": "name",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Dedicates a Public IP range to an account",
+            "isasync": false,
+            "name": "dedicatePublicIpRange",
+            "params": [
+                {
+                    "description": "domain ID of the account owning a VLAN",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "listDomainChildren,listDomains",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "project who will own the VLAN",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "suspendProject,activateProject",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the id of the VLAN IP range",
+                    "length": 255,
+                    "name": "id",
+                    "related": "dedicatePublicIpRange",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "account who will own the VLAN",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the Pod name for the VLAN IP range",
+                    "name": "podname",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the VLAN IP range",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the description of the VLAN IP range",
+                    "name": "description",
+                    "type": "string"
+                },
+                {
+                    "description": "the cidr of IPv6 network",
+                    "name": "ip6cidr",
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone ID of the VLAN IP range",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the Pod ID for the VLAN IP range",
+                    "name": "podid",
+                    "type": "string"
+                },
+                {
+                    "description": "the netmask of the VLAN IP range",
+                    "name": "netmask",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the vlan range",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain ID of the VLAN IP range",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the physical network this belongs to",
+                    "name": "physicalnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "the gateway of IPv6 network",
+                    "name": "ip6gateway",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID or VID of the VLAN.",
+                    "name": "vlan",
+                    "type": "string"
+                },
+                {
+                    "description": "the start ip of the VLAN IP range",
+                    "name": "startip",
+                    "type": "string"
+                },
+                {
+                    "description": "the end ip of the VLAN IP range",
+                    "name": "endip",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain name of the VLAN IP range",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the gateway of the VLAN IP range",
+                    "name": "gateway",
+                    "type": "string"
+                },
+                {
+                    "description": "the account of the VLAN IP range",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the vlan range",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the start ipv6 of the VLAN IP range",
+                    "name": "startipv6",
+                    "type": "string"
+                },
+                {
+                    "description": "the network id of vlan range",
+                    "name": "networkid",
+                    "type": "string"
+                },
+                {
+                    "description": "the virtual network for the VLAN IP range",
+                    "name": "forvirtualnetwork",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the end ipv6 of the VLAN IP range",
+                    "name": "endipv6",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Enables static NAT for given IP address",
+            "isasync": false,
+            "name": "enableStaticNat",
+            "params": [
+                {
+                    "description": "the ID of the virtual machine for enabling static NAT feature",
+                    "length": 255,
+                    "name": "virtualmachineid",
+                    "related": "resetSSHKeyForVirtualMachine,attachIso,removeNicFromVirtualMachine,recoverVirtualMachine,updateVMAffinityGroup,rebootVirtualMachine,restoreVirtualMachine,destroyVirtualMachine,stopVirtualMachine,detachIso,deployVirtualMachine,updateVirtualMachine,revertToVMSnapshot,resetPasswordForVirtualMachine,startVirtualMachine,updateDefaultNicForVirtualMachine,startVirtualMachine,attachIso,listVirtualMachines,addNicToVirtualMachine,stopVirtualMachine,destroyVirtualMachine,removeNicFromVirtualMachine,changeServiceForVirtualMachine",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "VM guest NIC secondary IP address for the port forwarding rule",
+                    "length": 255,
+                    "name": "vmguestip",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the public IP address ID for which static NAT feature is being enabled",
+                    "length": 255,
+                    "name": "ipaddressid",
+                    "related": "updateIpAddress,associateIpAddress,listPublicIpAddresses",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "The network of the VM the static NAT will be enabled for. Required when public IP address is not associated with any guest network yet (VPC case)",
+                    "length": 255,
+                    "name": "networkid",
+                    "related": "updateNetwork,listBrocadeVcsDeviceNetworks,createNetwork,listNetworks,listF5LoadBalancerNetworks",
+                    "required": false,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                },
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Deletes a Zone.",
+            "isasync": false,
+            "name": "deleteZone",
+            "params": [
+                {
+                    "description": "the ID of the Zone",
+                    "length": 255,
+                    "name": "id",
+                    "related": "listZones,createZone",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                },
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Recovers a virtual machine.",
+            "isasync": false,
+            "name": "recoverVirtualMachine",
+            "params": [
+                {
+                    "description": "The ID of the virtual machine",
+                    "length": 255,
+                    "name": "id",
+                    "related": "resetSSHKeyForVirtualMachine,attachIso,removeNicFromVirtualMachine,recoverVirtualMachine,updateVMAffinityGroup,rebootVirtualMachine,restoreVirtualMachine,destroyVirtualMachine,stopVirtualMachine,detachIso,deployVirtualMachine,updateVirtualMachine,revertToVMSnapshot,resetPasswordForVirtualMachine,startVirtualMachine,updateDefaultNicForVirtualMachine,startVirtualMachine,attachIso,listVirtualMachines,addNicToVirtualMachine,stopVirtualMachine,destroyVirtualMachine,removeNicFromVirtualMachine,changeServiceForVirtualMachine",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "resetSSHKeyForVirtualMachine,attachIso,removeNicFromVirtualMachine,updateVMAffinityGroup,rebootVirtualMachine,restoreVirtualMachine,destroyVirtualMachine,stopVirtualMachine,detachIso,deployVirtualMachine,updateVirtualMachine,revertToVMSnapshot,resetPasswordForVirtualMachine,startVirtualMachine,updateDefaultNicForVirtualMachine,startVirtualMachine,attachIso,listVirtualMachines,addNicToVirtualMachine,stopVirtualMachine,destroyVirtualMachine,removeNicFromVirtualMachine,changeServiceForVirtualMachine",
+            "response": [
+                {
+                    "description": "the ID of the disk offering of the virtual machine",
+                    "name": "diskofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "the memory allocated for the virtual machine",
+                    "name": "memory",
+                    "type": "integer"
+                },
+                {
+                    "description": "the ID of the host for the virtual machine",
+                    "name": "hostid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the service offering of the virtual machine",
+                    "name": "serviceofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "the group name of the virtual machine",
+                    "name": "group",
+                    "type": "string"
+                },
+                {
+                    "description": "the number of cpu this virtual machine is running with",
+                    "name": "cpunumber",
+                    "type": "integer"
+                },
+                {
+                    "description": "the memory used by the vm",
+                    "name": "memorykbs",
+                    "type": "long"
+                },
+                {
+                    "description": "the write (io) of disk on the vm",
+                    "name": "diskiowrite",
+                    "type": "long"
+                },
+                {
+                    "description": "the name of the disk offering of the virtual machine",
+                    "name": "diskofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "public IP address id associated with vm via Static nat rule",
+                    "name": "publicipid",
+                    "type": "string"
+                },
+                {
+                    "description": "the date when this virtual machine was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "instance name of the user vm; this parameter is returned to the ROOT admin only",
+                    "name": "instancename",
+                    "type": "string"
+                },
+                {
+                    "description": "the target memory in vm",
+                    "name": "memorytargetkbs",
+                    "type": "long"
+                },
+                {
+                    "description": "device type of the root volume",
+                    "name": "rootdevicetype",
+                    "type": "string"
+                },
+                {
+                    "description": "the read (bytes) of disk on the vm",
+                    "name": "diskkbsread",
+                    "type": "long"
+                },
+                {
+                    "description": "the name of the template for the virtual machine",
+                    "name": "templatename",
+                    "type": "string"
+                },
+                {
+                    "description": "the speed of each cpu",
+                    "name": "cpuspeed",
+                    "type": "integer"
+                },
+                {
+                    "description": "the name of the virtual machine",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the internal memory thats free in vm",
+                    "name": "memoryintfreekbs",
+                    "type": "long"
+                },
+                {
+                    "description": "the group ID of the virtual machine",
+                    "name": "groupid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the virtual machine",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the virtual network for the service offering",
+                    "name": "forvirtualnetwork",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the outgoing network traffic on the host",
+                    "name": "networkkbswrite",
+                    "type": "long"
+                },
+                {
+                    "description": "the incoming network traffic on the vm",
+                    "name": "networkkbsread",
+                    "type": "long"
+                },
+                {
+                    "description": "true if vm contains XS/VMWare tools inorder to support dynamic scaling of VM cpu/memory.",
+                    "name": "isdynamicallyscalable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the name of the domain in which the virtual machine exists",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "list of affinity groups associated with the virtual machine",
+                    "name": "affinitygroup",
+                    "response": [
+                        {
+                            "description": "the project ID of the affinity group",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the affinity group",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the description of the affinity group",
+                            "name": "description",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the name of the affinity group",
+                            "name": "name",
+                            "type": "string"
+                        },
+                        {
+                            "description": "virtual machine IDs associated with this affinity group",
+                            "name": "virtualmachineIds",
+                            "type": "list"
+                        },
+                        {
+                            "description": "the domain name of the affinity group",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the type of the affinity group",
+                            "name": "type",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain ID of the affinity group",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name of the affinity group",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account owning the affinity group",
+                            "name": "account",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "true if the password rest feature is enabled, false otherwise",
+                    "name": "passwordenabled",
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if high-availability is enabled, false otherwise",
+                    "name": "haenable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the ID of the availablility zone for the virtual machine",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "an optional field whether to the display the vm to the end user or not.",
+                    "name": "displayvm",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the project name of the vm",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "user generated name. The name of the virtual machine is returned if no displayname exists.",
+                    "name": "displayname",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the ISO attached to the virtual machine",
+                    "name": "isoid",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the vm",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the ISO attached to the virtual machine",
+                    "name": "isoname",
+                    "type": "string"
+                },
+                {
+                    "description": "Vm details in key/value pairs.",
+                    "name": "details",
+                    "type": "map"
+                },
+                {
+                    "description": "device ID of the root volume",
+                    "name": "rootdeviceid",
+                    "type": "long"
+                },
+                {
+                    "description": "the amount of the vm's CPU currently used",
+                    "name": "cpuused",
+                    "type": "string"
+                },
+                {
+                    "description": "public IP address id associated with vm via Static nat rule",
+                    "name": "publicip",
+                    "type": "string"
+                },
+                {
+                    "description": "the write (bytes) of disk on the vm",
+                    "name": "diskkbswrite",
+                    "type": "long"
+                },
+                {
+                    "description": "the state of the virtual machine",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the availability zone for the virtual machine",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the user's ID who deployed the virtual machine",
+                    "name": "userid",
+                    "type": "string"
+                },
+                {
+                    "description": "an alternate display text of the ISO attached to the virtual machine",
+                    "name": "isodisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "the vgpu type used by the virtual machine",
+                    "name": "vgpu",
+                    "type": "string"
+                },
+                {
+
+                },
+                {
+                    "description": "the ID of the template for the virtual machine. A -1 is returned if the virtual machine was created from an ISO file.",
+                    "name": "templateid",
+                    "type": "string"
+                },
+                {
+                    "description": " an alternate display text of the template for the virtual machine",
+                    "name": "templatedisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "State of the Service from LB rule",
+                    "name": "servicestate",
+                    "type": "string"
+                },
+                {
+                    "description": "list of security groups associated with the virtual machine",
+                    "name": "securitygroup",
+                    "response": [
+                        {
+                            "description": "the description of the security group",
+                            "name": "description",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the number of virtualmachines associated with this securitygroup",
+                            "name": "virtualmachinecount",
+                            "type": "integer"
+                        },
+                        {
+                            "description": "the ID of the security group",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of egress rules associated with the security group",
+                            "name": "egressrule",
+                            "response": [
+                                {
+                                    "description": "the list of resource tags associated with the rule",
+                                    "name": "tags",
+                                    "response": [
+                                        {
+                                            "description": "the project id the tag belongs to",
+                                            "name": "projectid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the domain associated with the tag",
+                                            "name": "domain",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag key name",
+                                            "name": "key",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag value",
+                                            "name": "value",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the account associated with the tag",
+                                            "name": "account",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project name where tag belongs to",
+                                            "name": "project",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "id of the resource",
+                                            "name": "resourceid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "customer associated with the tag",
+                                            "name": "customer",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "resource type",
+                                            "name": "resourcetype",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the ID of the domain associated with the tag",
+                                            "name": "domainid",
+                                            "type": "string"
+                                        }
+                                    ],
+                                    "type": "set"
+                                },
+                                {
+                                    "description": "the CIDR notation for the base IP address of the security group rule",
+                                    "name": "cidr",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the code for the ICMP message response",
+                                    "name": "icmpcode",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "security group name",
+                                    "name": "securitygroupname",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "account owning the security group rule",
+                                    "name": "account",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the protocol of the security group rule",
+                                    "name": "protocol",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the type of the ICMP message response",
+                                    "name": "icmptype",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the ending IP of the security group rule ",
+                                    "name": "endport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the id of the security group rule",
+                                    "name": "ruleid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the starting IP of the security group rule",
+                                    "name": "startport",
+                                    "type": "integer"
+                                }
+                            ],
+                            "type": "set"
+                        },
+                        {
+                            "description": "the account owning the security group",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the name of the security group",
+                            "name": "name",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name of the group",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of ingress rules associated with the security group",
+                            "name": "ingressrule",
+                            "response": [
+                                {
+                                    "description": "the list of resource tags associated with the rule",
+                                    "name": "tags",
+                                    "response": [
+                                        {
+                                            "description": "id of the resource",
+                                            "name": "resourceid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project name where tag belongs to",
+                                            "name": "project",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag key name",
+                                            "name": "key",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project id the tag belongs to",
+                                            "name": "projectid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the domain associated with the tag",
+                                            "name": "domain",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "resource type",
+                                            "name": "resourcetype",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag value",
+                                            "name": "value",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the ID of the domain associated with the tag",
+                                            "name": "domainid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the account associated with the tag",
+                                            "name": "account",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "customer associated with the tag",
+                                            "name": "customer",
+                                            "type": "string"
+                                        }
+                                    ],
+                                    "type": "set"
+                                },
+                                {
+                                    "description": "the protocol of the security group rule",
+                                    "name": "protocol",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "account owning the security group rule",
+                                    "name": "account",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the code for the ICMP message response",
+                                    "name": "icmpcode",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the ending IP of the security group rule ",
+                                    "name": "endport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "security group name",
+                                    "name": "securitygroupname",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the CIDR notation for the base IP address of the security group rule",
+                                    "name": "cidr",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the type of the ICMP message response",
+                                    "name": "icmptype",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the id of the security group rule",
+                                    "name": "ruleid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the starting IP of the security group rule",
+                                    "name": "startport",
+                                    "type": "integer"
+                                }
+                            ],
+                            "type": "set"
+                        },
+                        {
+                            "description": "the project id of the group",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of resource tags associated with the rule",
+                            "name": "tags",
+                            "response": [
+                                {
+                                    "description": "the domain associated with the tag",
+                                    "name": "domain",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "resource type",
+                                    "name": "resourcetype",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the project id the tag belongs to",
+                                    "name": "projectid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "tag value",
+                                    "name": "value",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "id of the resource",
+                                    "name": "resourceid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the account associated with the tag",
+                                    "name": "account",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the project name where tag belongs to",
+                                    "name": "project",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the ID of the domain associated with the tag",
+                                    "name": "domainid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "customer associated with the tag",
+                                    "name": "customer",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "tag key name",
+                                    "name": "key",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "set"
+                        },
+                        {
+                            "description": "the domain ID of the security group",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain name of the security group",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of virtualmachine ids associated with this securitygroup",
+                            "name": "virtualmachineids",
+                            "type": "set"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "the hypervisor on which the template runs",
+                    "name": "hypervisor",
+                    "type": "string"
+                },
+                {
+                    "description": "OS type id of the vm",
+                    "name": "ostypeid",
+                    "type": "long"
+                },
+                {
+                    "description": "the account associated with the virtual machine",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "Os type ID of the virtual machine",
+                    "name": "guestosid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the domain in which the virtual machine exists",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the service offering of the virtual machine",
+                    "name": "serviceofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the host for the virtual machine",
+                    "name": "hostname",
+                    "type": "string"
+                },
+                {
+                    "description": "the read (io) of disk on the vm",
+                    "name": "diskioread",
+                    "type": "long"
+                },
+                {
+                    "description": "the user's name who deployed the virtual machine",
+                    "name": "username",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of nics associated with vm",
+                    "name": "nic",
+                    "response": [
+                        {
+                            "description": "the name of the corresponding network",
+                            "name": "networkname",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the cidr of IPv6 network",
+                            "name": "ip6cidr",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ip address of the nic",
+                            "name": "ipaddress",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the netmask of the nic",
+                            "name": "netmask",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if nic is default, false otherwise",
+                            "name": "isdefault",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "the isolation uri of the nic",
+                            "name": "isolationuri",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the type of the nic",
+                            "name": "type",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the NSX Logical Switch Port (if NSX based), null otherwise",
+                            "name": "nsxlogicalswitchport",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the vm to which the nic belongs",
+                            "name": "virtualmachineid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the broadcast uri of the nic",
+                            "name": "broadcasturi",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the IPv6 address of network",
+                            "name": "ip6address",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the Secondary ipv4 addr of nic",
+                            "name": "secondaryip",
+                            "type": "list"
+                        },
+                        {
+                            "description": "the ID of the nic",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if nic is default, false otherwise",
+                            "name": "macaddress",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the gateway of IPv6 network",
+                            "name": "ip6gateway",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the traffic type of the nic",
+                            "name": "traffictype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the NSX Logical Switch (if NSX based), null otherwise",
+                            "name": "nsxlogicalswitch",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the gateway of the nic",
+                            "name": "gateway",
+                            "type": "string"
+                        },
+                        {
+                            "description": "device id for the network when plugged into the virtual machine",
+                            "name": "deviceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the corresponding network",
+                            "name": "networkid",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "ssh key-pair",
+                    "name": "keypair",
+                    "type": "string"
+                },
+                {
+                    "description": "the password (if exists) of the virtual machine",
+                    "name": "password",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "upload an existing template into the CloudStack cloud. ",
+            "isasync": false,
+            "name": "getUploadParamsForTemplate",
+            "params": [
+                {
+                    "description": "an optional domainId. If the account parameter is used, domainId must also be used.",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the display text of the template. This is usually used for display purposes.",
+                    "length": 4096,
+                    "name": "displaytext",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "true if the template type is routing i.e., if template is used to deploy router",
+                    "length": 255,
+                    "name": "isrouting",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if the template is available to all accounts; default is true",
+                    "length": 255,
+                    "name": "ispublic",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if the template supports the password reset feature; default is false",
+                    "length": 255,
+                    "name": "passwordenabled",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "the name of the volume/template",
+                    "length": 255,
+                    "name": "name",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the MD5 checksum value of this volume/template",
+                    "length": 255,
+                    "name": "checksum",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "true if the template supports the sshkey upload feature; default is false",
+                    "length": 255,
+                    "name": "sshkeyenabled",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "the ID of the OS Type that best represents the OS of this template.",
+                    "length": 255,
+                    "name": "ostypeid",
+                    "related": "",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "32 or 64 bits support. 64 by default",
+                    "length": 255,
+                    "name": "bits",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "Template details in key/value pairs.",
+                    "length": 255,
+                    "name": "details",
+                    "required": false,
+                    "type": "map"
+                },
+                {
+                    "description": "true if template contains XS/VMWare tools inorder to support dynamic scaling of VM cpu/memory",
+                    "length": 255,
+                    "name": "isdynamicallyscalable",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "the ID of the zone the volume/template is to be hosted on",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones,createZone",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "true if this template is a featured template, false otherwise",
+                    "length": 255,
+                    "name": "isfeatured",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if this template requires HVM",
+                    "length": 255,
+                    "name": "requireshvm",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "the format for the volume/template. Possible values include QCOW2, OVA, and VHD.",
+                    "length": 255,
+                    "name": "format",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the target hypervisor for the template",
+                    "length": 255,
+                    "name": "hypervisor",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "Upload volume/template for the project",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "suspendProject,activateProject",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "true if the template or its derivatives are extractable; default is false",
+                    "length": 255,
+                    "name": "isextractable",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "an optional accountName. Must be used with domainId.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the tag for this template.",
+                    "length": 255,
+                    "name": "templatetag",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "POST url to upload the file to",
+                    "name": "postURL",
+                    "type": "url"
+                },
+                {
+                    "description": "signature to be sent in the POST request.",
+                    "name": "signature",
+                    "type": "string"
+                },
+                {
+                    "description": "encrypted data to be sent in the POST request.",
+                    "name": "metadata",
+                    "type": "string"
+                },
+                {
+                    "description": "the template/volume ID",
+                    "name": "id",
+                    "type": "uuid"
+                },
+                {
+                    "description": "the timestamp after which the signature expires",
+                    "name": "expires",
+                    "type": "string"
+                }
+            ],
+            "since": "4.6.0"
+        },
+        {
+            "description": "Release the dedication for host",
+            "isasync": true,
+            "name": "releaseDedicatedHost",
+            "params": [
+                {
+                    "description": "the ID of the host",
+                    "length": 255,
+                    "name": "hostid",
+                    "related": "addBaremetalHost,reconnectHost",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "Accepts or declines project invitation",
+            "isasync": true,
+            "name": "updateProjectInvitation",
+            "params": [
+                {
+                    "description": "id of the project to join",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "suspendProject,activateProject",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list invitations for specified account; this parameter has to be specified with domainId",
+                    "length": 255,
+                    "name": "token",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "account that is joining the project",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "if true, accept the invitation, decline if false. True by default",
+                    "length": 255,
+                    "name": "accept",
+                    "required": false,
+                    "type": "boolean"
+                }
+            ],
+            "response": [
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                },
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                }
+            ],
+            "since": "3.0.0"
+        },
+        {
+            "description": "This is supposed to revert a volume snapshot. This command is only supported with KVM so far",
+            "isasync": true,
+            "name": "revertSnapshot",
+            "params": [
+                {
+                    "description": "The ID of the snapshot",
+                    "length": 255,
+                    "name": "id",
+                    "related": "revertSnapshot",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the state of the snapshot. BackedUp means that snapshot is ready to be used; Creating - the snapshot is being allocated on the primary storage; BackingUp - the snapshot is being backed up on secondary storage",
+                    "name": "state",
+                    "type": "state"
+                },
+                {
+                    "description": "the domain name of the snapshot's account",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the account associated with the snapshot",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the snapshot",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the snapshot",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "type of the disk volume",
+                    "name": "volumetype",
+                    "type": "string"
+                },
+                {
+                    "description": "valid types are hourly, daily, weekly, monthy, template, and none.",
+                    "name": "intervaltype",
+                    "type": "string"
+                },
+                {
+                    "description": "name of the snapshot",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "physical size of backedup snapshot on image store",
+                    "name": "physicalsize",
+                    "type": "long"
+                },
+                {
+                    "description": "ID of the disk volume",
+                    "name": "volumeid",
+                    "type": "string"
+                },
+                {
+                    "description": "  the date the snapshot was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "id of the availability zone",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain ID of the snapshot's account",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "ID of the snapshot",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the type of the snapshot",
+                    "name": "snapshottype",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of resource tags associated with snapshot",
+                    "name": "tags",
+                    "response": [
+                        {
+                            "description": "the account associated with the tag",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag value",
+                            "name": "value",
+                            "type": "string"
+                        },
+                        {
+                            "description": "customer associated with the tag",
+                            "name": "customer",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag key name",
+                            "name": "key",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project id the tag belongs to",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name where tag belongs to",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "resource type",
+                            "name": "resourcetype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "id of the resource",
+                            "name": "resourceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the domain associated with the tag",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain associated with the tag",
+                            "name": "domain",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "name of the disk volume",
+                    "name": "volumename",
+                    "type": "string"
+                },
+                {
+                    "description": "indicates whether the underlying storage supports reverting the volume to this snapshot",
+                    "name": "revertable",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "Lists Regions",
+            "isasync": false,
+            "name": "listRegions",
+            "params": [
+                {
+                    "description": "List Region by region ID.",
+                    "length": 255,
+                    "name": "id",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "List Region by region name.",
+                    "length": 255,
+                    "name": "name",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "addRegion",
+            "response": [
+                {
+                    "description": "true if security groups support is enabled, false otherwise",
+                    "name": "portableipserviceenabled",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the ID of the region",
+                    "name": "id",
+                    "type": "integer"
+                },
+                {
+                    "description": "the name of the region",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "true if GSLB service is enabled in the region, false otherwise",
+                    "name": "gslbserviceenabled",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the end point of the region",
+                    "name": "endpoint",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Configures an Internal Load Balancer element.",
+            "isasync": true,
+            "name": "configureInternalLoadBalancerElement",
+            "params": [
+                {
+                    "description": "Enables/Disables the Internal Load Balancer element",
+                    "length": 255,
+                    "name": "enabled",
+                    "required": true,
+                    "type": "boolean"
+                },
+                {
+                    "description": "the ID of the internal lb provider",
+                    "length": 255,
+                    "name": "id",
+                    "related": "configureInternalLoadBalancerElement",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the physical network service provider id of the element",
+                    "name": "nspid",
+                    "type": "string"
+                },
+                {
+                    "description": "Enabled/Disabled the element",
+                    "name": "enabled",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the id of the internal load balancer element",
+                    "name": "id",
+                    "type": "string"
+                }
+            ],
+            "since": "4.2.0"
+        },
+        {
+            "description": "Attempts Migration of a system virtual machine to the host specified.",
+            "isasync": true,
+            "name": "migrateSystemVm",
+            "params": [
+                {
+                    "description": "destination Host ID to migrate VM to",
+                    "length": 255,
+                    "name": "hostid",
+                    "related": "addBaremetalHost,reconnectHost",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the ID of the virtual machine",
+                    "length": 255,
+                    "name": "virtualmachineid",
+                    "related": "migrateSystemVm",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the ID of the system VM",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone name for the system VM",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the network domain for the system VM",
+                    "name": "networkdomain",
+                    "type": "string"
+                },
+                {
+                    "description": "the public IP address for the system VM",
+                    "name": "publicip",
+                    "type": "string"
+                },
+                {
+                    "description": "the first DNS for the system VM",
+                    "name": "dns1",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the system VM",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the link local MAC address for the system vm",
+                    "name": "linklocalmacaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the Pod ID for the system VM",
+                    "name": "podid",
+                    "type": "string"
+                },
+                {
+                    "description": "the public MAC address for the system VM",
+                    "name": "publicmacaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the template ID for the system VM",
+                    "name": "templateid",
+                    "type": "string"
+                },
+                {
+                    "description": "the job ID associated with the system VM. This is only displayed if the router listed is part of a currently running asynchronous job.",
+                    "name": "jobid",
+                    "type": "string"
+                },
+                {
+                    "description": "the private IP address for the system VM",
+                    "name": "privateip",
+                    "type": "string"
+                },
+                {
+                    "description": "the hostname for the system VM",
+                    "name": "hostname",
+                    "type": "string"
+                },
+                {
+                    "description": "the job status associated with the system VM.  This is only displayed if the router listed is part of a currently running asynchronous job.",
+                    "name": "jobstatus",
+                    "type": "integer"
+                },
+                {
+                    "description": "the private netmask for the system VM",
+                    "name": "privatenetmask",
+                    "type": "string"
+                },
+                {
+                    "description": "the number of active console sessions for the console proxy system vm",
+                    "name": "activeviewersessions",
+                    "type": "integer"
+                },
+                {
+                    "description": "the link local netmask for the system vm",
+                    "name": "linklocalnetmask",
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone ID for the system VM",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the host ID for the system VM",
+                    "name": "hostid",
+                    "type": "string"
+                },
+                {
+                    "description": "the system VM type",
+                    "name": "systemvmtype",
+                    "type": "string"
+                },
+                {
+                    "description": "the hypervisor on which the template runs",
+                    "name": "hypervisor",
+                    "type": "string"
+                },
+                {
+                    "description": "the private MAC address for the system VM",
+                    "name": "privatemacaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the date and time the system VM was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the state of the system VM",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the gateway for the system VM",
+                    "name": "gateway",
+                    "type": "string"
+                },
+                {
+                    "description": "the second DNS for the system VM",
+                    "name": "dns2",
+                    "type": "string"
+                },
+                {
+                    "description": "the public netmask for the system VM",
+                    "name": "publicnetmask",
+                    "type": "string"
+                },
+                {
+                    "description": "the link local IP address for the system vm",
+                    "name": "linklocalip",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "List the counters",
+            "isasync": false,
+            "name": "listCounters",
+            "params": [
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "Name of the counter.",
+                    "length": 255,
+                    "name": "name",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "ID of the Counter.",
+                    "length": 255,
+                    "name": "id",
+                    "related": "createCounter,listCounters",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "Source of the counter.",
+                    "length": 255,
+                    "name": "source",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "createCounter",
+            "response": [
+                {
+                    "description": "the id of the Counter",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "Value in case of snmp or other specific counters.",
+                    "name": "value",
+                    "type": "string"
+                },
+                {
+                    "description": "Source of the counter.",
+                    "name": "source",
+                    "type": "string"
+                },
+                {
+                    "description": "zone id of counter",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "Name of the counter.",
+                    "name": "name",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Lists all available virtual router elements.",
+            "isasync": false,
+            "name": "listVirtualRouterElements",
+            "params": [
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "list network offerings by enabled state",
+                    "length": 255,
+                    "name": "enabled",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "list virtual router elements by network service provider id",
+                    "length": 255,
+                    "name": "nspid",
+                    "related": "listNetworkServiceProviders",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "list virtual router elements by id",
+                    "length": 255,
+                    "name": "id",
+                    "related": "listVirtualRouterElements",
+                    "required": false,
+                    "type": "uuid"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the domain associated with the provider",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "Enabled/Disabled the service provider",
+                    "name": "enabled",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the project name of the address",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the ipaddress",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the id of the router",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the physical network service provider id of the provider",
+                    "name": "nspid",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain ID associated with the provider",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the account associated with the provider",
+                    "name": "account",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Deletes snapshot policies for the account.",
+            "isasync": false,
+            "name": "deleteSnapshotPolicies",
+            "params": [
+                {
+                    "description": "list of snapshots policy IDs separated by comma",
+                    "length": 255,
+                    "name": "ids",
+                    "related": "updateSnapshotPolicy",
+                    "required": false,
+                    "type": "list"
+                },
+                {
+                    "description": "the Id of the snapshot policy",
+                    "length": 255,
+                    "name": "id",
+                    "related": "updateSnapshotPolicy",
+                    "required": false,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "Lists implementors of implementor of a network traffic type or implementors of all network traffic types",
+            "isasync": false,
+            "name": "listTrafficTypeImplementors",
+            "params": [
+                {
+                    "description": "Optional. The network traffic type, if specified, return its implementor. Otherwise, return all traffic types with their implementor",
+                    "length": 255,
+                    "name": "traffictype",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "implementor of network traffic type",
+                    "name": "traffictypeimplementor",
+                    "type": "string"
+                },
+                {
+                    "description": "network traffic type",
+                    "name": "traffictype",
+                    "type": "string"
+                }
+            ],
+            "since": "3.0.0"
+        },
+        {
+            "description": "Deletes an image store or Secondary Storage.",
+            "isasync": false,
+            "name": "deleteImageStore",
+            "params": [
+                {
+                    "description": "The image store ID or Secondary Storage ID.",
+                    "length": 255,
+                    "name": "id",
+                    "related": "addImageStoreS3,listSwifts,listImageStores",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                },
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                }
+            ],
+            "since": "4.2.0"
+        },
+        {
+            "description": "Lists autoscale vm profiles.",
+            "isasync": false,
+            "name": "listAutoScaleVmProfiles",
+            "params": [
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.",
+                    "length": 255,
+                    "name": "isrecursive",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "availability zone for the auto deployed virtual machine",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones,createZone",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "uuid"
+                },
+                {
+                    "description": "list resources by account. Must be used with the domainId parameter.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "list only resources belonging to the domain specified",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list objects by project",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "suspendProject,activateProject",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the ID of the autoscale vm profile",
+                    "length": 255,
+                    "name": "id",
+                    "related": "listAutoScaleVmProfiles,createAutoScaleVmProfile",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the templateid of the autoscale vm profile",
+                    "length": 255,
+                    "name": "templateid",
+                    "related": "registerTemplate,copyTemplate,registerTemplate,listTemplates,registerIso,listIsos,createTemplate,copyIso",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list profiles by service offering id",
+                    "length": 255,
+                    "name": "serviceofferingid",
+                    "related": "updateServiceOffering,listServiceOfferings",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "uuid"
+                },
+                {
+                    "description": "If set to false, list only resources belonging to the command's caller; if set to true - list resources that the caller is authorized to see. Default value is false",
+                    "length": 255,
+                    "name": "listall",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "list resources by display flag; only ROOT admin is eligible to pass this parameter",
+                    "length": 255,
+                    "name": "fordisplay",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the otherdeployparameters of the autoscale vm profile",
+                    "length": 255,
+                    "name": "otherdeployparams",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "createAutoScaleVmProfile",
+            "response": [
+                {
+                    "description": "the account owning the instance group",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+
+                },
+                {
+                    "description": "parameters other than zoneId/serviceOfferringId/templateId to be used while deploying a virtual machine",
+                    "name": "otherdeployparams",
+                    "type": "string"
+                },
+                {
+                    "description": "the time allowed for existing connections to get closed before a vm is destroyed",
+                    "name": "destroyvmgraceperiod",
+                    "type": "integer"
+                },
+                {
+                    "description": "the service offering to be used while deploying a virtual machine",
+                    "name": "serviceofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "the availability zone to be used while deploying a virtual machine",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the user used to launch and destroy the VMs",
+                    "name": "autoscaleuserid",
+                    "type": "string"
+                },
+                {
+                    "description": "the template to be used while deploying a virtual machine",
+                    "name": "templateid",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the vm profile",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain ID of the vm profile",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the autoscale vm profile ID",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain name of the vm profile",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id vm profile",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "is profile for display to the regular user",
+                    "name": "fordisplay",
+                    "type": "boolean"
+                },
+                {
+
+                }
+            ]
+        },
+        {
+            "description": "Disables out-of-band management for a host",
+            "isasync": true,
+            "name": "disableOutOfBandManagementForHost",
+            "params": [
+                {
+                    "description": "the ID of the host",
+                    "length": 255,
+                    "name": "hostid",
+                    "related": "addBaremetalHost,reconnectHost",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "disableOutOfBandManagementForCluster,enableOutOfBandManagementForHost",
+            "response": [
+                {
+                    "description": "the ID of the host",
+                    "name": "hostid",
+                    "type": "string"
+                },
+                {
+                    "description": "the out-of-band management interface powerState of the host",
+                    "name": "powerstate",
+                    "type": "powerstate"
+                },
+                {
+                    "description": "the out-of-band management interface username",
+                    "name": "username",
+                    "type": "string"
+                },
+                {
+                    "description": "the out-of-band management interface password",
+                    "name": "password",
+                    "type": "string"
+                },
+                {
+                    "description": "the operation result",
+                    "name": "status",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the operation result description",
+                    "name": "description",
+                    "type": "string"
+                },
+                {
+                    "description": "the out-of-band management interface address",
+                    "name": "address",
+                    "type": "string"
+                },
+                {
+                    "description": "the out-of-band management interface port",
+                    "name": "port",
+                    "type": "string"
+                },
+                {
+                    "description": "the out-of-band management driver for the host",
+                    "name": "driver",
+                    "type": "string"
+                },
+                {
+                    "description": "the out-of-band management action (if issued)",
+                    "name": "action",
+                    "type": "string"
+                },
+                {
+                    "description": "true if out-of-band management is enabled for the host",
+                    "name": "enabled",
+                    "type": "boolean"
+                }
+            ],
+            "since": "4.9.0"
+        },
+        {
+            "description": "Authorizes a particular ingress rule for this security group",
+            "isasync": true,
+            "name": "authorizeSecurityGroupIngress",
+            "params": [
+                {
+                    "description": "TCP is default. UDP is the other supported protocol",
+                    "length": 255,
+                    "name": "protocol",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "The name of the security group. Mutually exclusive with securityGroupId parameter",
+                    "length": 255,
+                    "name": "securitygroupname",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the cidr list associated",
+                    "length": 255,
+                    "name": "cidrlist",
+                    "required": false,
+                    "type": "list"
+                },
+                {
+                    "description": "error code for this icmp message",
+                    "length": 255,
+                    "name": "icmpcode",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "start port for this ingress rule",
+                    "length": 255,
+                    "name": "startport",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "end port for this ingress rule",
+                    "length": 255,
+                    "name": "endport",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "an optional domainId for the security group. If the account parameter is used, domainId must also be used.",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "an optional account for the security group. Must be used with domainId.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "The ID of the security group. Mutually exclusive with securityGroupName parameter",
+                    "length": 255,
+                    "name": "securitygroupid",
+                    "related": "createSecurityGroup",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "type of the icmp message being sent",
+                    "length": 255,
+                    "name": "icmptype",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "user to security group mapping",
+                    "length": 255,
+                    "name": "usersecuritygrouplist",
+                    "required": false,
+                    "type": "map"
+                },
+                {
+                    "description": "an optional project of the security group",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "suspendProject,activateProject",
+                    "required": false,
+                    "type": "uuid"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the list of resource tags associated with the rule",
+                    "name": "tags",
+                    "response": [
+                        {
+                            "description": "resource type",
+                            "name": "resourcetype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag value",
+                            "name": "value",
+                            "type": "string"
+                        },
+                        {
+                            "description": "customer associated with the tag",
+                            "name": "customer",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project id the tag belongs to",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain associated with the tag",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag key name",
+                            "name": "key",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account associated with the tag",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the domain associated with the tag",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name where tag belongs to",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "id of the resource",
+                            "name": "resourceid",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "the protocol of the security group rule",
+                    "name": "protocol",
+                    "type": "string"
+                },
+                {
+                    "description": "the type of the ICMP message response",
+                    "name": "icmptype",
+                    "type": "integer"
+                },
+                {
+                    "description": "the starting IP of the security group rule",
+                    "name": "startport",
+                    "type": "integer"
+                },
+                {
+                    "description": "security group name",
+                    "name": "securitygroupname",
+                    "type": "string"
+                },
+                {
+                    "description": "account owning the security group rule",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the code for the ICMP message response",
+                    "name": "icmpcode",
+                    "type": "integer"
+                },
+                {
+                    "description": "the ending IP of the security group rule ",
+                    "name": "endport",
+                    "type": "integer"
+                },
+                {
+                    "description": "the CIDR notation for the base IP address of the security group rule",
+                    "name": "cidr",
+                    "type": "string"
+                },
+                {
+                    "description": "the id of the security group rule",
+                    "name": "ruleid",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Creates a security group",
+            "isasync": false,
+            "name": "createSecurityGroup",
+            "params": [
+                {
+                    "description": "name of the security group",
+                    "length": 255,
+                    "name": "name",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "an optional account for the security group. Must be used with domainId.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "an optional domainId for the security group. If the account parameter is used, domainId must also be used.",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the description of the security group",
+                    "length": 255,
+                    "name": "description",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "Create security group for project",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "suspendProject,activateProject",
+                    "required": false,
+                    "type": "uuid"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the project id of the group",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the security group",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain name of the security group",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of ingress rules associated with the security group",
+                    "name": "ingressrule",
+                    "response": [
+                        {
+                            "description": "the protocol of the security group rule",
+                            "name": "protocol",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of resource tags associated with the rule",
+                            "name": "tags",
+                            "response": [
+                                {
+                                    "description": "id of the resource",
+                                    "name": "resourceid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the project name where tag belongs to",
+                                    "name": "project",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "resource type",
+                                    "name": "resourcetype",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the account associated with the tag",
+                                    "name": "account",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the domain associated with the tag",
+                                    "name": "domain",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "customer associated with the tag",
+                                    "name": "customer",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the ID of the domain associated with the tag",
+                                    "name": "domainid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "tag key name",
+                                    "name": "key",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "tag value",
+                                    "name": "value",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the project id the tag belongs to",
+                                    "name": "projectid",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "set"
+                        },
+                        {
+                            "description": "the code for the ICMP message response",
+                            "name": "icmpcode",
+                            "type": "integer"
+                        },
+                        {
+                            "description": "account owning the security group rule",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the CIDR notation for the base IP address of the security group rule",
+                            "name": "cidr",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the id of the security group rule",
+                            "name": "ruleid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the starting IP of the security group rule",
+                            "name": "startport",
+                            "type": "integer"
+                        },
+                        {
+                            "description": "the ending IP of the security group rule ",
+                            "name": "endport",
+                            "type": "integer"
+                        },
+                        {
+                            "description": "the type of the ICMP message response",
+                            "name": "icmptype",
+                            "type": "integer"
+                        },
+                        {
+                            "description": "security group name",
+                            "name": "securitygroupname",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "the domain ID of the security group",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of egress rules associated with the security group",
+                    "name": "egressrule",
+                    "response": [
+                        {
+                            "description": "the CIDR notation for the base IP address of the security group rule",
+                            "name": "cidr",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the protocol of the security group rule",
+                            "name": "protocol",
+                            "type": "string"
+                        },
+                        {
+                            "description": "account owning the security group rule",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the id of the security group rule",
+                            "name": "ruleid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of resource tags associated with the rule",
+                            "name": "tags",
+                            "response": [
+                                {
+                                    "description": "tag key name",
+                                    "name": "key",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the ID of the domain associated with the tag",
+                                    "name": "domainid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "resource type",
+                                    "name": "resourcetype",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "id of the resource",
+                                    "name": "resourceid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the domain associated with the tag",
+                                    "name": "domain",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "tag value",
+                                    "name": "value",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the account associated with the tag",
+                                    "name": "account",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the project id the tag belongs to",
+                                    "name": "projectid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the project name where tag belongs to",
+                                    "name": "project",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "customer associated with the tag",
+                                    "name": "customer",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "set"
+                        },
+                        {
+                            "description": "the starting IP of the security group rule",
+                            "name": "startport",
+                            "type": "integer"
+                        },
+                        {
+                            "description": "security group name",
+                            "name": "securitygroupname",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the type of the ICMP message response",
+                            "name": "icmptype",
+                            "type": "integer"
+                        },
+                        {
+                            "description": "the code for the ICMP message response",
+                            "name": "icmpcode",
+                            "type": "integer"
+                        },
+                        {
+                            "description": "the ending IP of the security group rule ",
+                            "name": "endport",
+                            "type": "integer"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "the name of the security group",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the description of the security group",
+                    "name": "description",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of virtualmachine ids associated with this securitygroup",
+                    "name": "virtualmachineids",
+                    "type": "set"
+                },
+                {
+                    "description": "the project name of the group",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the number of virtualmachines associated with this securitygroup",
+                    "name": "virtualmachinecount",
+                    "type": "integer"
+                },
+                {
+                    "description": "the account owning the security group",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of resource tags associated with the rule",
+                    "name": "tags",
+                    "response": [
+                        {
+                            "description": "the project name where tag belongs to",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project id the tag belongs to",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "resource type",
+                            "name": "resourcetype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "id of the resource",
+                            "name": "resourceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account associated with the tag",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag value",
+                            "name": "value",
+                            "type": "string"
+                        },
+                        {
+                            "description": "customer associated with the tag",
+                            "name": "customer",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag key name",
+                            "name": "key",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the domain associated with the tag",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain associated with the tag",
+                            "name": "domain",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "set"
+                }
+            ]
+        },
+        {
+            "description": "Recalculate and update resource count for an account or domain.",
+            "isasync": false,
+            "name": "updateResourceCount",
+            "params": [
+                {
+                    "description": "Update resource count for a specified account. Must be used with the domainId parameter.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "If account parameter specified then updates resource counts for a specified account in this domain else update resource counts for all accounts & child domains in specified domain.",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "listDomainChildren,listDomains",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "Type of resource to update. If specifies valid values are 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 and 11. If not specified will update all resource counts0 - Instance. Number of instances a user can create. 1 - IP. Number of public IP addresses a user can own. 2 - Volume. Number of disk volumes a user can create. 3 - Snapshot. Number of snapshots a user can create. 4 - Template. Number of templates that a user can register/create. 5 - Project. Number of projects that a user can create. 6 - Network. Number of guest network a user can create. 7 - VPC. Number of VPC a user can create. 8 - CPU. Total number of CPU cores a user can use. 9 - Memory. Total Memory (in MB) a user can use. 10 - PrimaryStorage. Total primary storage space (in GiB) a user can use. 11 - SecondaryStorage. Total secondary storage space (in GiB) a user can use. ",
+                    "length": 255,
+                    "name": "resourcetype",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "Update resource limits for project",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "suspendProject,activateProject",
+                    "required": false,
+                    "type": "uuid"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "resource count",
+                    "name": "resourcecount",
+                    "type": "long"
+                },
+                {
+                    "description": "the account for which resource count's are updated",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "resource type. Values include 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11. See the resourceType parameter for more information on these values.",
+                    "name": "resourcetype",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain name for which resource count's are updated",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain ID for which resource count's are updated",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id for which resource count's are updated",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name for which resource count's are updated",
+                    "name": "project",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Lists site 2 site vpn gateways",
+            "isasync": false,
+            "name": "listVpnGateways",
+            "params": [
+                {
+                    "description": "list objects by project",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "suspendProject,activateProject",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "id of the vpn gateway",
+                    "length": 255,
+                    "name": "id",
+                    "related": "listVpnGateways,createVpnGateway",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.",
+                    "length": 255,
+                    "name": "isrecursive",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "If set to false, list only resources belonging to the command's caller; if set to true - list resources that the caller is authorized to see. Default value is false",
+                    "length": 255,
+                    "name": "listall",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "id of vpc",
+                    "length": 255,
+                    "name": "vpcid",
+                    "related": "updateVPC,listVPCs,createVPC",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "list resources by display flag; only ROOT admin is eligible to pass this parameter",
+                    "length": 255,
+                    "name": "fordisplay",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "boolean"
+                },
+                {
+                    "description": "list only resources belonging to the domain specified",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "list resources by account. Must be used with the domainId parameter.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "createVpnGateway",
+            "response": [
+                {
+                    "description": "the date and time the host was removed",
+                    "name": "removed",
+                    "type": "date"
+                },
+                {
+                    "description": "the owner",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain id of the owner",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the vpn gateway ID",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the vpc id of this gateway",
+                    "name": "vpcid",
+                    "type": "string"
+                },
+                {
+                    "description": "is vpn gateway for display to the regular user",
+                    "name": "fordisplay",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the public IP address",
+                    "name": "publicip",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain name of the owner",
+                    "name": "domain",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Lists dynamic roles in CloudStack",
+            "isasync": false,
+            "name": "listRoles",
+            "params": [
+                {
+                    "description": "List role by role type, valid options are: Admin, ResourceAdmin, DomainAdmin, User.",
+                    "length": 255,
+                    "name": "type",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "List role by role ID.",
+                    "length": 255,
+                    "name": "id",
+                    "related": "listRoles",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "List role by role name.",
+                    "length": 255,
+                    "name": "name",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the description of the role",
+                    "name": "description",
+                    "type": "string"
+                },
+                {
+                    "description": "the type of the role",
+                    "name": "type",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the role",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the role",
+                    "name": "id",
+                    "type": "string"
+                }
+            ],
+            "since": "4.9.0"
+        },
+        {
+            "description": "Retrieves a cloud identifier.",
+            "isasync": false,
+            "name": "getCloudIdentifier",
+            "params": [
+                {
+                    "description": "the user ID for the cloud identifier",
+                    "length": 255,
+                    "name": "userid",
+                    "related": "enableUser,getUser,createUser",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the user ID for the cloud identifier",
+                    "name": "userid",
+                    "type": "string"
+                },
+                {
+                    "description": "the cloud identifier",
+                    "name": "cloudidentifier",
+                    "type": "string"
+                },
+                {
+                    "description": "the signed response for the cloud identifier",
+                    "name": "signature",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Creates a load balancer stickiness policy ",
+            "isasync": true,
+            "name": "createLBStickinessPolicy",
+            "params": [
+                {
+                    "description": "an optional field, whether to the display the rule to the end user or not",
+                    "length": 255,
+                    "name": "fordisplay",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "boolean"
+                },
+                {
+                    "description": "name of the load balancer stickiness policy method, possible values can be obtained from listNetworks API",
+                    "length": 255,
+                    "name": "methodname",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the load balancer rule",
+                    "length": 255,
+                    "name": "lbruleid",
+                    "related": "",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "name of the load balancer stickiness policy",
+                    "length": 255,
+                    "name": "name",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "param list. Example: param[0].name=cookiename&param[0].value=LBCookie ",
+                    "length": 255,
+                    "name": "param",
+                    "required": false,
+                    "type": "map"
+                },
+                {
+                    "description": "the description of the load balancer stickiness policy",
+                    "length": 255,
+                    "name": "description",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "listLBStickinessPolicies",
+            "response": [
+                {
+                    "description": "the domain of the Stickiness policy",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the Stickiness policy",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the id of the zone the Stickiness policy belongs to",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the account of the Stickiness policy",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the description of the Stickiness policy",
+                    "name": "description",
+                    "type": "string"
+                },
+                {
+                    "description": "the LB rule ID",
+                    "name": "lbruleid",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain ID of the Stickiness policy",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of the policy",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of stickinesspolicies",
+                    "name": "stickinesspolicy",
+                    "response": [
+                        {
+                            "description": "the LB Stickiness policy ID",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the name of the Stickiness policy",
+                            "name": "name",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the method name of the Stickiness policy",
+                            "name": "methodname",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the state of the policy",
+                            "name": "state",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the params of the policy",
+                            "name": "params",
+                            "type": "map"
+                        },
+                        {
+                            "description": "the description of the Stickiness policy",
+                            "name": "description",
+                            "type": "string"
+                        },
+                        {
+                            "description": "is policy for display to the regular user",
+                            "name": "fordisplay",
+                            "type": "boolean"
+                        }
+                    ],
+                    "type": "list"
+                }
+            ],
+            "since": "3.0.0"
+        },
+        {
+            "description": "Configures a Palo Alto firewall device",
+            "isasync": true,
+            "name": "configurePaloAltoFirewall",
+            "params": [
+                {
+                    "description": "capacity of the firewall device, Capacity will be interpreted as number of networks device can handle",
+                    "length": 255,
+                    "name": "fwdevicecapacity",
+                    "required": false,
+                    "type": "long"
+                },
+                {
+                    "description": "Palo Alto firewall device ID",
+                    "length": 255,
+                    "name": "fwdeviceid",
+                    "related": "configurePaloAltoFirewall,listPaloAltoFirewalls,addPaloAltoFirewall",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "listPaloAltoFirewalls,addPaloAltoFirewall",
+            "response": [
+                {
+                    "description": "the zone ID of the external firewall",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the username that's used to log in to the external firewall",
+                    "name": "username",
+                    "type": "string"
+                },
+                {
+                    "description": "device state",
+                    "name": "fwdevicestate",
+                    "type": "string"
+                },
+                {
+                    "description": "device capacity",
+                    "name": "fwdevicecapacity",
+                    "type": "long"
+                },
+                {
+                    "description": "the private security zone of the external firewall",
+                    "name": "privatezone",
+                    "type": "string"
+                },
+                {
+                    "description": "name of the provider",
+                    "name": "provider",
+                    "type": "string"
+                },
+                {
+                    "description": "the management IP address of the external firewall",
+                    "name": "ipaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "device id of the Palo Alto firewall",
+                    "name": "fwdeviceid",
+                    "type": "string"
+                },
+                {
+                    "description": "the number of times to retry requests to the external firewall",
+                    "name": "numretries",
+                    "type": "string"
+                },
+                {
+                    "description": "the physical network to which this Palo Alto firewall belongs to",
+                    "name": "physicalnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "the private interface of the external firewall",
+                    "name": "privateinterface",
+                    "type": "string"
+                },
+                {
+                    "description": "the usage interface of the external firewall",
+                    "name": "usageinterface",
+                    "type": "string"
+                },
+                {
+                    "description": "the public security zone of the external firewall",
+                    "name": "publiczone",
+                    "type": "string"
+                },
+                {
+                    "description": "the timeout (in seconds) for requests to the external firewall",
+                    "name": "timeout",
+                    "type": "string"
+                },
+                {
+                    "description": "device name",
+                    "name": "fwdevicename",
+                    "type": "string"
+                },
+                {
+                    "description": "the public interface of the external firewall",
+                    "name": "publicinterface",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Adds a Cisco Asa 1000v appliance",
+            "isasync": false,
+            "name": "addCiscoAsa1000vResource",
+            "params": [
+                {
+                    "description": "the Physical Network ID",
+                    "length": 255,
+                    "name": "physicalnetworkid",
+                    "related": "createPhysicalNetwork",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "Hostname or ip address of the Cisco ASA 1000v appliance.",
+                    "length": 255,
+                    "name": "hostname",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "Nexus port profile associated with inside interface of ASA 1000v",
+                    "length": 255,
+                    "name": "insideportprofile",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the Cluster ID",
+                    "length": 255,
+                    "name": "clusterid",
+                    "related": "addCluster",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+
+                },
+                {
+
+                },
+                {
+
+                },
+                {
+
+                },
+                {
+
+                }
+            ]
+        },
+        {
+            "description": "Updates ACL item with specified ID",
+            "isasync": true,
+            "name": "updateNetworkACLItem",
+            "params": [
+                {
+                    "description": "error code for this ICMP message",
+                    "length": 255,
+                    "name": "icmpcode",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "an optional field, whether to the display the rule to the end user or not",
+                    "length": 255,
+                    "name": "fordisplay",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the protocol for the ACL rule. Valid values are TCP/UDP/ICMP/ALL or valid protocol number",
+                    "length": 255,
+                    "name": "protocol",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the starting port of ACL",
+                    "length": 255,
+                    "name": "startport",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "the ending port of ACL",
+                    "length": 255,
+                    "name": "endport",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "an optional field, in case you want to set a custom id to the resource. Allowed to Root Admins only",
+                    "length": 255,
+                    "name": "customid",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "string"
+                },
+                {
+                    "description": "The network of the vm the ACL will be created for",
+                    "length": 255,
+                    "name": "number",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "the ID of the network ACL item",
+                    "length": 255,
+                    "name": "id",
+                    "related": "updateNetworkACLItem",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the cidr list to allow traffic from/to",
+                    "length": 255,
+                    "name": "cidrlist",
+                    "required": false,
+                    "type": "list"
+                },
+                {
+                    "description": "type of the ICMP message being sent",
+                    "length": 255,
+                    "name": "icmptype",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "the traffic type for the ACL,can be Ingress or Egress, defaulted to Ingress if not specified",
+                    "length": 255,
+                    "name": "traffictype",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "scl entry action, allow or deny",
+                    "length": 255,
+                    "name": "action",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the ID of the ACL this item belongs to",
+                    "name": "aclid",
+                    "type": "string"
+                },
+                {
+                    "description": "is rule for display to the regular user",
+                    "name": "fordisplay",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the cidr list to forward traffic from",
+                    "name": "cidrlist",
+                    "type": "string"
+                },
+                {
+                    "description": "error code for this icmp message",
+                    "name": "icmpcode",
+                    "type": "integer"
+                },
+                {
+                    "description": "the ID of the ACL Item",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of resource tags associated with the network ACLs",
+                    "name": "tags",
+                    "response": [
+                        {
+                            "description": "the account associated with the tag",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "customer associated with the tag",
+                            "name": "customer",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project id the tag belongs to",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "id of the resource",
+                            "name": "resourceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain associated with the tag",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name where tag belongs to",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "resource type",
+                            "name": "resourcetype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag key name",
+                            "name": "key",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag value",
+                            "name": "value",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the domain associated with the tag",
+                            "name": "domainid",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "the starting port of ACL's port range",
+                    "name": "startport",
+                    "type": "string"
+                },
+                {
+                    "description": "the traffic type for the ACL",
+                    "name": "traffictype",
+                    "type": "string"
+                },
+                {
+                    "description": "type of the icmp message being sent",
+                    "name": "icmptype",
+                    "type": "integer"
+                },
+                {
+                    "description": "Number of the ACL Item",
+                    "name": "number",
+                    "type": "integer"
+                },
+                {
+                    "description": "Action of ACL Item. Allow/Deny",
+                    "name": "action",
+                    "type": "string"
+                },
+                {
+                    "description": "the ending port of ACL's port range",
+                    "name": "endport",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of the rule",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the protocol of the ACL",
+                    "name": "protocol",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "List routers.",
+            "isasync": false,
+            "name": "listRouters",
+            "params": [
+                {
+                    "description": "the Zone ID of the router",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones,createZone",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list only resources belonging to the domain specified",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.",
+                    "length": 255,
+                    "name": "isrecursive",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "list objects by project",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "suspendProject,activateProject",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the Pod ID of the router",
+                    "length": 255,
+                    "name": "podid",
+                    "related": "updatePod",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the state of the router",
+                    "length": 255,
+                    "name": "state",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "If set to false, list only resources belonging to the command's caller; if set to true - list resources that the caller is authorized to see. Default value is false",
+                    "length": 255,
+                    "name": "listall",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "the ID of the disk router",
+                    "length": 255,
+                    "name": "id",
+                    "related": "resetSSHKeyForVirtualMachine,attachIso,removeNicFromVirtualMachine,updateVMAffinityGroup,rebootVirtualMachine,restoreVirtualMachine,destroyVirtualMachine,stopVirtualMachine,detachIso,deployVirtualMachine,updateVirtualMachine,revertToVMSnapshot,resetPasswordForVirtualMachine,startVirtualMachine,updateDefaultNicForVirtualMachine,startVirtualMachine,attachIso,listVirtualMachines,addNicToVirtualMachine,stopVirtualMachine,destroyVirtualMachine,removeNicFromVirtualMachine,changeServiceForVirtualMachine",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "the name of the router",
+                    "length": 255,
+                    "name": "name",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the host ID of the router",
+                    "length": 255,
+                    "name": "hostid",
+                    "related": "addBaremetalHost,reconnectHost",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "if true is passed for this parameter, list only VPC routers",
+                    "length": 255,
+                    "name": "forvpc",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "list virtual router elements by version",
+                    "length": 255,
+                    "name": "version",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "List networks by VPC",
+                    "length": 255,
+                    "name": "vpcid",
+                    "related": "updateVPC,listVPCs,createVPC",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list by network id",
+                    "length": 255,
+                    "name": "networkid",
+                    "related": "updateNetwork,listBrocadeVcsDeviceNetworks,createNetwork,listNetworks,listF5LoadBalancerNetworks",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the cluster ID of the router",
+                    "length": 255,
+                    "name": "clusterid",
+                    "related": "addCluster",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list resources by account. Must be used with the domainId parameter.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                }
+            ],
+            "related": "destroyRouter",
+            "response": [
+                {
+                    "description": "the guest netmask for the router",
+                    "name": "guestnetmask",
+                    "type": "string"
+                },
+                {
+                    "description": "the account associated with the router",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain ID associated with the router",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the second IPv6 DNS for the router",
+                    "name": "ip6dns2",
+                    "type": "string"
+                },
+                {
+                    "description": "the network domain for the router",
+                    "name": "networkdomain",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of nics associated with the router",
+                    "name": "nic",
+                    "response": [
+                        {
+                            "description": "the Secondary ipv4 addr of nic",
+                            "name": "secondaryip",
+                            "type": "list"
+                        },
+                        {
+                            "description": "the IPv6 address of network",
+                            "name": "ip6address",
+                            "type": "string"
+                        },
+                        {
+                            "description": "device id for the network when plugged into the virtual machine",
+                            "name": "deviceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if nic is default, false otherwise",
+                            "name": "isdefault",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "the gateway of the nic",
+                            "name": "gateway",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the cidr of IPv6 network",
+                            "name": "ip6cidr",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the corresponding network",
+                            "name": "networkid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the traffic type of the nic",
+                            "name": "traffictype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the netmask of the nic",
+                            "name": "netmask",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the isolation uri of the nic",
+                            "name": "isolationuri",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the NSX Logical Switch (if NSX based), null otherwise",
+                            "name": "nsxlogicalswitch",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the nic",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if nic is default, false otherwise",
+                            "name": "macaddress",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the vm to which the nic belongs",
+                            "name": "virtualmachineid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the gateway of IPv6 network",
+                            "name": "ip6gateway",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ip address of the nic",
+                            "name": "ipaddress",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the name of the corresponding network",
+                            "name": "networkname",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the broadcast uri of the nic",
+                            "name": "broadcasturi",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the NSX Logical Switch Port (if NSX based), null otherwise",
+                            "name": "nsxlogicalswitchport",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the type of the nic",
+                            "name": "type",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "the ID of the corresponding link local network",
+                    "name": "linklocalnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "if this router is an redundant virtual router",
+                    "name": "isredundantrouter",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the link local MAC address for the router",
+                    "name": "linklocalmacaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the guest MAC address for the router",
+                    "name": "guestmacaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "true if the router template requires upgrader",
+                    "name": "requiresupgrade",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the version of template",
+                    "name": "version",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of VPC the router belongs to",
+                    "name": "vpcname",
+                    "type": "string"
+                },
+                {
+                    "description": "the gateway for the router",
+                    "name": "gateway",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the address",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone ID for the router",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the version of scripts",
+                    "name": "scriptsversion",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the ipaddress",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the hypervisor on which the template runs",
+                    "name": "hypervisor",
+                    "type": "string"
+                },
+                {
+                    "description": "the public IP address for the router",
+                    "name": "publicip",
+                    "type": "string"
+                },
+                {
+                    "description": "the host ID for the router",
+                    "name": "hostid",
+                    "type": "string"
+                },
+                {
+                    "description": "the public MAC address for the router",
+                    "name": "publicmacaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the corresponding public network",
+                    "name": "publicnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain associated with the router",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the link local IP address for the router",
+                    "name": "linklocalip",
+                    "type": "string"
+                },
+                {
+                    "description": "the link local netmask for the router",
+                    "name": "linklocalnetmask",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of redundant virtual router",
+                    "name": "redundantstate",
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone name for the router",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the id of the router",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the guest IP address for the router",
+                    "name": "guestipaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the service offering of the virtual machine",
+                    "name": "serviceofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the router",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the corresponding guest network",
+                    "name": "guestnetworkname",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of the router",
+                    "name": "state",
+                    "type": "state"
+                },
+                {
+                    "description": "the Pod ID for the router",
+                    "name": "podid",
+                    "type": "string"
+                },
+                {
+                    "description": "the hostname for the router",
+                    "name": "hostname",
+                    "type": "string"
+                },
+                {
+                    "description": "the first DNS for the router",
+                    "name": "dns1",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the corresponding guest network",
+                    "name": "guestnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "the date and time the router was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "role of the domain router",
+                    "name": "role",
+                    "type": "string"
+                },
+                {
+                    "description": "the template ID for the router",
+                    "name": "templateid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the service offering of the virtual machine",
+                    "name": "serviceofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "the first IPv6 DNS for the router",
+                    "name": "ip6dns1",
+                    "type": "string"
+                },
+                {
+                    "description": "VPC the router belongs to",
+                    "name": "vpcid",
+                    "type": "string"
+                },
+                {
+                    "description": "the second DNS for the router",
+                    "name": "dns2",
+                    "type": "string"
+                },
+                {
+                    "description": "the public netmask for the router",
+                    "name": "publicnetmask",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Releases host reservation.",
+            "isasync": true,
+            "name": "releaseHostReservation",
+            "params": [
+                {
+                    "description": "the host ID",
+                    "length": 255,
+                    "name": "id",
+                    "related": "addBaremetalHost,reconnectHost",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                },
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Create site to site vpn connection",
+            "isasync": true,
+            "name": "createVpnConnection",
+            "params": [
+                {
+                    "description": "id of the customer gateway",
+                    "length": 255,
+                    "name": "s2scustomergatewayid",
+                    "related": "createVpnCustomerGateway",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "an optional field, whether to the display the vpn to the end user or not",
+                    "length": 255,
+                    "name": "fordisplay",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "boolean"
+                },
+                {
+                    "description": "id of the vpn gateway",
+                    "length": 255,
+                    "name": "s2svpngatewayid",
+                    "related": "createVpnGateway",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "connection is passive or not",
+                    "length": 255,
+                    "name": "passive",
+                    "required": false,
+                    "type": "boolean"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "if DPD is enabled for customer gateway",
+                    "name": "dpd",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the connection ID",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the owner",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "State of vpn connection",
+                    "name": "passive",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the date and time the host was removed",
+                    "name": "removed",
+                    "type": "date"
+                },
+                {
+                    "description": "the public IP address",
+                    "name": "publicip",
+                    "type": "string"
+                },
+                {
+                    "description": "the customer gateway ID",
+                    "name": "s2scustomergatewayid",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "is connection for display to the regular user",
+                    "name": "fordisplay",
+                    "type": "boolean"
+                },
+                {
+                    "description": "guest cidr list of the customer gateway",
+                    "name": "cidrlist",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "Lifetime of IKE SA of customer gateway",
+                    "name": "ikelifetime",
+                    "type": "long"
+                },
+                {
+                    "description": "IKE policy of the customer gateway",
+                    "name": "ikepolicy",
+                    "type": "string"
+                },
+                {
+                    "description": "public ip address id of the customer gateway",
+                    "name": "gateway",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain id of the owner",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain name of the owner",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "Lifetime of ESP SA of customer gateway",
+                    "name": "esplifetime",
+                    "type": "long"
+                },
+                {
+                    "description": "the vpn gateway ID",
+                    "name": "s2svpngatewayid",
+                    "type": "string"
+                },
+                {
+                    "description": "the date and time the host was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "if Force NAT Encapsulation is enabled for customer gateway",
+                    "name": "forceencap",
+                    "type": "boolean"
+                },
+                {
+                    "description": "IPsec Preshared-Key of the customer gateway",
+                    "name": "ipsecpsk",
+                    "type": "string"
+                },
+                {
+                    "description": "ESP policy of the customer gateway",
+                    "name": "esppolicy",
+                    "type": "string"
+                },
+                {
+                    "description": "State of vpn connection",
+                    "name": "state",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "lists network that are using a brocade vcs switch",
+            "isasync": false,
+            "name": "listBrocadeVcsDeviceNetworks",
+            "params": [
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "brocade vcs switch ID",
+                    "length": 255,
+                    "name": "vcsdeviceid",
+                    "related": "",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "updateNetwork,createNetwork,listNetworks,listF5LoadBalancerNetworks",
+            "response": [
+                {
+                    "description": "the domain name of the network owner",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "true if network is system, false otherwise",
+                    "name": "issystem",
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if network can span multiple zones",
+                    "name": "strechedl2subnet",
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if users from subdomains can access the domain level network",
+                    "name": "subdomainaccess",
+                    "type": "boolean"
+                },
+                {
+                    "description": "zone id of the network",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the first DNS for the network",
+                    "name": "dns1",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the ipaddress",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the network's gateway",
+                    "name": "gateway",
+                    "type": "string"
+                },
+                {
+                    "description": "ACL Id associated with the VPC network",
+                    "name": "aclid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the network",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the zone the network belongs to",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the owner of the network",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "name of the network offering the network is created from",
+                    "name": "networkofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "list networks that are persistent",
+                    "name": "ispersistent",
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if network offering is ip conserve mode enabled",
+                    "name": "networkofferingconservemode",
+                    "type": "boolean"
+                },
+                {
+                    "description": "The vlan of the network. This parameter is visible to ROOT admins only",
+                    "name": "vlan",
+                    "type": "string"
+                },
+                {
+                    "description": "Broadcast domain type of the network",
+                    "name": "broadcastdomaintype",
+                    "type": "string"
+                },
+                {
+                    "description": "the network CIDR of the guest network configured with IP reservation. It is the summation of CIDR and RESERVED_IP_RANGE",
+                    "name": "networkcidr",
+                    "type": "string"
+                },
+                {
+                    "description": "network offering id the network is created from",
+                    "name": "networkofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "the type of the network",
+                    "name": "type",
+                    "type": "string"
+                },
+                {
+                    "description": "true network requires restart",
+                    "name": "restartrequired",
+                    "type": "boolean"
+                },
+                {
+                    "description": "an optional field, whether to the display the network to the end user or not.",
+                    "name": "displaynetwork",
+                    "type": "boolean"
+                },
+                {
+                    "description": "Cloudstack managed address space, all CloudStack managed VMs get IP address from CIDR",
+                    "name": "cidr",
+                    "type": "string"
+                },
+                {
+                    "description": "the gateway of IPv6 network",
+                    "name": "ip6gateway",
+                    "type": "string"
+                },
+                {
+                    "description": "the id of the network",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of resource tags associated with network",
+                    "name": "tags",
+                    "response": [
+                        {
+                            "description": "the ID of the domain associated with the tag",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name where tag belongs to",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project id the tag belongs to",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account associated with the tag",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "customer associated with the tag",
+                            "name": "customer",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag key name",
+                            "name": "key",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag value",
+                            "name": "value",
+                            "type": "string"
+                        },
+                        {
+                            "description": "resource type",
+                            "name": "resourcetype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain associated with the tag",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "id of the resource",
+                            "name": "resourceid",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "the physical network id",
+                    "name": "physicalnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "the network's netmask",
+                    "name": "netmask",
+                    "type": "string"
+                },
+                {
+                    "description": "VPC the network belongs to",
+                    "name": "vpcid",
+                    "type": "string"
+                },
+                {
+                    "description": "the network's IP range not to be used by CloudStack guest VMs and can be used for non CloudStack purposes",
+                    "name": "reservediprange",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of services",
+                    "name": "service",
+                    "response": [
+                        {
+                            "description": "the list of capabilities",
+                            "name": "capability",
+                            "response": [
+                                {
+                                    "description": "the capability name",
+                                    "name": "name",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the capability value",
+                                    "name": "value",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "can this service capability value can be choosable while creatine network offerings",
+                                    "name": "canchooseservicecapability",
+                                    "type": "boolean"
+                                }
+                            ],
+                            "type": "list"
+                        },
+                        {
+                            "description": "the service name",
+                            "name": "name",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the service provider name",
+                            "name": "provider",
+                            "response": [
+                                {
+                                    "description": "the physical network this belongs to",
+                                    "name": "physicalnetworkid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "state of the network provider",
+                                    "name": "state",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "true if individual services can be enabled/disabled",
+                                    "name": "canenableindividualservice",
+                                    "type": "boolean"
+                                },
+                                {
+                                    "description": "uuid of the network provider",
+                                    "name": "id",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the provider name",
+                                    "name": "name",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "services for this provider",
+                                    "name": "servicelist",
+                                    "type": "list"
+                                },
+                                {
+                                    "description": "the destination physical network",
+                                    "name": "destinationphysicalnetworkid",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "list"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "availability of the network offering the network is created from",
+                    "name": "networkofferingavailability",
+                    "type": "string"
+                },
+                {
+                    "description": "state of the network",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "display text of the network offering the network is created from",
+                    "name": "networkofferingdisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "the second DNS for the network",
+                    "name": "dns2",
+                    "type": "string"
+                },
+                {
+                    "description": "related to what other network configuration",
+                    "name": "related",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the address",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the displaytext of the network",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain id of the network owner",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "acl type - access type to the network",
+                    "name": "acltype",
+                    "type": "string"
+                },
+                {
+                    "description": "true if network is default, false otherwise",
+                    "name": "isdefault",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the network domain",
+                    "name": "networkdomain",
+                    "type": "string"
+                },
+                {
+                    "description": "list networks available for vm deployment",
+                    "name": "canusefordeploy",
+                    "type": "boolean"
+                },
+                {
+                    "description": "If a network is enabled for 'streched l2 subnet' then represents zones on which network currently spans",
+                    "name": "zonesnetworkspans",
+                    "type": "set"
+                },
+                {
+                    "description": "broadcast uri of the network. This parameter is visible to ROOT admins only",
+                    "name": "broadcasturi",
+                    "type": "string"
+                },
+                {
+                    "description": "the cidr of IPv6 network",
+                    "name": "ip6cidr",
+                    "type": "string"
+                },
+                {
+                    "description": "the traffic type of the network",
+                    "name": "traffictype",
+                    "type": "string"
+                },
+                {
+                    "description": "true if network supports specifying ip ranges, false otherwise",
+                    "name": "specifyipranges",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "Deletes a Physical Network.",
+            "isasync": true,
+            "name": "deletePhysicalNetwork",
+            "params": [
+                {
+                    "description": "the ID of the Physical network",
+                    "length": 255,
+                    "name": "id",
+                    "related": "createPhysicalNetwork",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                }
+            ],
+            "since": "3.0.0"
+        },
+        {
+            "description": "Dedicates a host.",
+            "isasync": true,
+            "name": "dedicateHost",
+            "params": [
+                {
+                    "description": "the name of the account which needs dedication. Must be used with domainId.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the containing domain",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "listDomainChildren,listDomains",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the ID of the host to update",
+                    "length": 255,
+                    "name": "hostid",
+                    "related": "addBaremetalHost,reconnectHost",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "listDedicatedHosts",
+            "response": [
+                {
+                    "description": "the Dedication Affinity Group ID of the host",
+                    "name": "affinitygroupid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the host",
+                    "name": "hostid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the host",
+                    "name": "hostname",
+                    "type": "string"
+                },
+                {
+                    "description": "the Account ID of the host",
+                    "name": "accountid",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain ID of the host",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the dedicated resource",
+                    "name": "id",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Removes vpn user",
+            "isasync": true,
+            "name": "removeVpnUser",
+            "params": [
+                {
+                    "description": "remove vpn user from the project",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "suspendProject,activateProject",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "an optional domainId for the vpn user. If the account parameter is used, domainId must also be used.",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "an optional account for the vpn user. Must be used with domainId.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "username for the vpn user",
+                    "length": 255,
+                    "name": "username",
+                    "required": true,
+                    "type": "string"
+                }
+            ],
+            "response": [
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                },
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Adds the GloboDNS external host",
+            "isasync": true,
+            "name": "addGloboDnsHost",
+            "params": [
+                {
+                    "description": "GloboDNS url",
+                    "length": 255,
+                    "name": "url",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "Password for GloboDNS",
+                    "length": 255,
+                    "name": "password",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the Physical Network ID",
+                    "length": 255,
+                    "name": "physicalnetworkid",
+                    "related": "createPhysicalNetwork",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "Username for GloboDNS",
+                    "length": 255,
+                    "name": "username",
+                    "required": true,
+                    "type": "string"
+                }
+            ],
+            "response": [
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                }
+            ],
+            "since": "4.5.0"
+        },
+        {
+            "description": "Logs out the user",
+            "isasync": false,
+            "name": "logout",
+            "params": [
+
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "Response description",
+                    "name": "description",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Deletes a load balancer health check policy.",
+            "isasync": true,
+            "name": "deleteLBHealthCheckPolicy",
+            "params": [
+                {
+                    "description": "the ID of the load balancer health check policy",
+                    "length": 255,
+                    "name": "id",
+                    "related": "",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                },
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                }
+            ],
+            "since": "4.2.0"
+        },
+        {
+            "description": "List Swift.",
+            "isasync": false,
+            "name": "listSwifts",
+            "params": [
+                {
+                    "description": "the id of the swift",
+                    "length": 255,
+                    "name": "id",
+                    "required": false,
+                    "type": "long"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "addImageStoreS3,listImageStores",
+            "response": [
+                {
+                    "description": "the Zone ID of the image store",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the protocol of the image store",
+                    "name": "protocol",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the image store",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone name of the image store",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the provider name of the image store",
+                    "name": "providername",
+                    "type": "string"
+                },
+                {
+                    "description": "the scope of the image store",
+                    "name": "scope",
+                    "type": "scopetype"
+                },
+                {
+                    "description": "the details of the image store",
+                    "name": "details",
+                    "type": "set"
+                },
+                {
+                    "description": "the name of the image store",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the url of the image store",
+                    "name": "url",
+                    "type": "string"
+                }
+            ],
+            "since": "3.0.0"
+        },
+        {
+            "description": "Enables out-of-band management for a host",
+            "isasync": true,
+            "name": "enableOutOfBandManagementForHost",
+            "params": [
+                {
+                    "description": "the ID of the host",
+                    "length": 255,
+                    "name": "hostid",
+                    "related": "addBaremetalHost,reconnectHost",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "disableOutOfBandManagementForCluster",
+            "response": [
+                {
+                    "description": "the out-of-band management interface address",
+                    "name": "address",
+                    "type": "string"
+                },
+                {
+                    "description": "true if out-of-band management is enabled for the host",
+                    "name": "enabled",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the out-of-band management driver for the host",
+                    "name": "driver",
+                    "type": "string"
+                },
+                {
+                    "description": "the out-of-band management interface username",
+                    "name": "username",
+                    "type": "string"
+                },
+                {
+                    "description": "the out-of-band management interface password",
+                    "name": "password",
+                    "type": "string"
+                },
+                {
+                    "description": "the out-of-band management action (if issued)",
+                    "name": "action",
+                    "type": "string"
+                },
+                {
+                    "description": "the operation result description",
+                    "name": "description",
+                    "type": "string"
+                },
+                {
+                    "description": "the out-of-band management interface powerState of the host",
+                    "name": "powerstate",
+                    "type": "powerstate"
+                },
+                {
+                    "description": "the operation result",
+                    "name": "status",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the ID of the host",
+                    "name": "hostid",
+                    "type": "string"
+                },
+                {
+                    "description": "the out-of-band management interface port",
+                    "name": "port",
+                    "type": "string"
+                }
+            ],
+            "since": "4.9.0"
+        },
+        {
+            "description": "Deletes a service offering.",
+            "isasync": false,
+            "name": "deleteServiceOffering",
+            "params": [
+                {
+                    "description": "the ID of the service offering",
+                    "length": 255,
+                    "name": "id",
+                    "related": "updateServiceOffering,listServiceOfferings",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "Adds a Nicira NVP device",
+            "isasync": true,
+            "name": "addNiciraNvpDevice",
+            "params": [
+                {
+                    "description": "The L2 Gateway Service UUID configured on the Nicira Controller",
+                    "length": 255,
+                    "name": "l2gatewayserviceuuid",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the Physical Network ID",
+                    "length": 255,
+                    "name": "physicalnetworkid",
+                    "related": "createPhysicalNetwork",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "Credentials to access the Nicira Controller API",
+                    "length": 255,
+                    "name": "username",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "The Transportzone UUID configured on the Nicira Controller",
+                    "length": 255,
+                    "name": "transportzoneuuid",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "The L3 Gateway Service UUID configured on the Nicira Controller",
+                    "length": 255,
+                    "name": "l3gatewayserviceuuid",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "Hostname of ip address of the Nicira NVP Controller.",
+                    "length": 255,
+                    "name": "hostname",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "Credentials to access the Nicira Controller API",
+                    "length": 255,
+                    "name": "password",
+                    "required": true,
+                    "type": "string"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "this L2 gateway service Uuid",
+                    "name": "l2gatewayserviceuuid",
+                    "type": "string"
+                },
+                {
+                    "description": "the controller Ip address",
+                    "name": "hostname",
+                    "type": "string"
+                },
+                {
+                    "description": "device name",
+                    "name": "niciradevicename",
+                    "type": "string"
+                },
+                {
+                    "description": "the physical network to which this Nirica Nvp belongs to",
+                    "name": "physicalnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "device id of the Nicire Nvp",
+                    "name": "nvpdeviceid",
+                    "type": "string"
+                },
+                {
+                    "description": "name of the provider",
+                    "name": "provider",
+                    "type": "string"
+                },
+                {
+                    "description": "the transport zone Uuid",
+                    "name": "transportzoneuuid",
+                    "type": "string"
+                },
+                {
+                    "description": "this L3 gateway service Uuid",
+                    "name": "l3gatewayserviceuuid",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Adds a F5 BigIP load balancer device",
+            "isasync": true,
+            "name": "addF5LoadBalancer",
+            "params": [
+                {
+                    "description": "Credentials to reach F5 BigIP load balancer device",
+                    "length": 255,
+                    "name": "username",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "URL of the F5 load balancer appliance.",
+                    "length": 255,
+                    "name": "url",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "Credentials to reach F5 BigIP load balancer device",
+                    "length": 255,
+                    "name": "password",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the Physical Network ID",
+                    "length": 255,
+                    "name": "physicalnetworkid",
+                    "related": "createPhysicalNetwork",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "supports only F5BigIpLoadBalancer",
+                    "length": 255,
+                    "name": "networkdevicetype",
+                    "required": true,
+                    "type": "string"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "device capacity",
+                    "name": "lbdevicecapacity",
+                    "type": "long"
+                },
+                {
+                    "description": "the private interface of the load balancer",
+                    "name": "privateinterface",
+                    "type": "string"
+                },
+                {
+                    "description": "device state",
+                    "name": "lbdevicestate",
+                    "type": "string"
+                },
+                {
+                    "description": "device name",
+                    "name": "lbdevicename",
+                    "type": "string"
+                },
+                {
+                    "description": "the public interface of the load balancer",
+                    "name": "publicinterface",
+                    "type": "string"
+                },
+                {
+                    "description": "the physical network to which this F5 device belongs to",
+                    "name": "physicalnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "true if device is dedicated for an account",
+                    "name": "lbdevicededicated",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the management IP address of the external load balancer",
+                    "name": "ipaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "device id of the F5 load balancer",
+                    "name": "lbdeviceid",
+                    "type": "string"
+                },
+                {
+                    "description": "name of the provider",
+                    "name": "provider",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Lists network serviceproviders for a given physical network.",
+            "isasync": false,
+            "name": "listNetworkServiceProviders",
+            "params": [
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "list providers by state",
+                    "length": 255,
+                    "name": "state",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "list providers by name",
+                    "length": 255,
+                    "name": "name",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "the Physical Network ID",
+                    "length": 255,
+                    "name": "physicalnetworkid",
+                    "related": "createPhysicalNetwork",
+                    "required": false,
+                    "type": "uuid"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the destination physical network",
+                    "name": "destinationphysicalnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "services for this provider",
+                    "name": "servicelist",
+                    "type": "list"
+                },
+                {
+                    "description": "the physical network this belongs to",
+                    "name": "physicalnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "true if individual services can be enabled/disabled",
+                    "name": "canenableindividualservice",
+                    "type": "boolean"
+                },
+                {
+                    "description": "uuid of the network provider",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "state of the network provider",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the provider name",
+                    "name": "name",
+                    "type": "string"
+                }
+            ],
+            "since": "3.0.0"
+        },
+        {
+            "description": "Lists infrastructure",
+            "isasync": false,
+            "name": "listInfrastructure",
+            "params": [
+
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "Number of systemvms",
+                    "name": "systemvms",
+                    "type": "integer"
+                },
+                {
+                    "description": "Number of storage pools",
+                    "name": "storagepools",
+                    "type": "integer"
+                },
+                {
+                    "description": "Number of hypervisor hosts",
+                    "name": "hosts",
+                    "type": "integer"
+                },
+                {
+                    "description": "Number of routers",
+                    "name": "routers",
+                    "type": "integer"
+                },
+                {
+                    "description": "Number of pods",
+                    "name": "pods",
+                    "type": "integer"
+                },
+                {
+                    "description": "Number of images stores",
+                    "name": "imagestores",
+                    "type": "integer"
+                },
+                {
+                    "description": "Number of zones",
+                    "name": "zones",
+                    "type": "integer"
+                },
+                {
+                    "description": "Number of cpu sockets",
+                    "name": "cpusockets",
+                    "type": "integer"
+                },
+                {
+                    "description": "Number of clusters",
+                    "name": "clusters",
+                    "type": "integer"
+                }
+            ],
+            "since": "4.9.3"
+        },
+        {
+            "description": "Lists usage records for accounts",
+            "isasync": false,
+            "name": "listUsageRecords",
+            "params": [
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "List usage records for the specified domain.",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "List usage records for specified project",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "suspendProject,activateProject",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "Start date range for usage record query (use format \"yyyy-MM-dd\" or the new format \"yyyy-MM-dd HH:mm:ss\", e.g. startDate=2015-01-01 or startdate=2015-01-01 11:00:00).",
+                    "length": 255,
+                    "name": "startdate",
+                    "required": true,
+                    "type": "date"
+                },
+                {
+                    "description": "List usage records for the specified usage type",
+                    "length": 255,
+                    "name": "type",
+                    "required": false,
+                    "type": "long"
+                },
+                {
+                    "description": "List usage records for the specified account",
+                    "length": 255,
+                    "name": "accountid",
+                    "related": "listAccounts,listAccounts,enableAccount",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "End date range for usage record query (use format \"yyyy-MM-dd\" or the new format \"yyyy-MM-dd HH:mm:ss\", e.g. startDate=2015-01-01 or startdate=2015-01-01 10:30:00).",
+                    "length": 255,
+                    "name": "enddate",
+                    "required": true,
+                    "type": "date"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "List usage records for the specified usage UUID. Can be used only together with TYPE parameter.",
+                    "length": 255,
+                    "name": "usageid",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "List usage records for the specified user.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the user account Id",
+                    "name": "accountid",
+                    "type": "string"
+                },
+                {
+                    "description": "description of the usage record",
+                    "name": "description",
+                    "type": "string"
+                },
+                {
+                    "description": "speed of each cpu of resource",
+                    "name": "cpuspeed",
+                    "type": "long"
+                },
+                {
+                    "description": "the project name of the resource",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "offering ID",
+                    "name": "offeringid",
+                    "type": "string"
+                },
+                {
+                    "description": "start date of the usage record",
+                    "name": "startdate",
+                    "type": "string"
+                },
+                {
+                    "description": "True if the resource is default",
+                    "name": "isdefault",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the domain the resource is associated with",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "template ID",
+                    "name": "templateid",
+                    "type": "string"
+                },
+                {
+                    "description": "the user account name",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "id of the resource",
+                    "name": "usageid",
+                    "type": "string"
+                },
+                {
+                    "description": "memory allocated for the resource",
+                    "name": "memory",
+                    "type": "long"
+                },
+                {
+                    "description": "id of the network",
+                    "name": "networkid",
+                    "type": "string"
+                },
+                {
+                    "description": "virtual machine ID",
+                    "name": "virtualmachineid",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the resource",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "resource size",
+                    "name": "size",
+                    "type": "long"
+                },
+                {
+                    "description": "usage in hours",
+                    "name": "usage",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain ID",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the zone ID",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "virtual machine name",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "virtual size of resource",
+                    "name": "virtualsize",
+                    "type": "long"
+                },
+                {
+                    "description": "resource type",
+                    "name": "type",
+                    "type": "string"
+                },
+                {
+                    "description": "number of cpu of resource",
+                    "name": "cpunumber",
+                    "type": "long"
+                },
+                {
+                    "description": "True if the IPAddress is system IP - allocated during vm deploy or lb rule create",
+                    "name": "issystem",
+                    "type": "boolean"
+                },
+                {
+                    "description": "end date of the usage record",
+                    "name": "enddate",
+                    "type": "string"
+                },
+                {
+                    "description": "usage type ID",
+                    "name": "usagetype",
+                    "type": "integer"
+                },
+                {
+                    "description": "True if the IPAddress is source NAT",
+                    "name": "issourcenat",
+                    "type": "boolean"
+                },
+                {
+                    "description": "raw usage in hours",
+                    "name": "rawusage",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Deletes a detached disk volume.",
+            "isasync": false,
+            "name": "deleteVolume",
+            "params": [
+                {
+                    "description": "The ID of the disk volume",
+                    "length": 255,
+                    "name": "id",
+                    "related": "updateVolume,createVolume,listVolumes,uploadVolume,attachVolume,detachVolume,resizeVolume,migrateVolume,createVolume",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                },
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Enables a user account",
+            "isasync": false,
+            "name": "enableUser",
+            "params": [
+                {
+                    "description": "Enables user by user ID.",
+                    "length": 255,
+                    "name": "id",
+                    "related": "enableUser,getUser,createUser",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "getUser,createUser",
+            "response": [
+                {
+                    "description": "the api key of the user",
+                    "name": "apikey",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain ID of the user",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the account name of the user",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the timezone user was created in",
+                    "name": "timezone",
+                    "type": "string"
+                },
+                {
+                    "description": "the user ID",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the user lastname",
+                    "name": "lastname",
+                    "type": "string"
+                },
+                {
+                    "description": "the date and time the user account was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the secret key of the user",
+                    "name": "secretkey",
+                    "type": "string"
+                },
+                {
+                    "description": "true if user is default, false otherwise",
+                    "name": "isdefault",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the ID of the role",
+                    "name": "roleid",
+                    "type": "string"
+                },
+                {
+                    "description": "the account ID of the user",
+                    "name": "accountid",
+                    "type": "string"
+                },
+                {
+                    "description": "the user name",
+                    "name": "username",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain name of the user",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the boolean value representing if the updating target is in caller's child domain",
+                    "name": "iscallerchilddomain",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the user email address",
+                    "name": "email",
+                    "type": "string"
+                },
+                {
+                    "description": "the account type of the user",
+                    "name": "accounttype",
+                    "type": "short"
+                },
+                {
+                    "description": "the type of the role",
+                    "name": "roletype",
+                    "type": "string"
+                },
+                {
+                    "description": "the user state",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the user firstname",
+                    "name": "firstname",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the role",
+                    "name": "rolename",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Lists zone metrics",
+            "isasync": false,
+            "name": "listZonesMetrics",
+            "params": [
+                {
+                    "description": "the network type of the zone that the virtual machine belongs to",
+                    "length": 255,
+                    "name": "networktype",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the zone",
+                    "length": 255,
+                    "name": "name",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the zone",
+                    "length": 255,
+                    "name": "id",
+                    "related": "listZones,createZone",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the ID of the domain associated with the zone",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "flag to display the capacity of the zones",
+                    "length": 255,
+                    "name": "showcapacities",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "List zones by resource tags (key/value pairs)",
+                    "length": 255,
+                    "name": "tags",
+                    "required": false,
+                    "since": "4.3",
+                    "type": "map"
+                },
+                {
+                    "description": "true if you want to retrieve all available Zones. False if you only want to return the Zones from which you have at least one VM. Default is false.",
+                    "length": 255,
+                    "name": "available",
+                    "required": false,
+                    "type": "boolean"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the total cpu allocated in Ghz",
+                    "name": "cpuallocated",
+                    "type": "string"
+                },
+                {
+                    "description": "the maximum memory deviation",
+                    "name": "memorymaxdeviation",
+                    "type": "string"
+                },
+                {
+                    "description": "memory allocated disable threshold exceeded",
+                    "name": "memoryallocateddisablethreshold",
+                    "type": "boolean"
+                },
+                {
+                    "description": "cpu allocated notification threshold exceeded",
+                    "name": "cpuallocatedthreshold",
+                    "type": "boolean"
+                },
+                {
+                    "description": "cpu allocated disable threshold exceeded",
+                    "name": "cpuallocateddisablethreshold",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the maximum cpu deviation",
+                    "name": "cpumaxdeviation",
+                    "type": "string"
+                },
+                {
+                    "description": "healthy / total clusters in the zone",
+                    "name": "clusters",
+                    "type": "string"
+                },
+                {
+                    "description": "the total cpu capacity in GiB",
+                    "name": "memorytotal",
+                    "type": "string"
+                },
+                {
+                    "description": "memory usage notification threshold exceeded",
+                    "name": "memorythreshold",
+                    "type": "boolean"
+                },
+                {
+                    "description": "state of the cluster",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "memory allocated notification threshold exceeded",
+                    "name": "memoryallocatedthreshold",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the total cpu capacity in Ghz",
+                    "name": "cputotal",
+                    "type": "string"
+                },
+                {
+                    "description": "the total cpu used in Ghz",
+                    "name": "cpuused",
+                    "type": "string"
+                },
+                {
+                    "description": "cpu usage disable threshold exceeded",
+                    "name": "cpudisablethreshold",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the total cpu allocated in GiB",
+                    "name": "memoryallocated",
+                    "type": "string"
+                },
+                {
+                    "description": "memory usage disable threshold exceeded",
+                    "name": "memorydisablethreshold",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the total cpu used in GiB",
+                    "name": "memoryused",
+                    "type": "string"
+                },
+                {
+                    "description": "cpu usage notification threshold exceeded",
+                    "name": "cputhreshold",
+                    "type": "boolean"
+                }
+            ],
+            "since": "4.9.3"
+        },
+        {
+            "description": "Extracts a template",
+            "isasync": true,
+            "name": "extractTemplate",
+            "params": [
+                {
+                    "description": "the mode of extraction - HTTP_DOWNLOAD or FTP_UPLOAD",
+                    "length": 255,
+                    "name": "mode",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the template",
+                    "length": 255,
+                    "name": "id",
+                    "related": "registerTemplate,copyTemplate,registerTemplate,listTemplates,registerIso,listIsos,createTemplate,copyIso",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the ID of the zone where the ISO is originally located",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones,createZone",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the url to which the ISO would be extracted",
+                    "length": 2048,
+                    "name": "url",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the name of the extracted object",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the status of the extraction",
+                    "name": "status",
+                    "type": "string"
+                },
+                {
+                    "description": "the time and date the object was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the state of the extracted object",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the account id to which the extracted object belongs",
+                    "name": "accountid",
+                    "type": "string"
+                },
+                {
+                    "description": "the upload id of extracted object",
+                    "name": "extractId",
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "name": "resultstring",
+                    "type": "string"
+                },
+                {
+                    "description": "if mode = upload then url of the uploaded entity. if mode = download the url from which the entity can be downloaded",
+                    "name": "url",
+                    "type": "string"
+                },
+                {
+                    "description": "the mode of extraction - upload or download",
+                    "name": "extractMode",
+                    "type": "string"
+                },
+                {
+                    "description": "the id of extracted object",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "zone ID the object was extracted from",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the percentage of the entity uploaded to the specified location",
+                    "name": "uploadpercentage",
+                    "type": "integer"
+                },
+                {
+                    "description": "type of the storage",
+                    "name": "storagetype",
+                    "type": "string"
+                },
+                {
+
+                },
+                {
+                    "description": "zone name the object was extracted from",
+                    "name": "zonename",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Expunge a virtual machine. Once expunged, it cannot be recoverd.",
+            "isasync": true,
+            "name": "expungeVirtualMachine",
+            "params": [
+                {
+                    "description": "The ID of the virtual machine",
+                    "length": 255,
+                    "name": "id",
+                    "related": "resetSSHKeyForVirtualMachine,attachIso,removeNicFromVirtualMachine,updateVMAffinityGroup,rebootVirtualMachine,restoreVirtualMachine,destroyVirtualMachine,stopVirtualMachine,detachIso,deployVirtualMachine,updateVirtualMachine,revertToVMSnapshot,resetPasswordForVirtualMachine,startVirtualMachine,updateDefaultNicForVirtualMachine,startVirtualMachine,attachIso,listVirtualMachines,addNicToVirtualMachine,stopVirtualMachine,destroyVirtualMachine,removeNicFromVirtualMachine,changeServiceForVirtualMachine",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "Suspends a project",
+            "isasync": true,
+            "name": "suspendProject",
+            "params": [
+                {
+                    "description": "id of the project to be suspended",
+                    "length": 255,
+                    "name": "id",
+                    "related": "suspendProject,activateProject",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "activateProject",
+            "response": [
+                {
+                    "description": "the displaytext of the project",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "the total secondary storage space (in GiB) owned by project",
+                    "name": "secondarystoragetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the list of resource tags associated with vm",
+                    "name": "tags",
+                    "response": [
+                        {
+                            "description": "the account associated with the tag",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain associated with the tag",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project id the tag belongs to",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag value",
+                            "name": "value",
+                            "type": "string"
+                        },
+                        {
+                            "description": "customer associated with the tag",
+                            "name": "customer",
+                            "type": "string"
+                        },
+                        {
+                            "description": "id of the resource",
+                            "name": "resourceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the domain associated with the tag",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag key name",
+                            "name": "key",
+                            "type": "string"
+                        },
+                        {
+                            "description": "resource type",
+                            "name": "resourcetype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name where tag belongs to",
+                            "name": "project",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "the total number of networks the project can own",
+                    "name": "networklimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of public ip addresses allocated for this project",
+                    "name": "iptotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the state of the project",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of virtual machines running for this project",
+                    "name": "vmrunning",
+                    "type": "integer"
+                },
+                {
+                    "description": "the total number of cpu cores owned by project",
+                    "name": "cputotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of virtual machines available for this project to acquire",
+                    "name": "vmavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of templates which can be created by this project",
+                    "name": "templatelimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total memory (in MB) the project can own",
+                    "name": "memorylimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of public ip addresses this project can acquire",
+                    "name": "iplimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total memory (in MB) owned by project",
+                    "name": "memorytotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of vpcs owned by project",
+                    "name": "vpctotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total memory (in MB) available to be created for this project",
+                    "name": "memoryavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of networks owned by project",
+                    "name": "networktotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total secondary storage space (in GiB) the project can own",
+                    "name": "secondarystoragelimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of templates available to be created by this project",
+                    "name": "templateavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of vpcs available to be created for this project",
+                    "name": "vpcavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of snapshots available for this project",
+                    "name": "snapshotavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total primary storage space (in GiB) owned by project",
+                    "name": "primarystoragetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the domain name where the project belongs to",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of virtual machines stopped for this project",
+                    "name": "vmstopped",
+                    "type": "integer"
+                },
+                {
+                    "description": "the total volume available for this project",
+                    "name": "volumeavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the account name of the project's owner",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the total volume being used by this project",
+                    "name": "volumetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the name of the project",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of cpu cores available to be created for this project",
+                    "name": "cpuavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total volume which can be used by this project",
+                    "name": "volumelimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of vpcs the project can own",
+                    "name": "vpclimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of virtual machines that can be deployed by this project",
+                    "name": "vmlimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of cpu cores the project can own",
+                    "name": "cpulimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total secondary storage space (in GiB) available to be used for this project",
+                    "name": "secondarystorageavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of templates which have been created by this project",
+                    "name": "templatetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of virtual machines deployed by this project",
+                    "name": "vmtotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total primary storage space (in GiB) available to be used for this project",
+                    "name": "primarystorageavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain id the project belongs to",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the total primary storage space (in GiB) the project can own",
+                    "name": "primarystoragelimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of networks available to be created for this project",
+                    "name": "networkavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the id of the project",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of public ip addresses available for this project to acquire",
+                    "name": "ipavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of snapshots which can be stored by this project",
+                    "name": "snapshotlimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of snapshots stored by this project",
+                    "name": "snapshottotal",
+                    "type": "long"
+                }
+            ],
+            "since": "3.0.0"
+        },
+        {
+            "description": "Updates an IP address",
+            "isasync": true,
+            "name": "updateIpAddress",
+            "params": [
+                {
+                    "description": "an optional field, in case you want to set a custom id to the resource. Allowed to Root Admins only",
+                    "length": 255,
+                    "name": "customid",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the public IP address to update",
+                    "length": 255,
+                    "name": "id",
+                    "related": "updateIpAddress,associateIpAddress,listPublicIpAddresses",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "an optional field, whether to the display the IP to the end user or not",
+                    "length": 255,
+                    "name": "fordisplay",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "boolean"
+                }
+            ],
+            "related": "associateIpAddress,listPublicIpAddresses",
+            "response": [
+                {
+                    "description": "the ID of the Network where ip belongs to",
+                    "name": "networkid",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of resource tags associated with ip address",
+                    "name": "tags",
+                    "response": [
+                        {
+                            "description": "customer associated with the tag",
+                            "name": "customer",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the domain associated with the tag",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "resource type",
+                            "name": "resourcetype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "id of the resource",
+                            "name": "resourceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name where tag belongs to",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account associated with the tag",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag value",
+                            "name": "value",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project id the tag belongs to",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain associated with the tag",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag key name",
+                            "name": "key",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "the account the public IP address is associated with",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the VLAN associated with the IP address",
+                    "name": "vlanname",
+                    "type": "string"
+                },
+                {
+                    "description": "State of the ip address. Can be: Allocatin, Allocated and Releasing",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the zone the public IP address belongs to",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "public IP address id",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "true if the IP address is a source nat address, false otherwise",
+                    "name": "issourcenat",
+                    "type": "boolean"
+                },
+                {
+                    "description": "public IP address",
+                    "name": "ipaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "date the public IP address was acquired",
+                    "name": "allocated",
+                    "type": "date"
+                },
+                {
+                    "description": "the name of the zone the public IP address belongs to",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the address",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain ID the public IP address is associated with",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the VLAN associated with the IP address. This parameter is visible to ROOT admins only",
+                    "name": "vlanid",
+                    "type": "string"
+                },
+                {
+                    "description": "virutal machine name the ip address is assigned to (not null only for static nat Ip)",
+                    "name": "virtualmachinename",
+                    "type": "string"
+                },
+                {
+                    "description": "virutal machine display name the ip address is assigned to (not null only for static nat Ip)",
+                    "name": "virtualmachinedisplayname",
+                    "type": "string"
+                },
+                {
+                    "description": "the virtual network for the IP address",
+                    "name": "forvirtualnetwork",
+                    "type": "boolean"
+                },
+                {
+                    "description": "virutal machine (dnat) ip address (not null only for static nat Ip)",
+                    "name": "vmipaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "virutal machine id the ip address is assigned to (not null only for static nat Ip)",
+                    "name": "virtualmachineid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the Network associated with the IP address",
+                    "name": "associatednetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain the public IP address is associated with",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "VPC the ip belongs to",
+                    "name": "vpcid",
+                    "type": "string"
+                },
+                {
+                    "description": "the physical network this belongs to",
+                    "name": "physicalnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "purpose of the IP address. In Acton this value is not null for Ips with isSystem=true, and can have either StaticNat or LB value",
+                    "name": "purpose",
+                    "type": "string"
+                },
+                {
+                    "description": "true if this ip is system ip (was allocated as a part of deployVm or createLbRule)",
+                    "name": "issystem",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the name of the Network associated with the IP address",
+                    "name": "associatednetworkname",
+                    "type": "string"
+                },
+                {
+                    "description": "is public ip for display to the regular user",
+                    "name": "fordisplay",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the project id of the ipaddress",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "true if this ip is for static nat, false otherwise",
+                    "name": "isstaticnat",
+                    "type": "boolean"
+                },
+                {
+                    "description": "is public IP portable across the zones",
+                    "name": "isportable",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "Get API limit count for the caller",
+            "isasync": false,
+            "name": "getApiLimit",
+            "params": [
+
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the account name of the api remaining count",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "seconds left to reset counters",
+                    "name": "expireAfter",
+                    "type": "long"
+                },
+                {
+                    "description": "the account uuid of the api remaining count",
+                    "name": "accountid",
+                    "type": "string"
+                },
+                {
+                    "description": "number of api already issued",
+                    "name": "apiIssued",
+                    "type": "int"
+                },
+                {
+                    "description": "currently allowed number of apis",
+                    "name": "apiAllowed",
+                    "type": "int"
+                }
+            ]
+        },
+        {
+            "description": "Deletes a storage network IP Range.",
+            "isasync": true,
+            "name": "deleteStorageNetworkIpRange",
+            "params": [
+                {
+                    "description": "the uuid of the storage network ip range",
+                    "length": 255,
+                    "name": "id",
+                    "related": "createStorageNetworkIpRange",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                }
+            ],
+            "since": "3.0.0"
+        },
+        {
+            "description": "Adds a VMware datacenter to specified zone",
+            "isasync": false,
+            "name": "addVmwareDc",
+            "params": [
+                {
+                    "description": "The Username required to connect to resource.",
+                    "length": 255,
+                    "name": "username",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "The name/ip of vCenter. Make sure it is IP address or full qualified domain name for host running vCenter server.",
+                    "length": 255,
+                    "name": "vcenter",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "Name of VMware datacenter to be added to specified zone.",
+                    "length": 255,
+                    "name": "name",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "The Zone ID.",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones,createZone",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "The password for specified username.",
+                    "length": 255,
+                    "name": "password",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "The VMware Datacenter ID",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone ID associated with this VMware Datacenter",
+                    "name": "zoneid",
+                    "type": "long"
+                },
+                {
+                    "description": "The VMware Datacenter name",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "The VMware vCenter name/ip",
+                    "name": "vcenter",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Updates ISO permissions",
+            "isasync": false,
+            "name": "updateIsoPermissions",
+            "params": [
+                {
+                    "description": "true if the template/iso is extractable, false other wise. Can be set only by root admin",
+                    "length": 255,
+                    "name": "isextractable",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "a comma delimited list of accounts. If specified, \"op\" parameter has to be passed in.",
+                    "length": 255,
+                    "name": "accounts",
+                    "required": false,
+                    "type": "list"
+                },
+                {
+                    "description": "the template ID",
+                    "length": 255,
+                    "name": "id",
+                    "related": "registerTemplate,copyTemplate,registerTemplate,listTemplates,registerIso,listIsos,createTemplate,copyIso",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "permission operator (add, remove, reset)",
+                    "length": 255,
+                    "name": "op",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "true for public template/iso, false for private templates/isos",
+                    "length": 255,
+                    "name": "ispublic",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "a comma delimited list of projects. If specified, \"op\" parameter has to be passed in.",
+                    "length": 255,
+                    "name": "projectids",
+                    "related": "activateProject",
+                    "required": false,
+                    "type": "list"
+                },
+                {
+                    "description": "true for featured template/iso, false otherwise",
+                    "length": 255,
+                    "name": "isfeatured",
+                    "required": false,
+                    "type": "boolean"
+                }
+            ],
+            "response": [
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                },
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Registers an existing template into the CloudStack cloud. ",
+            "isasync": false,
+            "name": "registerTemplate",
+            "params": [
+                {
+                    "description": "32 or 64 bits support. 64 by default",
+                    "length": 255,
+                    "name": "bits",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "the format for the template. Possible values include QCOW2, RAW, VHD and OVA.",
+                    "length": 255,
+                    "name": "format",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "true if the template supports the password reset feature; default is false",
+                    "length": 255,
+                    "name": "passwordenabled",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if template contains XS/VMWare tools inorder to support dynamic scaling of VM cpu/memory",
+                    "length": 255,
+                    "name": "isdynamicallyscalable",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "Register template for the project",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "activateProject",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "an optional domainId. If the account parameter is used, domainId must also be used.",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "Template details in key/value pairs using format details[i].keyname=keyvalue. Example: details[0].hypervisortoolsversion=xenserver61",
+                    "length": 255,
+                    "name": "details",
+                    "required": false,
+                    "type": "map"
+                },
+                {
+                    "description": "the display text of the template. This is usually used for display purposes.",
+                    "length": 4096,
+                    "name": "displaytext",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "true if this template requires HVM",
+                    "length": 255,
+                    "name": "requireshvm",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "an optional accountName. Must be used with domainId.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the OS Type that best represents the OS of this template.",
+                    "length": 255,
+                    "name": "ostypeid",
+                    "related": "",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "true if the template is available to all accounts; default is true",
+                    "length": 255,
+                    "name": "ispublic",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if the template or its derivatives are extractable; default is false",
+                    "length": 255,
+                    "name": "isextractable",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "the ID of the zone the template is to be hosted on",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones,createZone",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the target hypervisor for the template",
+                    "length": 255,
+                    "name": "hypervisor",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the MD5 checksum value of this template",
+                    "length": 255,
+                    "name": "checksum",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "true if the template supports the sshkey upload feature; default is false",
+                    "length": 255,
+                    "name": "sshkeyenabled",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "the tag for this template.",
+                    "length": 255,
+                    "name": "templatetag",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the URL of where the template is hosted. Possible URL include http:// and https://",
+                    "length": 2048,
+                    "name": "url",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "true if the template type is routing i.e., if template is used to deploy router",
+                    "length": 255,
+                    "name": "isrouting",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if this template is a featured template, false otherwise",
+                    "length": 255,
+                    "name": "isfeatured",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "the name of the template",
+                    "length": 255,
+                    "name": "name",
+                    "required": true,
+                    "type": "string"
+                }
+            ],
+            "related": "copyTemplate,registerTemplate,listTemplates,registerIso,listIsos,createTemplate,copyIso",
+            "response": [
+                {
+                    "description": "the status of the template",
+                    "name": "status",
+                    "type": "string"
+                },
+                {
+                    "description": "the tag of this template",
+                    "name": "templatetag",
+                    "type": "string"
+                },
+                {
+                    "description": "the template name",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the domain to which the template belongs",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "true if this template is a public template, false otherwise",
+                    "name": "ispublic",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the name of the OS type for this template.",
+                    "name": "ostypename",
+                    "type": "string"
+                },
+                {
+                    "description": "true if the template is extractable, false otherwise",
+                    "name": "isextractable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if this template is a featured template, false otherwise",
+                    "name": "isfeatured",
+                    "type": "boolean"
+                },
+                {
+                    "description": "additional key/value details tied with template",
+                    "name": "details",
+                    "type": "map"
+                },
+                {
+                    "description": "the ID of the domain to which the template belongs",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the template",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the template ID",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the template",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the OS type for this template.",
+                    "name": "ostypeid",
+                    "type": "string"
+                },
+                {
+                    "description": "the size of the template",
+                    "name": "size",
+                    "type": "long"
+                },
+                {
+                    "description": "the format of the template.",
+                    "name": "format",
+                    "type": "imageformat"
+                },
+                {
+                    "description": "the name of the zone for this template",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "true if the reset password feature is enabled, false otherwise",
+                    "name": "passwordenabled",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the ID of the secondary storage host for the template",
+                    "name": "hostid",
+                    "type": "string"
+                },
+                {
+                    "description": "the template ID of the parent template if present",
+                    "name": "sourcetemplateid",
+                    "type": "string"
+                },
+                {
+                    "description": "true if template contains XS/VMWare tools inorder to support dynamic scaling of VM cpu/memory",
+                    "name": "isdynamicallyscalable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the ID of the zone for this template",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the secondary storage host for the template",
+                    "name": "hostname",
+                    "type": "string"
+                },
+                {
+                    "description": "the hypervisor on which the template runs",
+                    "name": "hypervisor",
+                    "type": "string"
+                },
+                {
+                    "description": "the account id to which the template belongs",
+                    "name": "accountid",
+                    "type": "string"
+                },
+                {
+                    "description": "the account name to which the template belongs",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "true if the template is ready to be deployed from, false otherwise.",
+                    "name": "isready",
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if template is sshkey enabled, false otherwise",
+                    "name": "sshkeyenabled",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the date this template was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "true if the ISO is bootable, false otherwise",
+                    "name": "bootable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the type of the template",
+                    "name": "templatetype",
+                    "type": "string"
+                },
+                {
+                    "description": "the date this template was removed",
+                    "name": "removed",
+                    "type": "date"
+                },
+                {
+                    "description": "checksum of the template",
+                    "name": "checksum",
+                    "type": "string"
+                },
+                {
+                    "description": "true if the template is managed across all Zones, false otherwise",
+                    "name": "crossZones",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the template display text",
+                    "name": "displaytext",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Deletes VPC offering",
+            "isasync": true,
+            "name": "deleteVPCOffering",
+            "params": [
+                {
+                    "description": "the ID of the VPC offering",
+                    "length": 255,
+                    "name": "id",
+                    "related": "updateVPCOffering",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "Adds stratosphere ssp server",
+            "isasync": false,
+            "name": "addStratosphereSsp",
+            "params": [
+                {
+                    "description": "stratosphere ssp api name",
+                    "length": 255,
+                    "name": "name",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the zone ID",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones,createZone",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "stratosphere ssp api password",
+                    "length": 255,
+                    "name": "password",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "stratosphere ssp api username",
+                    "length": 255,
+                    "name": "username",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "stratosphere ssp server url",
+                    "length": 255,
+                    "name": "url",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "stratosphere ssp tenant uuid",
+                    "length": 255,
+                    "name": "tenantuuid",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "name",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "server id of the stratosphere ssp server",
+                    "name": "hostid",
+                    "type": "string"
+                },
+                {
+                    "description": "url of ssp endpoint",
+                    "name": "url",
+                    "type": "string"
+                },
+                {
+                    "description": "zone which this ssp controls",
+                    "name": "zoneid",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Update a Nuage VSP device",
+            "isasync": true,
+            "name": "updateNuageVspDevice",
+            "params": [
+                {
+                    "description": "the user name of the CMS user in Nuage VSD",
+                    "length": 255,
+                    "name": "username",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the version of the API to use to communicate to Nuage VSD",
+                    "length": 255,
+                    "name": "apiversion",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the physical network in to which Nuage VSP is added",
+                    "length": 255,
+                    "name": "physicalnetworkid",
+                    "related": "createPhysicalNetwork",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the time to wait after failure before retrying to communicate to Nuage VSD",
+                    "length": 255,
+                    "name": "retryinterval",
+                    "required": false,
+                    "type": "long"
+                },
+                {
+                    "description": "the password of CMS user in Nuage VSD",
+                    "length": 255,
+                    "name": "password",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the number of retries on failure to communicate to Nuage VSD",
+                    "length": 255,
+                    "name": "retrycount",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "the hostname of the Nuage VSD",
+                    "length": 255,
+                    "name": "hostname",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the port to communicate to Nuage VSD",
+                    "length": 255,
+                    "name": "port",
+                    "required": false,
+                    "type": "integer"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the port to communicate to Nuage VSD",
+                    "name": "port",
+                    "type": "int"
+                },
+                {
+                    "description": "the device id of the Nuage VSD",
+                    "name": "vspdeviceid",
+                    "type": "string"
+                },
+                {
+                    "description": "the service provider name corresponding to this Nuage VSP device",
+                    "name": "provider",
+                    "type": "string"
+                },
+                {
+                    "description": "the version of the API to use to communicate to Nuage VSD",
+                    "name": "apiversion",
+                    "type": "string"
+                },
+                {
+                    "description": "the hostname of the Nuage VSD",
+                    "name": "hostname",
+                    "type": "string"
+                },
+                {
+                    "description": "the number of retries on failure to communicate to Nuage VSD",
+                    "name": "retrycount",
+                    "type": "int"
+                },
+                {
+                    "description": "the ID of the physical network to which this Nuage VSP belongs to",
+                    "name": "physicalnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "the time to wait after failure before retrying to communicate to Nuage VSD",
+                    "name": "retryinterval",
+                    "type": "long"
+                },
+                {
+                    "description": "the name of the Nuage VSP device",
+                    "name": "nuagedevicename",
+                    "type": "string"
+                },
+                {
+                    "description": "the CMS ID generated by the Nuage VSD",
+                    "name": "cmsid",
+                    "type": "string"
+                }
+            ],
+            "since": "4.6"
+        },
+        {
+            "description": "Deletes a network ACL",
+            "isasync": true,
+            "name": "deleteNetworkACL",
+            "params": [
+                {
+                    "description": "the ID of the network ACL",
+                    "length": 255,
+                    "name": "id",
+                    "related": "",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                },
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Creates a storage pool.",
+            "isasync": false,
+            "name": "createStoragePool",
+            "params": [
+                {
+                    "description": "the scope of the storage: cluster or zone",
+                    "length": 255,
+                    "name": "scope",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the details for the storage pool",
+                    "length": 255,
+                    "name": "details",
+                    "required": false,
+                    "type": "map"
+                },
+                {
+                    "description": "the tags for the storage pool",
+                    "length": 255,
+                    "name": "tags",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the storage provider name",
+                    "length": 255,
+                    "name": "provider",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone ID for the storage pool",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones,createZone",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "bytes CloudStack can provision from this storage pool",
+                    "length": 255,
+                    "name": "capacitybytes",
+                    "required": false,
+                    "type": "long"
+                },
+                {
+                    "description": "the name for the storage pool",
+                    "length": 255,
+                    "name": "name",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the Pod ID for the storage pool",
+                    "length": 255,
+                    "name": "podid",
+                    "related": "updatePod",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the URL of the storage pool",
+                    "length": 255,
+                    "name": "url",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "IOPS CloudStack can provision from this storage pool",
+                    "length": 255,
+                    "name": "capacityiops",
+                    "required": false,
+                    "type": "long"
+                },
+                {
+                    "description": "hypervisor type of the hosts in zone that will be attached to this storage pool. KVM, VMware supported as of now.",
+                    "length": 255,
+                    "name": "hypervisor",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "whether the storage should be managed by CloudStack",
+                    "length": 255,
+                    "name": "managed",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "the cluster ID for the storage pool",
+                    "length": 255,
+                    "name": "clusterid",
+                    "related": "addCluster",
+                    "required": false,
+                    "type": "uuid"
+                }
+            ],
+            "related": "findStoragePoolsForMigration,enableStorageMaintenance,cancelStorageMaintenance",
+            "response": [
+                {
+                    "description": "the ID of the cluster for the storage pool",
+                    "name": "clusterid",
+                    "type": "string"
+                },
+                {
+                    "description": "the IP address of the storage pool",
+                    "name": "ipaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of the storage pool",
+                    "name": "state",
+                    "type": "storagepoolstatus"
+                },
+                {
+                    "description": "the scope of the storage pool",
+                    "name": "scope",
+                    "type": "string"
+                },
+                {
+                    "description": "the hypervisor type of the storage pool",
+                    "name": "hypervisor",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the storage pool",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone ID of the storage pool",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the storage pool path",
+                    "name": "path",
+                    "type": "string"
+                },
+                {
+                    "description": "the storage pool capabilities",
+                    "name": "storagecapabilities",
+                    "type": "map"
+                },
+                {
+                    "description": "the ID of the storage pool",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the host's currently allocated disk size",
+                    "name": "disksizeallocated",
+                    "type": "long"
+                },
+                {
+                    "description": "true if this pool is suitable to migrate a volume, false otherwise",
+                    "name": "suitableformigration",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the Pod ID of the storage pool",
+                    "name": "podid",
+                    "type": "string"
+                },
+                {
+                    "description": "IOPS CloudStack can provision from this storage pool",
+                    "name": "capacityiops",
+                    "type": "long"
+                },
+                {
+                    "description": "the Zone name of the storage pool",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the cluster for the storage pool",
+                    "name": "clustername",
+                    "type": "string"
+                },
+                {
+                    "description": "the Pod name of the storage pool",
+                    "name": "podname",
+                    "type": "string"
+                },
+                {
+                    "description": "the storage pool type",
+                    "name": "type",
+                    "type": "string"
+                },
+                {
+                    "description": "the overprovisionfactor for the storage pool",
+                    "name": "overprovisionfactor",
+                    "type": "string"
+                },
+                {
+                    "description": "the total disk size of the storage pool",
+                    "name": "disksizetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the date and time the storage pool was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the host's currently used disk size",
+                    "name": "disksizeused",
+                    "type": "long"
+                },
+                {
+                    "description": "the tags for the storage pool",
+                    "name": "tags",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Lists storage pools available for migration of a volume.",
+            "isasync": false,
+            "name": "findStoragePoolsForMigration",
+            "params": [
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "the ID of the volume",
+                    "length": 255,
+                    "name": "id",
+                    "related": "updateVolume,createVolume,listVolumes,uploadVolume,attachVolume,detachVolume,resizeVolume,migrateVolume,createVolume",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "enableStorageMaintenance,cancelStorageMaintenance",
+            "response": [
+                {
+                    "description": "the date and time the storage pool was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the Pod name of the storage pool",
+                    "name": "podname",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the storage pool",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "IOPS CloudStack can provision from this storage pool",
+                    "name": "capacityiops",
+                    "type": "long"
+                },
+                {
+                    "description": "the Pod ID of the storage pool",
+                    "name": "podid",
+                    "type": "string"
+                },
+                {
+                    "description": "the host's currently allocated disk size",
+                    "name": "disksizeallocated",
+                    "type": "long"
+                },
+                {
+                    "description": "the ID of the cluster for the storage pool",
+                    "name": "clusterid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the storage pool",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone ID of the storage pool",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the total disk size of the storage pool",
+                    "name": "disksizetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the storage pool path",
+                    "name": "path",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of the storage pool",
+                    "name": "state",
+                    "type": "storagepoolstatus"
+                },
+                {
+                    "description": "the name of the cluster for the storage pool",
+                    "name": "clustername",
+                    "type": "string"
+                },
+                {
+                    "description": "true if this pool is suitable to migrate a volume, false otherwise",
+                    "name": "suitableformigration",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the hypervisor type of the storage pool",
+                    "name": "hypervisor",
+                    "type": "string"
+                },
+                {
+                    "description": "the overprovisionfactor for the storage pool",
+                    "name": "overprovisionfactor",
+                    "type": "string"
+                },
+                {
+                    "description": "the IP address of the storage pool",
+                    "name": "ipaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the host's currently used disk size",
+                    "name": "disksizeused",
+                    "type": "long"
+                },
+                {
+                    "description": "the Zone name of the storage pool",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the scope of the storage pool",
+                    "name": "scope",
+                    "type": "string"
+                },
+                {
+                    "description": "the tags for the storage pool",
+                    "name": "tags",
+                    "type": "string"
+                },
+                {
+                    "description": "the storage pool type",
+                    "name": "type",
+                    "type": "string"
+                },
+                {
+                    "description": "the storage pool capabilities",
+                    "name": "storagecapabilities",
+                    "type": "map"
+                }
+            ]
+        },
+        {
+            "description": "Adds an OpenDyalight controler",
+            "isasync": true,
+            "name": "addOpenDaylightController",
+            "params": [
+                {
+                    "description": "the Physical Network ID",
+                    "length": 255,
+                    "name": "physicalnetworkid",
+                    "related": "createPhysicalNetwork",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "Credential to access the OpenDaylight API",
+                    "length": 255,
+                    "name": "password",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "Username to access the OpenDaylight API",
+                    "length": 255,
+                    "name": "username",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "Api URL of the OpenDaylight Controller.",
+                    "length": 255,
+                    "name": "url",
+                    "required": true,
+                    "type": "string"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "device id of the controller",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the name assigned to the controller",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the url of the controller api",
+                    "name": "url",
+                    "type": "string"
+                },
+                {
+                    "description": "the username to authenticate to the controller",
+                    "name": "username",
+                    "type": "string"
+                },
+                {
+                    "description": "the physical network to which this controller belongs to",
+                    "name": "physicalnetworkid",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Creates a Zone.",
+            "isasync": false,
+            "name": "createZone",
+            "params": [
+                {
+                    "description": "network type of the zone, can be Basic or Advanced",
+                    "length": 255,
+                    "name": "networktype",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the first DNS for IPv6 network in the Zone",
+                    "length": 255,
+                    "name": "ip6dns1",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the containing domain, null for public zones",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the first DNS for the Zone",
+                    "length": 255,
+                    "name": "dns1",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "Network domain name for the networks in the zone",
+                    "length": 255,
+                    "name": "domain",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "Allocation state of this Zone for allocation of new resources",
+                    "length": 255,
+                    "name": "allocationstate",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the second DNS for the Zone",
+                    "length": 255,
+                    "name": "dns2",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the guest CIDR address for the Zone",
+                    "length": 255,
+                    "name": "guestcidraddress",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the second internal DNS for the Zone",
+                    "length": 255,
+                    "name": "internaldns2",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the first internal DNS for the Zone",
+                    "length": 255,
+                    "name": "internaldns1",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "true if local storage offering enabled, false otherwise",
+                    "length": 255,
+                    "name": "localstorageenabled",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "the name of the Zone",
+                    "length": 255,
+                    "name": "name",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the second DNS for IPv6 network in the Zone",
+                    "length": 255,
+                    "name": "ip6dns2",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "true if network is security group enabled, false otherwise",
+                    "length": 255,
+                    "name": "securitygroupenabled",
+                    "required": false,
+                    "type": "boolean"
+                }
+            ],
+            "related": "listZones",
+            "response": [
+                {
+                    "description": "Zone name",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the second DNS for the Zone",
+                    "name": "dns2",
+                    "type": "string"
+                },
+                {
+                    "description": "the second IPv6 DNS for the Zone",
+                    "name": "ip6dns2",
+                    "type": "string"
+                },
+                {
+                    "description": "true if security groups support is enabled, false otherwise",
+                    "name": "securitygroupsenabled",
+                    "type": "boolean"
+                },
+                {
+
+                },
+                {
+                    "description": "the display text of the zone",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "Meta data associated with the zone (key/value pairs)",
+                    "name": "resourcedetails",
+                    "type": "map"
+                },
+                {
+                    "description": "Zone description",
+                    "name": "description",
+                    "type": "string"
+                },
+                {
+                    "description": "the guest CIDR address for the Zone",
+                    "name": "guestcidraddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the first IPv6 DNS for the Zone",
+                    "name": "ip6dns1",
+                    "type": "string"
+                },
+                {
+                    "description": "the second internal DNS for the Zone",
+                    "name": "internaldns2",
+                    "type": "string"
+                },
+                {
+                    "description": "true if local storage offering enabled, false otherwise",
+                    "name": "localstorageenabled",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the allocation state of the cluster",
+                    "name": "allocationstate",
+                    "type": "string"
+                },
+                {
+                    "description": "the first internal DNS for the Zone",
+                    "name": "internaldns1",
+                    "type": "string"
+                },
+                {
+                    "description": "the capacity of the Zone",
+                    "name": "capacity",
+                    "response": [
+                        {
+                            "description": "the Zone name",
+                            "name": "zonename",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the total capacity available",
+                            "name": "capacitytotal",
+                            "type": "long"
+                        },
+                        {
+                            "description": "the Zone ID",
+                            "name": "zoneid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the capacity type",
+                            "name": "type",
+                            "type": "short"
+                        },
+                        {
+                            "description": "the Pod name",
+                            "name": "podname",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the capacity currently in use",
+                            "name": "capacityused",
+                            "type": "long"
+                        },
+                        {
+                            "description": "the Cluster ID",
+                            "name": "clusterid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the Cluster name",
+                            "name": "clustername",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the percentage of capacity currently in use",
+                            "name": "percentused",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the Pod ID",
+                            "name": "podid",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "Zone id",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of resource tags associated with zone.",
+                    "name": "tags",
+                    "response": [
+                        {
+                            "description": "the domain associated with the tag",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "id of the resource",
+                            "name": "resourceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "customer associated with the tag",
+                            "name": "customer",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag key name",
+                            "name": "key",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account associated with the tag",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the domain associated with the tag",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "resource type",
+                            "name": "resourcetype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project id the tag belongs to",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name where tag belongs to",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag value",
+                            "name": "value",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "the name of the containing domain, null for public zones",
+                    "name": "domainname",
+                    "type": "string"
+                },
+                {
+                    "description": "the first DNS for the Zone",
+                    "name": "dns1",
+                    "type": "string"
+                },
+                {
+                    "description": "the network type of the zone; can be Basic or Advanced",
+                    "name": "networktype",
+                    "type": "string"
+                },
+                {
+                    "description": "Zone Token",
+                    "name": "zonetoken",
+                    "type": "string"
+                },
+                {
+                    "description": "the dhcp Provider for the Zone",
+                    "name": "dhcpprovider",
+                    "type": "string"
+                },
+                {
+                    "description": "Network domain name for the networks in the zone",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the UUID of the containing domain, null for public zones",
+                    "name": "domainid",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "disable a Cisco Nexus VSM device",
+            "isasync": true,
+            "name": "disableCiscoNexusVSM",
+            "params": [
+                {
+                    "description": "Id of the Cisco Nexus 1000v VSM device to be deleted",
+                    "length": 255,
+                    "name": "id",
+                    "related": "listCiscoNexusVSMs,disableCiscoNexusVSM",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "listCiscoNexusVSMs",
+            "response": [
+                {
+                    "description": "The Device State (Enabled/Disabled) of the VSM",
+                    "name": "vsmdevicestate",
+                    "type": "string"
+                },
+                {
+                    "description": "the management IP address of the external Cisco Nexus 1000v Virtual Supervisor Module",
+                    "name": "ipaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "management vlan id of the VSM",
+                    "name": "vsmmgmtvlanid",
+                    "type": "string"
+                },
+                {
+                    "description": "The mode of the VSM (standalone/HA)",
+                    "name": "vsmconfigmode",
+                    "type": "string"
+                },
+                {
+                    "description": "device name",
+                    "name": "vsmdevicename",
+                    "type": "string"
+                },
+                {
+                    "description": "device id of the Cisco N1KV VSM device",
+                    "name": "vsmdeviceid",
+                    "type": "string"
+                },
+                {
+                    "description": "control vlan id of the VSM",
+                    "name": "vsmctrlvlanid",
+                    "type": "int"
+                },
+                {
+                    "description": "packet vlan id of the VSM",
+                    "name": "vsmpktvlanid",
+                    "type": "int"
+                },
+                {
+                    "description": "storage vlan id of the VSM",
+                    "name": "vsmstoragevlanid",
+                    "type": "int"
+                },
+                {
+                    "description": "device state",
+                    "name": "vsmdevicestate",
+                    "type": "string"
+                },
+                {
+                    "description": "The VSM is a switch supervisor. This is the VSM's switch domain id",
+                    "name": "vsmdomainid",
+                    "type": "string"
+                },
+                {
+                    "description": "The Config State (Primary/Standby) of the VSM",
+                    "name": "vsmconfigstate",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Creates a Storage network IP range.",
+            "isasync": true,
+            "name": "createStorageNetworkIpRange",
+            "params": [
+                {
+                    "description": "the netmask for storage network",
+                    "length": 255,
+                    "name": "netmask",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the ending IP address",
+                    "length": 255,
+                    "name": "endip",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the beginning IP address",
+                    "length": 255,
+                    "name": "startip",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "UUID of pod where the ip range belongs to",
+                    "length": 255,
+                    "name": "podid",
+                    "related": "updatePod",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "Optional. The vlan the ip range sits on, default to Null when it is not specificed which means you network is not on any Vlan. This is mainly for Vmware as other hypervisors can directly reterive bridge from pyhsical network traffic type table",
+                    "length": 255,
+                    "name": "vlan",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "the gateway for storage network",
+                    "length": 255,
+                    "name": "gateway",
+                    "required": true,
+                    "type": "string"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the network uuid of storage network IP range",
+                    "name": "networkid",
+                    "type": "string"
+                },
+                {
+                    "description": "the netmask of the storage network IP range",
+                    "name": "netmask",
+                    "type": "string"
+                },
+                {
+                    "description": "the start ip of the storage network IP range",
+                    "name": "startip",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID or VID of the VLAN.",
+                    "name": "vlan",
+                    "type": "integer"
+                },
+                {
+                    "description": "the Pod uuid for the storage network IP range",
+                    "name": "podid",
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone uuid of the storage network IP range",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the uuid of storage network IP range.",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the gateway of the storage network IP range",
+                    "name": "gateway",
+                    "type": "string"
+                },
+                {
+                    "description": "the end ip of the storage network IP range",
+                    "name": "endip",
+                    "type": "string"
+                }
+            ],
+            "since": "3.0.0"
+        },
+        {
+            "description": "Lists all children domains belonging to a specified domain",
+            "isasync": false,
+            "name": "listDomainChildren",
+            "params": [
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "If set to false, list only resources belonging to the command's caller; if set to true - list resources that the caller is authorized to see. Default value is false",
+                    "length": 255,
+                    "name": "listall",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "list children domains by name",
+                    "length": 255,
+                    "name": "name",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "list children domain by parent domain ID.",
+                    "length": 255,
+                    "name": "id",
+                    "related": "listDomainChildren,listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "to return the entire tree, use the value \"true\". To return the first level children, use the value \"false\".",
+                    "length": 255,
+                    "name": "isrecursive",
+                    "required": false,
+                    "type": "boolean"
+                }
+            ],
+            "related": "listDomains",
+            "response": [
+                {
+                    "description": "the total number of virtual machines deployed by this domain",
+                    "name": "vmtotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the ID of the domain",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the level of the domain",
+                    "name": "level",
+                    "type": "integer"
+                },
+                {
+                    "description": "the total number of public ip addresses allocated for this domain",
+                    "name": "iptotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of projects being administrated by this domain",
+                    "name": "projecttotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total volume which can be used by this domain",
+                    "name": "volumelimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the network domain",
+                    "name": "networkdomain",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of snapshots stored by this domain",
+                    "name": "snapshottotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the path of the domain",
+                    "name": "path",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of templates which have been created by this domain",
+                    "name": "templatetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total secondary storage space (in GiB) available to be used for this domain",
+                    "name": "secondarystorageavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "whether the domain has one or more sub-domains",
+                    "name": "haschild",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the total number of cpu cores the domain can own",
+                    "name": "cpulimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain ID of the parent domain",
+                    "name": "parentdomainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the total memory (in MB) available to be created for this domain",
+                    "name": "memoryavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain name of the parent domain",
+                    "name": "parentdomainname",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of templates which can be created by this domain",
+                    "name": "templatelimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of projects the domain can own",
+                    "name": "projectlimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of public ip addresses available for this domain to acquire",
+                    "name": "ipavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the domain",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of public ip addresses this domain can acquire",
+                    "name": "iplimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of virtual machines available for this domain to acquire",
+                    "name": "vmavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of templates available to be created by this domain",
+                    "name": "templateavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of vpcs the domain can own",
+                    "name": "vpclimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total primary storage space (in GiB) owned by domain",
+                    "name": "primarystoragetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of cpu cores available to be created for this domain",
+                    "name": "cpuavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of networks the domain can own",
+                    "name": "networklimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total secondary storage space (in GiB) owned by domain",
+                    "name": "secondarystoragetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total primary storage space (in GiB) available to be used for this domain",
+                    "name": "primarystorageavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of the domain",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the total volume available for this domain",
+                    "name": "volumeavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of networks owned by domain",
+                    "name": "networktotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of virtual machines that can be deployed by this domain",
+                    "name": "vmlimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of snapshots which can be stored by this domain",
+                    "name": "snapshotlimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total memory (in MB) owned by domain",
+                    "name": "memorytotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total primary storage space (in GiB) the domain can own",
+                    "name": "primarystoragelimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total memory (in MB) the domain can own",
+                    "name": "memorylimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of snapshots available for this domain",
+                    "name": "snapshotavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total volume being used by this domain",
+                    "name": "volumetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of networks available to be created for this domain",
+                    "name": "networkavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total secondary storage space (in GiB) the domain can own",
+                    "name": "secondarystoragelimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of vpcs owned by domain",
+                    "name": "vpctotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of projects available for administration by this domain",
+                    "name": "projectavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of vpcs available to be created for this domain",
+                    "name": "vpcavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of cpu cores owned by domain",
+                    "name": "cputotal",
+                    "type": "long"
+                }
+            ]
+        },
+        {
+            "description": "Returns an encrypted password for the VM",
+            "isasync": false,
+            "name": "getVMPassword",
+            "params": [
+                {
+                    "description": "The ID of the virtual machine",
+                    "length": 255,
+                    "name": "id",
+                    "related": "resetSSHKeyForVirtualMachine,attachIso,removeNicFromVirtualMachine,updateVMAffinityGroup,rebootVirtualMachine,restoreVirtualMachine,destroyVirtualMachine,stopVirtualMachine,detachIso,deployVirtualMachine,updateVirtualMachine,revertToVMSnapshot,resetPasswordForVirtualMachine,startVirtualMachine,updateDefaultNicForVirtualMachine,startVirtualMachine,attachIso,listVirtualMachines,addNicToVirtualMachine,stopVirtualMachine,destroyVirtualMachine,removeNicFromVirtualMachine,changeServiceForVirtualMachine",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "The base64 encoded encrypted password of the VM",
+                    "name": "encryptedpassword",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Assign load balancer rule or list of load balancer rules to a global load balancer rules.",
+            "isasync": true,
+            "name": "assignToGlobalLoadBalancerRule",
+            "params": [
+                {
+                    "description": "the ID of the global load balancer rule",
+                    "length": 255,
+                    "name": "id",
+                    "related": "",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the list load balancer rules that will be assigned to global load balancer rule",
+                    "length": 255,
+                    "name": "loadbalancerrulelist",
+                    "related": "",
+                    "required": true,
+                    "type": "list"
+                },
+                {
+                    "description": "Map of LB rule id's and corresponding weights (between 1-100) in the GSLB rule, if not specified weight of a LB rule is defaulted to 1. Specified as 'gslblbruleweightsmap[0].loadbalancerid=UUID&gslblbruleweightsmap[0].weight=10'",
+                    "length": 255,
+                    "name": "gslblbruleweightsmap",
+                    "required": false,
+                    "type": "map"
+                }
+            ],
+            "response": [
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "Configures an ovs element.",
+            "isasync": true,
+            "name": "configureOvsElement",
+            "params": [
+                {
+                    "description": "Enabled/Disabled the service provider",
+                    "length": 255,
+                    "name": "enabled",
+                    "required": true,
+                    "type": "boolean"
+                },
+                {
+                    "description": "the ID of the ovs provider",
+                    "length": 255,
+                    "name": "id",
+                    "related": "configureOvsElement",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the account associated with the provider",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain ID associated with the provider",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the id of the ovs",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain associated with the provider",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the address",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the physical network service provider id of the provider",
+                    "name": "nspid",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the ipaddress",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "Enabled/Disabled the service provider",
+                    "name": "enabled",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "Adds S3 Image Store",
+            "isasync": false,
+            "name": "addImageStoreS3",
+            "params": [
+                {
+                    "description": "Socket timeout (milliseconds)",
+                    "length": 255,
+                    "name": "sockettimeout",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "Use HTTPS instead of HTTP",
+                    "length": 255,
+                    "name": "usehttps",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "Signer Algorithm to use, either S3SignerType or AWSS3V4SignerType",
+                    "length": 255,
+                    "name": "s3signer",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "S3 endpoint",
+                    "length": 255,
+                    "name": "endpoint",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "S3 access key",
+                    "length": 255,
+                    "name": "accesskey",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "Name of the storage bucket",
+                    "length": 255,
+                    "name": "bucket",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "S3 secret key",
+                    "length": 255,
+                    "name": "secretkey",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "Maximum number of times to retry on error",
+                    "length": 255,
+                    "name": "maxerrorretry",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "Whether TCP keep-alive is used",
+                    "length": 255,
+                    "name": "usetcpkeepalive",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "Connection TTL (milliseconds)",
+                    "length": 255,
+                    "name": "connectionttl",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "Connection timeout (milliseconds)",
+                    "length": 255,
+                    "name": "connectiontimeout",
+                    "required": false,
+                    "type": "integer"
+                }
+            ],
+            "related": "listImageStores",
+            "response": [
+                {
+                    "description": "the provider name of the image store",
+                    "name": "providername",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the image store",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the url of the image store",
+                    "name": "url",
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone name of the image store",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone ID of the image store",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the protocol of the image store",
+                    "name": "protocol",
+                    "type": "string"
+                },
+                {
+                    "description": "the scope of the image store",
+                    "name": "scope",
+                    "type": "scopetype"
+                },
+                {
+                    "description": "the name of the image store",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the details of the image store",
+                    "name": "details",
+                    "type": "set"
+                }
+            ],
+            "since": "4.7.0"
+        },
+        {
+            "description": "Creates a physical network",
+            "isasync": true,
+            "name": "createPhysicalNetwork",
+            "params": [
+                {
+                    "description": "the name of the physical network",
+                    "length": 255,
+                    "name": "name",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the speed for the physical network[1G/10G]",
+                    "length": 255,
+                    "name": "networkspeed",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the VLAN for the physical network",
+                    "length": 255,
+                    "name": "vlan",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone ID for the physical network",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "domain ID of the account owning a physical network",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the isolation method for the physical network[VLAN/L3/GRE]",
+                    "length": 255,
+                    "name": "isolationmethods",
+                    "required": false,
+                    "type": "list"
+                },
+                {
+                    "description": "Tag the physical network",
+                    "length": 255,
+                    "name": "tags",
+                    "required": false,
+                    "type": "list"
+                },
+                {
+                    "description": "the broadcast domain range for the physical network[Pod or Zone]. In Acton release it can be Zone only in Advance zone, and Pod in Basic",
+                    "length": 255,
+                    "name": "broadcastdomainrange",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "zone id of the physical network",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain id of the physical network owner",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the uuid of the physical network",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "state of the physical network",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "comma separated tag",
+                    "name": "tags",
+                    "type": "string"
+                },
+                {
+                    "description": "Broadcast domain range of the physical network",
+                    "name": "broadcastdomainrange",
+                    "type": "string"
+                },
+                {
+                    "description": "the vlan of the physical network",
+                    "name": "vlan",
+                    "type": "string"
+                },
+                {
+                    "description": "name of the physical network",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the speed of the physical network",
+                    "name": "networkspeed",
+                    "type": "string"
+                },
+                {
+                    "description": "isolation methods",
+                    "name": "isolationmethods",
+                    "type": "string"
+                }
+            ],
+            "since": "3.0.0"
+        },
+        {
+            "description": "Lists autoscale vm groups.",
+            "isasync": false,
+            "name": "listAutoScaleVmGroups",
+            "params": [
+                {
+                    "description": "list resources by display flag; only ROOT admin is eligible to pass this parameter",
+                    "length": 255,
+                    "name": "fordisplay",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the ID of the autoscale vm group",
+                    "length": 255,
+                    "name": "id",
+                    "related": "listAutoScaleVmGroups",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "If set to false, list only resources belonging to the command's caller; if set to true - list resources that the caller is authorized to see. Default value is false",
+                    "length": 255,
+                    "name": "listall",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "the availability zone ID",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "list resources by account. Must be used with the domainId parameter.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the policy",
+                    "length": 255,
+                    "name": "policyid",
+                    "related": "",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "the ID of the loadbalancer",
+                    "length": 255,
+                    "name": "lbruleid",
+                    "related": "",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the ID of the profile",
+                    "length": 255,
+                    "name": "vmprofileid",
+                    "related": "createAutoScaleVmProfile",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.",
+                    "length": 255,
+                    "name": "isrecursive",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "list objects by project",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "activateProject",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list only resources belonging to the domain specified",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "listDomains",
+                    "required": false,
+                    "type": "uuid"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the maximum number of members in the vmgroup, The number of instances in the vm group will be equal to or less than this number.",
+                    "name": "maxmembers",
+                    "type": "int"
+                },
+                {
+                    "description": "the frequency at which the conditions have to be evaluated",
+                    "name": "interval",
+                    "type": "int"
+                },
+                {
+                    "description": "the account owning the instance group",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the autoscale vm group ID",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the autoscale profile that contains information about the vms in the vm group.",
+                    "name": "vmprofileid",
+                    "type": "string"
+                },
+                {
+                    "description": "the minimum number of members in the vmgroup, the number of instances in the vm group will be equal to or more than this number.",
+                    "name": "minmembers",
+                    "type": "int"
+                },
+                {
+                    "description": "the domain ID of the vm profile",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "list of scaledown autoscale policies",
+                    "name": "scaledownpolicies",
+                    "type": "list"
+                },
+                {
+                    "description": "list of scaleup autoscale policies",
+                    "name": "scaleuppolicies",
+                    "type": "list"
+                },
+                {
+                    "description": "is group for display to the regular user",
+                    "name": "fordisplay",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the domain name of the vm profile",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id vm profile",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the vm profile",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the load balancer rule ID",
+                    "name": "lbruleid",
+                    "type": "string"
+                },
+                {
+                    "description": "the current state of the AutoScale Vm Group",
+                    "name": "state",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Creates a firewall rule for a given IP address",
+            "isasync": true,
+            "name": "createFirewallRule",
+            "params": [
+                {
+                    "description": "the ending port of firewall rule",
+                    "length": 255,
+                    "name": "endport",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "type of firewallrule: system/user",
+                    "length": 255,
+                    "name": "type",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "an optional field, whether to the display the rule to the end user or not",
+                    "length": 255,
+                    "name": "fordisplay",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "boolean"
+                },
+                {
+                    "description": "type of the ICMP message being sent",
+                    "length": 255,
+                    "name": "icmptype",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "error code for this icmp message",
+                    "length": 255,
+                    "name": "icmpcode",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "the IP address id of the port forwarding rule",
+                    "length": 255,
+                    "name": "ipaddressid",
+                    "related": "associateIpAddress,listPublicIpAddresses",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the protocol for the firewall rule. Valid values are TCP/UDP/ICMP.",
+                    "length": 255,
+                    "name": "protocol",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the starting port of firewall rule",
+                    "length": 255,
+                    "name": "startport",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "the CIDR list to forward traffic from",
+                    "length": 255,
+                    "name": "cidrlist",
+                    "required": false,
+                    "type": "list"
+                }
+            ],
+            "related": "updateEgressFirewallRule",
+            "response": [
+                {
+                    "description": "the cidr list to forward traffic from",
+                    "name": "cidrlist",
+                    "type": "string"
+                },
+                {
+                    "description": "the public ip address id for the firewall rule",
+                    "name": "ipaddressid",
+                    "type": "string"
+                },
+                {
+                    "description": "type of the icmp message being sent",
+                    "name": "icmptype",
+                    "type": "integer"
+                },
+                {
+                    "description": "the network id of the firewall rule",
+                    "name": "networkid",
+                    "type": "string"
+                },
+                {
+                    "description": "the protocol of the firewall rule",
+                    "name": "protocol",
+                    "type": "string"
+                },
+                {
+                    "description": "the public ip address for the firewall rule",
+                    "name": "ipaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "error code for this icmp message",
+                    "name": "icmpcode",
+                    "type": "integer"
+                },
+                {
+                    "description": "the ending port of firewall rule's port range",
+                    "name": "endport",
+                    "type": "integer"
+                },
+                {
+                    "description": "the starting port of firewall rule's port range",
+                    "name": "startport",
+                    "type": "integer"
+                },
+                {
+                    "description": "is rule for display to the regular user",
+                    "name": "fordisplay",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the state of the rule",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the firewall rule",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of resource tags associated with the rule",
+                    "name": "tags",
+                    "response": [
+                        {
+                            "description": "the project name where tag belongs to",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag key name",
+                            "name": "key",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag value",
+                            "name": "value",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project id the tag belongs to",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain associated with the tag",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account associated with the tag",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "id of the resource",
+                            "name": "resourceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "customer associated with the tag",
+                            "name": "customer",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the domain associated with the tag",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "resource type",
+                            "name": "resourcetype",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                }
+            ]
+        },
+        {
+            "description": "Creates a disk volume from a disk offering. This disk volume must still be attached to a virtual machine to make use of it.",
+            "isasync": true,
+            "name": "createVolume",
+            "params": [
+                {
+                    "description": "an optional field, whether to display the volume to the end user or not.",
+                    "length": 255,
+                    "name": "displayvolume",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "the name of the disk volume",
+                    "length": 255,
+                    "name": "name",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the domain ID associated with the disk offering. If used with the account parameter returns the disk volume associated with the account for the specified domain.",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the snapshot ID for the disk volume. Either diskOfferingId or snapshotId must be passed in.",
+                    "length": 255,
+                    "name": "snapshotid",
+                    "related": "",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the account associated with the disk volume. Must be used with the domainId parameter.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the disk offering. Either diskOfferingId or snapshotId must be passed in.",
+                    "length": 255,
+                    "name": "diskofferingid",
+                    "related": "",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the ID of the availability zone",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "an optional field, in case you want to set a custom id to the resource. Allowed to Root Admins only",
+                    "length": 255,
+                    "name": "customid",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the virtual machine; to be used with snapshot Id, VM to which the volume gets attached after creation",
+                    "length": 255,
+                    "name": "virtualmachineid",
+                    "related": "resetSSHKeyForVirtualMachine,attachIso,removeNicFromVirtualMachine,updateVMAffinityGroup,rebootVirtualMachine,restoreVirtualMachine,destroyVirtualMachine,stopVirtualMachine,detachIso,deployVirtualMachine,updateVirtualMachine,revertToVMSnapshot,resetPasswordForVirtualMachine,startVirtualMachine,updateDefaultNicForVirtualMachine,startVirtualMachine,attachIso,listVirtualMachines,addNicToVirtualMachine,stopVirtualMachine,destroyVirtualMachine,removeNicFromVirtualMachine,changeServiceForVirtualMachine",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "max iops",
+                    "length": 255,
+                    "name": "maxiops",
+                    "required": false,
+                    "type": "long"
+                },
+                {
+                    "description": "Arbitrary volume size",
+                    "length": 255,
+                    "name": "size",
+                    "required": false,
+                    "type": "long"
+                },
+                {
+                    "description": "the project associated with the volume. Mutually exclusive with account parameter",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "activateProject",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "min iops",
+                    "length": 255,
+                    "name": "miniops",
+                    "required": false,
+                    "type": "long"
+                }
+            ],
+            "related": "updateVolume,listVolumes,uploadVolume,attachVolume,detachVolume,resizeVolume,migrateVolume,createVolume",
+            "response": [
+                {
+                    "description": "the account associated with the disk volume",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "min iops of the disk volume",
+                    "name": "miniops",
+                    "type": "long"
+                },
+                {
+                    "description": "name of the availability zone",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the device on user vm the volume is attahed to. This tag is not returned when the volume is detached.",
+                    "name": "deviceid",
+                    "type": "long"
+                },
+                {
+                    "description": "Hypervisor the volume belongs to",
+                    "name": "hypervisor",
+                    "type": "string"
+                },
+                {
+                    "description": "name of the disk volume",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "true if the volume is extractable, false otherwise",
+                    "name": "isextractable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "an optional field whether to the display the volume to the end user or not.",
+                    "name": "displayvolume",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the ID of the domain associated with the disk volume",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "name of the disk offering",
+                    "name": "diskofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "an alternate display text of the ISO attached to the virtual machine",
+                    "name": "isodisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "provisioning type used to create volumes.",
+                    "name": "provisioningtype",
+                    "type": "string"
+                },
+                {
+                    "description": "the date the volume was attached to a VM instance",
+                    "name": "attached",
+                    "type": "date"
+                },
+                {
+                    "description": "ID of the service offering for root disk",
+                    "name": "serviceofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "the display text of the service offering for root disk",
+                    "name": "serviceofferingdisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "ID of the snapshot from which this volume was created",
+                    "name": "snapshotid",
+                    "type": "string"
+                },
+                {
+                    "description": " an alternate display text of the template for the virtual machine",
+                    "name": "templatedisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "name of the primary storage hosting the disk volume",
+                    "name": "storage",
+                    "type": "string"
+                },
+                {
+                    "description": "id of the primary storage hosting the disk volume; returned to admin user only",
+                    "name": "storageid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the ISO attached to the virtual machine",
+                    "name": "isoid",
+                    "type": "string"
+                },
+                {
+                    "description": "ID of the availability zone",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the vpn",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "display name of the virtual machine",
+                    "name": "vmdisplayname",
+                    "type": "string"
+                },
+                {
+                    "description": "bytes write rate of the disk volume",
+                    "name": "diskBytesWriteRate",
+                    "type": "long"
+                },
+                {
+                    "description": "io requests read rate of the disk volume",
+                    "name": "diskIopsReadRate",
+                    "type": "long"
+                },
+                {
+                    "description": "the boolean state of whether the volume is destroyed or not",
+                    "name": "destroyed",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the date the disk volume was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "max iops of the disk volume",
+                    "name": "maxiops",
+                    "type": "long"
+                },
+                {
+                    "description": "the name of the ISO attached to the virtual machine",
+                    "name": "isoname",
+                    "type": "string"
+                },
+                {
+                    "description": "name of the service offering for root disk",
+                    "name": "serviceofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "shared or local storage",
+                    "name": "storagetype",
+                    "type": "string"
+                },
+                {
+                    "description": "name of the virtual machine",
+                    "name": "vmname",
+                    "type": "string"
+                },
+                {
+                    "description": "type of the disk volume (ROOT or DATADISK)",
+                    "name": "type",
+                    "type": "string"
+                },
+                {
+                    "description": "size of the disk volume",
+                    "name": "size",
+                    "type": "long"
+                },
+                {
+                    "description": "the domain associated with the disk volume",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "bytes read rate of the disk volume",
+                    "name": "diskBytesReadRate",
+                    "type": "long"
+                },
+                {
+                    "description": "io requests write rate of the disk volume",
+                    "name": "diskIopsWriteRate",
+                    "type": "long"
+                },
+                {
+                    "description": "ID of the disk offering",
+                    "name": "diskofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the template for the virtual machine",
+                    "name": "templatename",
+                    "type": "string"
+                },
+                {
+                    "description": "state of the virtual machine",
+                    "name": "vmstate",
+                    "type": "string"
+                },
+                {
+                    "description": "ID of the disk volume",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the path of the volume",
+                    "name": "path",
+                    "type": "string"
+                },
+                {
+                    "description": "the display text of the disk offering",
+                    "name": "diskofferingdisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the vpn",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "need quiesce vm or not when taking snapshot",
+                    "name": "quiescevm",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the chain info of the volume",
+                    "name": "chaininfo",
+                    "type": "string"
+                },
+                {
+                    "description": "id of the virtual machine",
+                    "name": "virtualmachineid",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of the disk volume",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the template for the virtual machine. A -1 is returned if the virtual machine was created from an ISO file.",
+                    "name": "templateid",
+                    "type": "string"
+                },
+                {
+                    "description": "the status of the volume",
+                    "name": "status",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "lists network that are using a F5 load balancer device",
+            "isasync": false,
+            "name": "listF5LoadBalancerNetworks",
+            "params": [
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "f5 load balancer device ID",
+                    "length": 255,
+                    "name": "lbdeviceid",
+                    "related": "",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "updateNetwork,createNetwork,listNetworks",
+            "response": [
+                {
+                    "description": "the cidr of IPv6 network",
+                    "name": "ip6cidr",
+                    "type": "string"
+                },
+                {
+                    "description": "broadcast uri of the network. This parameter is visible to ROOT admins only",
+                    "name": "broadcasturi",
+                    "type": "string"
+                },
+                {
+                    "description": "The vlan of the network. This parameter is visible to ROOT admins only",
+                    "name": "vlan",
+                    "type": "string"
+                },
+                {
+                    "description": "Broadcast domain type of the network",
+                    "name": "broadcastdomaintype",
+                    "type": "string"
+                },
+                {
+                    "description": "true if network can span multiple zones",
+                    "name": "strechedl2subnet",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the physical network id",
+                    "name": "physicalnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "the network's IP range not to be used by CloudStack guest VMs and can be used for non CloudStack purposes",
+                    "name": "reservediprange",
+                    "type": "string"
+                },
+                {
+                    "description": "name of the network offering the network is created from",
+                    "name": "networkofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "true network requires restart",
+                    "name": "restartrequired",
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if network is default, false otherwise",
+                    "name": "isdefault",
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if network is system, false otherwise",
+                    "name": "issystem",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the project id of the ipaddress",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain name of the network owner",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the second DNS for the network",
+                    "name": "dns2",
+                    "type": "string"
+                },
+                {
+                    "description": "network offering id the network is created from",
+                    "name": "networkofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "the network CIDR of the guest network configured with IP reservation. It is the summation of CIDR and RESERVED_IP_RANGE",
+                    "name": "networkcidr",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of resource tags associated with network",
+                    "name": "tags",
+                    "response": [
+                        {
+                            "description": "tag key name",
+                            "name": "key",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name where tag belongs to",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain associated with the tag",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account associated with the tag",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "customer associated with the tag",
+                            "name": "customer",
+                            "type": "string"
+                        },
+                        {
+                            "description": "id of the resource",
+                            "name": "resourceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project id the tag belongs to",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag value",
+                            "name": "value",
+                            "type": "string"
+                        },
+                        {
+                            "description": "resource type",
+                            "name": "resourcetype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the domain associated with the tag",
+                            "name": "domainid",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "the traffic type of the network",
+                    "name": "traffictype",
+                    "type": "string"
+                },
+                {
+                    "description": "the type of the network",
+                    "name": "type",
+                    "type": "string"
+                },
+                {
+                    "description": "the displaytext of the network",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "the owner of the network",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "If a network is enabled for 'streched l2 subnet' then represents zones on which network currently spans",
+                    "name": "zonesnetworkspans",
+                    "type": "set"
+                },
+                {
+                    "description": "acl type - access type to the network",
+                    "name": "acltype",
+                    "type": "string"
+                },
+                {
+                    "description": "the first DNS for the network",
+                    "name": "dns1",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain id of the network owner",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "true if network supports specifying ip ranges, false otherwise",
+                    "name": "specifyipranges",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the name of the network",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "ACL Id associated with the VPC network",
+                    "name": "aclid",
+                    "type": "string"
+                },
+                {
+                    "description": "the network's gateway",
+                    "name": "gateway",
+                    "type": "string"
+                },
+                {
+                    "description": "state of the network",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the gateway of IPv6 network",
+                    "name": "ip6gateway",
+                    "type": "string"
+                },
+                {
+                    "description": "zone id of the network",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "true if users from subdomains can access the domain level network",
+                    "name": "subdomainaccess",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the id of the network",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "availability of the network offering the network is created from",
+                    "name": "networkofferingavailability",
+                    "type": "string"
+                },
+                {
+                    "description": "list networks available for vm deployment",
+                    "name": "canusefordeploy",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the project name of the address",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "VPC the network belongs to",
+                    "name": "vpcid",
+                    "type": "string"
+                },
+                {
+                    "description": "the network's netmask",
+                    "name": "netmask",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the zone the network belongs to",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the network domain",
+                    "name": "networkdomain",
+                    "type": "string"
+                },
+                {
+                    "description": "Cloudstack managed address space, all CloudStack managed VMs get IP address from CIDR",
+                    "name": "cidr",
+                    "type": "string"
+                },
+                {
+                    "description": "an optional field, whether to the display the network to the end user or not.",
+                    "name": "displaynetwork",
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if network offering is ip conserve mode enabled",
+                    "name": "networkofferingconservemode",
+                    "type": "boolean"
+                },
+                {
+                    "description": "list networks that are persistent",
+                    "name": "ispersistent",
+                    "type": "boolean"
+                },
+                {
+                    "description": "display text of the network offering the network is created from",
+                    "name": "networkofferingdisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "related to what other network configuration",
+                    "name": "related",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of services",
+                    "name": "service",
+                    "response": [
+                        {
+                            "description": "the list of capabilities",
+                            "name": "capability",
+                            "response": [
+                                {
+                                    "description": "the capability value",
+                                    "name": "value",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "can this service capability value can be choosable while creatine network offerings",
+                                    "name": "canchooseservicecapability",
+                                    "type": "boolean"
+                                },
+                                {
+                                    "description": "the capability name",
+                                    "name": "name",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "list"
+                        },
+                        {
+                            "description": "the service name",
+                            "name": "name",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the service provider name",
+                            "name": "provider",
+                            "response": [
+                                {
+                                    "description": "state of the network provider",
+                                    "name": "state",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "uuid of the network provider",
+                                    "name": "id",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the physical network this belongs to",
+                                    "name": "physicalnetworkid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "true if individual services can be enabled/disabled",
+                                    "name": "canenableindividualservice",
+                                    "type": "boolean"
+                                },
+                                {
+                                    "description": "the provider name",
+                                    "name": "name",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the destination physical network",
+                                    "name": "destinationphysicalnetworkid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "services for this provider",
+                                    "name": "servicelist",
+                                    "type": "list"
+                                }
+                            ],
+                            "type": "list"
+                        }
+                    ],
+                    "type": "list"
+                }
+            ]
+        },
+        {
+            "description": "List virtual machine snapshot by conditions",
+            "isasync": false,
+            "name": "listVMSnapshot",
+            "params": [
+                {
+                    "description": "the ID of the vm",
+                    "length": 255,
+                    "name": "virtualmachineid",
+                    "related": "resetSSHKeyForVirtualMachine,attachIso,removeNicFromVirtualMachine,updateVMAffinityGroup,rebootVirtualMachine,restoreVirtualMachine,destroyVirtualMachine,stopVirtualMachine,detachIso,deployVirtualMachine,updateVirtualMachine,revertToVMSnapshot,resetPasswordForVirtualMachine,startVirtualMachine,updateDefaultNicForVirtualMachine,startVirtualMachine,attachIso,listVirtualMachines,addNicToVirtualMachine,stopVirtualMachine,destroyVirtualMachine,removeNicFromVirtualMachine,changeServiceForVirtualMachine",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "state of the virtual machine snapshot",
+                    "length": 255,
+                    "name": "state",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "List resources by tags (key/value pairs)",
+                    "length": 255,
+                    "name": "tags",
+                    "required": false,
+                    "type": "map"
+                },
+                {
+                    "description": "list objects by project",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "activateProject",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "The ID of the VM snapshot",
+                    "length": 255,
+                    "name": "vmsnapshotid",
+                    "related": "createVMSnapshot,listVMSnapshot",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the IDs of the vm snapshots, mutually exclusive with vmsnapshotid",
+                    "length": 255,
+                    "name": "vmsnapshotids",
+                    "related": "createVMSnapshot,listVMSnapshot",
+                    "required": false,
+                    "since": "4.9",
+                    "type": "list"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "list only resources belonging to the domain specified",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.",
+                    "length": 255,
+                    "name": "isrecursive",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "lists snapshot by snapshot name or display name",
+                    "length": 255,
+                    "name": "name",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "list resources by account. Must be used with the domainId parameter.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "If set to false, list only resources belonging to the command's caller; if set to true - list resources that the caller is authorized to see. Default value is false",
+                    "length": 255,
+                    "name": "listall",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                }
+            ],
+            "related": "createVMSnapshot",
+            "response": [
+                {
+                    "description": "the parent ID of the vm snapshot",
+                    "name": "parent",
+                    "type": "string"
+                },
+                {
+                    "description": "the description of the vm snapshot",
+                    "name": "description",
+                    "type": "string"
+                },
+                {
+                    "description": "the account associated with the disk volume",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "VM Snapshot type",
+                    "name": "type",
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone ID of the vm snapshot",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the vm snapshot",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the parent displayName of the vm snapshot",
+                    "name": "parentName",
+                    "type": "string"
+                },
+                {
+                    "description": "the vm ID of the vm snapshot",
+                    "name": "virtualmachineid",
+                    "type": "string"
+                },
+                {
+                    "description": "the display name of the vm snapshot",
+                    "name": "displayname",
+                    "type": "string"
+                },
+                {
+                    "description": "indiates if this is current snapshot",
+                    "name": "current",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the name of the vm snapshot",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of the vm snapshot",
+                    "name": "state",
+                    "type": "state"
+                },
+                {
+                    "description": "the create date of the vm snapshot",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the ID of the domain associated with the disk volume",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the vpn",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain associated with the disk volume",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the vpn",
+                    "name": "project",
+                    "type": "string"
+                }
+            ],
+            "since": "4.2.0"
+        },
+        {
+            "description": "Updates a Pod.",
+            "isasync": false,
+            "name": "updatePod",
+            "params": [
+                {
+                    "description": "Allocation state of this cluster for allocation of new resources",
+                    "length": 255,
+                    "name": "allocationstate",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the Pod",
+                    "length": 255,
+                    "name": "id",
+                    "related": "updatePod",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the netmask of the Pod",
+                    "length": 255,
+                    "name": "netmask",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the ending IP address for the Pod",
+                    "length": 255,
+                    "name": "endip",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the gateway for the Pod",
+                    "length": 255,
+                    "name": "gateway",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the starting IP address for the Pod",
+                    "length": 255,
+                    "name": "startip",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the Pod",
+                    "length": 255,
+                    "name": "name",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the netmask of the Pod",
+                    "name": "netmask",
+                    "type": "string"
+                },
+                {
+                    "description": "the ending IP for the Pod",
+                    "name": "endip",
+                    "type": "string"
+                },
+                {
+                    "description": "the gateway of the Pod",
+                    "name": "gateway",
+                    "type": "string"
+                },
+                {
+                    "description": "the starting IP for the Pod",
+                    "name": "startip",
+                    "type": "string"
+                },
+                {
+                    "description": "the capacity of the Pod",
+                    "name": "capacity",
+                    "response": [
+                        {
+                            "description": "the Cluster ID",
+                            "name": "clusterid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the Zone name",
+                            "name": "zonename",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the Zone ID",
+                            "name": "zoneid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the capacity type",
+                            "name": "type",
+                            "type": "short"
+                        },
+                        {
+                            "description": "the percentage of capacity currently in use",
+                            "name": "percentused",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the Cluster name",
+                            "name": "clustername",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the Pod ID",
+                            "name": "podid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the total capacity available",
+                            "name": "capacitytotal",
+                            "type": "long"
+                        },
+                        {
+                            "description": "the Pod name",
+                            "name": "podname",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the capacity currently in use",
+                            "name": "capacityused",
+                            "type": "long"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "the Zone ID of the Pod",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the allocation state of the Pod",
+                    "name": "allocationstate",
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone name of the Pod",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the Pod",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the Pod",
+                    "name": "id",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Attaches an ISO to a virtual machine.",
+            "isasync": true,
+            "name": "attachIso",
+            "params": [
+                {
+                    "description": "the ID of the virtual machine",
+                    "length": 255,
+                    "name": "virtualmachineid",
+                    "related": "resetSSHKeyForVirtualMachine,attachIso,removeNicFromVirtualMachine,updateVMAffinityGroup,rebootVirtualMachine,restoreVirtualMachine,destroyVirtualMachine,stopVirtualMachine,detachIso,deployVirtualMachine,updateVirtualMachine,revertToVMSnapshot,resetPasswordForVirtualMachine,startVirtualMachine,updateDefaultNicForVirtualMachine,startVirtualMachine,attachIso,listVirtualMachines,addNicToVirtualMachine,stopVirtualMachine,destroyVirtualMachine,removeNicFromVirtualMachine,changeServiceForVirtualMachine",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the ID of the ISO file",
+                    "length": 255,
+                    "name": "id",
+                    "related": "copyTemplate,registerTemplate,listTemplates,registerIso,listIsos,createTemplate,copyIso",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "resetSSHKeyForVirtualMachine,removeNicFromVirtualMachine,updateVMAffinityGroup,rebootVirtualMachine,restoreVirtualMachine,destroyVirtualMachine,stopVirtualMachine,detachIso,deployVirtualMachine,updateVirtualMachine,revertToVMSnapshot,resetPasswordForVirtualMachine,startVirtualMachine,updateDefaultNicForVirtualMachine,startVirtualMachine,attachIso,listVirtualMachines,addNicToVirtualMachine,stopVirtualMachine,destroyVirtualMachine,removeNicFromVirtualMachine,changeServiceForVirtualMachine",
+            "response": [
+                {
+                    "description": "the name of the domain in which the virtual machine exists",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the host for the virtual machine",
+                    "name": "hostname",
+                    "type": "string"
+                },
+                {
+                    "description": "the number of cpu this virtual machine is running with",
+                    "name": "cpunumber",
+                    "type": "integer"
+                },
+                {
+                    "description": "list of security groups associated with the virtual machine",
+                    "name": "securitygroup",
+                    "response": [
+                        {
+                            "description": "the ID of the security group",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of virtualmachine ids associated with this securitygroup",
+                            "name": "virtualmachineids",
+                            "type": "set"
+                        },
+                        {
+                            "description": "the list of resource tags associated with the rule",
+                            "name": "tags",
+                            "response": [
+                                {
+                                    "description": "the account associated with the tag",
+                                    "name": "account",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the ID of the domain associated with the tag",
+                                    "name": "domainid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the project name where tag belongs to",
+                                    "name": "project",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the project id the tag belongs to",
+                                    "name": "projectid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "customer associated with the tag",
+                                    "name": "customer",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "resource type",
+                                    "name": "resourcetype",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "id of the resource",
+                                    "name": "resourceid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the domain associated with the tag",
+                                    "name": "domain",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "tag key name",
+                                    "name": "key",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "tag value",
+                                    "name": "value",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "set"
+                        },
+                        {
+                            "description": "the description of the security group",
+                            "name": "description",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account owning the security group",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the name of the security group",
+                            "name": "name",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name of the group",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain ID of the security group",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain name of the security group",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the number of virtualmachines associated with this securitygroup",
+                            "name": "virtualmachinecount",
+                            "type": "integer"
+                        },
+                        {
+                            "description": "the list of egress rules associated with the security group",
+                            "name": "egressrule",
+                            "response": [
+                                {
+                                    "description": "the type of the ICMP message response",
+                                    "name": "icmptype",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the code for the ICMP message response",
+                                    "name": "icmpcode",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the protocol of the security group rule",
+                                    "name": "protocol",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the ending IP of the security group rule ",
+                                    "name": "endport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the CIDR notation for the base IP address of the security group rule",
+                                    "name": "cidr",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the id of the security group rule",
+                                    "name": "ruleid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the starting IP of the security group rule",
+                                    "name": "startport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "account owning the security group rule",
+                                    "name": "account",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the list of resource tags associated with the rule",
+                                    "name": "tags",
+                                    "response": [
+                                        {
+                                            "description": "customer associated with the tag",
+                                            "name": "customer",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the ID of the domain associated with the tag",
+                                            "name": "domainid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "resource type",
+                                            "name": "resourcetype",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project id the tag belongs to",
+                                            "name": "projectid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the domain associated with the tag",
+                                            "name": "domain",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project name where tag belongs to",
+                                            "name": "project",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag value",
+                                            "name": "value",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "id of the resource",
+                                            "name": "resourceid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the account associated with the tag",
+                                            "name": "account",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag key name",
+                                            "name": "key",
+                                            "type": "string"
+                                        }
+                                    ],
+                                    "type": "set"
+                                },
+                                {
+                                    "description": "security group name",
+                                    "name": "securitygroupname",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "set"
+                        },
+                        {
+                            "description": "the list of ingress rules associated with the security group",
+                            "name": "ingressrule",
+                            "response": [
+                                {
+                                    "description": "the protocol of the security group rule",
+                                    "name": "protocol",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the starting IP of the security group rule",
+                                    "name": "startport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the code for the ICMP message response",
+                                    "name": "icmpcode",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the CIDR notation for the base IP address of the security group rule",
+                                    "name": "cidr",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the id of the security group rule",
+                                    "name": "ruleid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "security group name",
+                                    "name": "securitygroupname",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the list of resource tags associated with the rule",
+                                    "name": "tags",
+                                    "response": [
+                                        {
+                                            "description": "the project id the tag belongs to",
+                                            "name": "projectid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project name where tag belongs to",
+                                            "name": "project",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag value",
+                                            "name": "value",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "id of the resource",
+                                            "name": "resourceid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the account associated with the tag",
+                                            "name": "account",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "customer associated with the tag",
+                                            "name": "customer",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the ID of the domain associated with the tag",
+                                            "name": "domainid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the domain associated with the tag",
+                                            "name": "domain",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "resource type",
+                                            "name": "resourcetype",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag key name",
+                                            "name": "key",
+                                            "type": "string"
+                                        }
+                                    ],
+                                    "type": "set"
+                                },
+                                {
+                                    "description": "the ending IP of the security group rule ",
+                                    "name": "endport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "account owning the security group rule",
+                                    "name": "account",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the type of the ICMP message response",
+                                    "name": "icmptype",
+                                    "type": "integer"
+                                }
+                            ],
+                            "type": "set"
+                        },
+                        {
+                            "description": "the project id of the group",
+                            "name": "projectid",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "the read (io) of disk on the vm",
+                    "name": "diskioread",
+                    "type": "long"
+                },
+                {
+                    "description": "State of the Service from LB rule",
+                    "name": "servicestate",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the disk offering of the virtual machine",
+                    "name": "diskofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "instance name of the user vm; this parameter is returned to the ROOT admin only",
+                    "name": "instancename",
+                    "type": "string"
+                },
+                {
+                    "description": "the incoming network traffic on the vm",
+                    "name": "networkkbsread",
+                    "type": "long"
+                },
+                {
+                    "description": "the memory used by the vm",
+                    "name": "memorykbs",
+                    "type": "long"
+                },
+                {
+                    "description": "the ID of the template for the virtual machine. A -1 is returned if the virtual machine was created from an ISO file.",
+                    "name": "templateid",
+                    "type": "string"
+                },
+                {
+                    "description": "the read (bytes) of disk on the vm",
+                    "name": "diskkbsread",
+                    "type": "long"
+                },
+                {
+                    "description": "the amount of the vm's CPU currently used",
+                    "name": "cpuused",
+                    "type": "string"
+                },
+                {
+                    "description": "the group name of the virtual machine",
+                    "name": "group",
+                    "type": "string"
+                },
+                {
+                    "description": "the hypervisor on which the template runs",
+                    "name": "hypervisor",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the availability zone for the virtual machine",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "true if vm contains XS/VMWare tools inorder to support dynamic scaling of VM cpu/memory.",
+                    "name": "isdynamicallyscalable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the outgoing network traffic on the host",
+                    "name": "networkkbswrite",
+                    "type": "long"
+                },
+                {
+                    "description": "the list of nics associated with vm",
+                    "name": "nic",
+                    "response": [
+                        {
+                            "description": "the gateway of IPv6 network",
+                            "name": "ip6gateway",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ip address of the nic",
+                            "name": "ipaddress",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the NSX Logical Switch (if NSX based), null otherwise",
+                            "name": "nsxlogicalswitch",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if nic is default, false otherwise",
+                            "name": "isdefault",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "the cidr of IPv6 network",
+                            "name": "ip6cidr",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the broadcast uri of the nic",
+                            "name": "broadcasturi",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the vm to which the nic belongs",
+                            "name": "virtualmachineid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the corresponding network",
+                            "name": "networkid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the nic",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the IPv6 address of network",
+                            "name": "ip6address",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the gateway of the nic",
+                            "name": "gateway",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the type of the nic",
+                            "name": "type",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the traffic type of the nic",
+                            "name": "traffictype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the Secondary ipv4 addr of nic",
+                            "name": "secondaryip",
+                            "type": "list"
+                        },
+                        {
+                            "description": "the name of the corresponding network",
+                            "name": "networkname",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the isolation uri of the nic",
+                            "name": "isolationuri",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if nic is default, false otherwise",
+                            "name": "macaddress",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the netmask of the nic",
+                            "name": "netmask",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the NSX Logical Switch Port (if NSX based), null otherwise",
+                            "name": "nsxlogicalswitchport",
+                            "type": "string"
+                        },
+                        {
+                            "description": "device id for the network when plugged into the virtual machine",
+                            "name": "deviceid",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "the group ID of the virtual machine",
+                    "name": "groupid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the ISO attached to the virtual machine",
+                    "name": "isoid",
+                    "type": "string"
+                },
+                {
+                    "description": "the write (bytes) of disk on the vm",
+                    "name": "diskkbswrite",
+                    "type": "long"
+                },
+                {
+                    "description": "list of affinity groups associated with the virtual machine",
+                    "name": "affinitygroup",
+                    "response": [
+                        {
+                            "description": "the name of the affinity group",
+                            "name": "name",
+                            "type": "string"
+                        },
+                        {
+                            "description": "virtual machine IDs associated with this affinity group",
+                            "name": "virtualmachineIds",
+                            "type": "list"
+                        },
+                        {
+                            "description": "the description of the affinity group",
+                            "name": "description",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain name of the affinity group",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account owning the affinity group",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the affinity group",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name of the affinity group",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain ID of the affinity group",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project ID of the affinity group",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the type of the affinity group",
+                            "name": "type",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "the name of the virtual machine",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the user's ID who deployed the virtual machine",
+                    "name": "userid",
+                    "type": "string"
+                },
+                {
+                    "description": "device ID of the root volume",
+                    "name": "rootdeviceid",
+                    "type": "long"
+                },
+                {
+                    "description": " an alternate display text of the template for the virtual machine",
+                    "name": "templatedisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "the target memory in vm",
+                    "name": "memorytargetkbs",
+                    "type": "long"
+                },
+                {
+                    "description": "the name of the service offering of the virtual machine",
+                    "name": "serviceofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "the vgpu type used by the virtual machine",
+                    "name": "vgpu",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the disk offering of the virtual machine",
+                    "name": "diskofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "the internal memory thats free in vm",
+                    "name": "memoryintfreekbs",
+                    "type": "long"
+                },
+                {
+                    "description": "the memory allocated for the virtual machine",
+                    "name": "memory",
+                    "type": "integer"
+                },
+                {
+                    "description": "public IP address id associated with vm via Static nat rule",
+                    "name": "publicip",
+                    "type": "string"
+                },
+                {
+                    "description": "the virtual network for the service offering",
+                    "name": "forvirtualnetwork",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the name of the template for the virtual machine",
+                    "name": "templatename",
+                    "type": "string"
+                },
+                {
+                    "description": "Os type ID of the virtual machine",
+                    "name": "guestosid",
+                    "type": "string"
+                },
+                {
+                    "description": "the user's name who deployed the virtual machine",
+                    "name": "username",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the domain in which the virtual machine exists",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the availablility zone for the virtual machine",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the vm",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "ssh key-pair",
+                    "name": "keypair",
+                    "type": "string"
+                },
+                {
+                    "description": "an alternate display text of the ISO attached to the virtual machine",
+                    "name": "isodisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the virtual machine",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the write (io) of disk on the vm",
+                    "name": "diskiowrite",
+                    "type": "long"
+                },
+                {
+                    "description": "the name of the ISO attached to the virtual machine",
+                    "name": "isoname",
+                    "type": "string"
+                },
+                {
+                    "description": "true if the password rest feature is enabled, false otherwise",
+                    "name": "passwordenabled",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the ID of the service offering of the virtual machine",
+                    "name": "serviceofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "Vm details in key/value pairs.",
+                    "name": "details",
+                    "type": "map"
+                },
+                {
+
+                },
+                {
+                    "description": "the date when this virtual machine was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the project id of the vm",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "user generated name. The name of the virtual machine is returned if no displayname exists.",
+                    "name": "displayname",
+                    "type": "string"
+                },
+                {
+                    "description": "true if high-availability is enabled, false otherwise",
+                    "name": "haenable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "OS type id of the vm",
+                    "name": "ostypeid",
+                    "type": "long"
+                },
+                {
+                    "description": "the state of the virtual machine",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the account associated with the virtual machine",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "device type of the root volume",
+                    "name": "rootdevicetype",
+                    "type": "string"
+                },
+                {
+                    "description": "the password (if exists) of the virtual machine",
+                    "name": "password",
+                    "type": "string"
+                },
+                {
+                    "description": "an optional field whether to the display the vm to the end user or not.",
+                    "name": "displayvm",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the ID of the host for the virtual machine",
+                    "name": "hostid",
+                    "type": "string"
+                },
+                {
+                    "description": "public IP address id associated with vm via Static nat rule",
+                    "name": "publicipid",
+                    "type": "string"
+                },
+                {
+                    "description": "the speed of each cpu",
+                    "name": "cpuspeed",
+                    "type": "integer"
+                }
+            ]
+        },
+        {
+            "description": "Disassociates an IP address from the account.",
+            "isasync": true,
+            "name": "disassociateIpAddress",
+            "params": [
+                {
+                    "description": "the ID of the public IP address to disassociate",
+                    "length": 255,
+                    "name": "id",
+                    "related": "associateIpAddress,listPublicIpAddresses",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "list baremetal dhcp servers",
+            "isasync": false,
+            "name": "listBaremetalDhcp",
+            "params": [
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "the Physical Network ID",
+                    "length": 255,
+                    "name": "physicalnetworkid",
+                    "related": "",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "Type of DHCP device",
+                    "length": 255,
+                    "name": "dhcpservertype",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "DHCP server device ID",
+                    "length": 255,
+                    "name": "id",
+                    "required": false,
+                    "type": "long"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "name of the provider",
+                    "name": "dhcpservertype",
+                    "type": "string"
+                },
+                {
+                    "description": "the physical network to which this external dhcp device belongs to",
+                    "name": "physicalnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "name of the provider",
+                    "name": "provider",
+                    "type": "string"
+                },
+                {
+                    "description": "device id of ",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "url",
+                    "name": "url",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Migrate A VM from XenServer to Cloudstack",
+            "isasync": true,
+            "name": "tmMigrateVirtualMachine",
+            "params": [
+                {
+                    "description": "Ticketmaster inventory product code",
+                    "length": 255,
+                    "name": "productcode",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "Force migration for Unicorns and VMs with Secondary/Local block devices",
+                    "length": 255,
+                    "name": "forced",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "Hostname of VM running in Xen",
+                    "length": 255,
+                    "name": "hostname",
+                    "required": true,
+                    "type": "string"
+                }
+            ],
+            "related": "",
+            "response": [
+
+            ]
+        },
+        {
+            "description": "Puts storage pool into maintenance state",
+            "isasync": true,
+            "name": "enableStorageMaintenance",
+            "params": [
+                {
+                    "description": "Primary storage ID",
+                    "length": 255,
+                    "name": "id",
+                    "related": "enableStorageMaintenance,cancelStorageMaintenance",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "cancelStorageMaintenance",
+            "response": [
+                {
+                    "description": "the hypervisor type of the storage pool",
+                    "name": "hypervisor",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the cluster for the storage pool",
+                    "name": "clusterid",
+                    "type": "string"
+                },
+                {
+                    "description": "the scope of the storage pool",
+                    "name": "scope",
+                    "type": "string"
+                },
+                {
+                    "description": "the total disk size of the storage pool",
+                    "name": "disksizetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the Pod name of the storage pool",
+                    "name": "podname",
+                    "type": "string"
+                },
+                {
+                    "description": "the IP address of the storage pool",
+                    "name": "ipaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the cluster for the storage pool",
+                    "name": "clustername",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of the storage pool",
+                    "name": "state",
+                    "type": "storagepoolstatus"
+                },
+                {
+                    "description": "the name of the storage pool",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the Pod ID of the storage pool",
+                    "name": "podid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the storage pool",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the storage pool path",
+                    "name": "path",
+                    "type": "string"
+                },
+                {
+                    "description": "the host's currently used disk size",
+                    "name": "disksizeused",
+                    "type": "long"
+                },
+                {
+                    "description": "the overprovisionfactor for the storage pool",
+                    "name": "overprovisionfactor",
+                    "type": "string"
+                },
+                {
+                    "description": "true if this pool is suitable to migrate a volume, false otherwise",
+                    "name": "suitableformigration",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the host's currently allocated disk size",
+                    "name": "disksizeallocated",
+                    "type": "long"
+                },
+                {
+                    "description": "IOPS CloudStack can provision from this storage pool",
+                    "name": "capacityiops",
+                    "type": "long"
+                },
+                {
+                    "description": "the storage pool capabilities",
+                    "name": "storagecapabilities",
+                    "type": "map"
+                },
+                {
+                    "description": "the Zone ID of the storage pool",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone name of the storage pool",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the storage pool type",
+                    "name": "type",
+                    "type": "string"
+                },
+                {
+                    "description": "the date and time the storage pool was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the tags for the storage pool",
+                    "name": "tags",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Remove the LDAP context for this site.",
+            "isasync": false,
+            "name": "ldapRemove",
+            "params": [
+
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "You specify a query filter here, which narrows down the users, who can be part of this domain",
+                    "name": "queryfilter",
+                    "type": "string"
+                },
+                {
+                    "description": "The search base defines the starting point for the search in the directory tree Example:  dc=cloud,dc=com",
+                    "name": "searchbase",
+                    "type": "string"
+                },
+                {
+                    "description": "Hostname or ip address of the ldap server eg: my.ldap.com",
+                    "name": "hostname",
+                    "type": "string"
+                },
+                {
+                    "description": "Specify the LDAP port if required, default is 389",
+                    "name": "port",
+                    "type": "string"
+                },
+                {
+                    "description": "Specify the distinguished name of a user with the search permission on the directory",
+                    "name": "binddn",
+                    "type": "string"
+                },
+                {
+                    "description": "DN password",
+                    "name": "bindpass",
+                    "type": "string"
+                },
+                {
+                    "description": "Check Use SSL if the external LDAP server is configured for LDAP over SSL",
+                    "name": "ssl",
+                    "type": "string"
+                }
+            ],
+            "since": "3.0.1"
+        },
+        {
+            "description": "Creates a user for an account that already exists",
+            "isasync": false,
+            "name": "createUser",
+            "params": [
+                {
+                    "description": "email",
+                    "length": 255,
+                    "name": "email",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "lastname",
+                    "length": 255,
+                    "name": "lastname",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "Specifies a timezone for this command. For more information on the timezone parameter, see Time Zone Format.",
+                    "length": 255,
+                    "name": "timezone",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "Clear text password (Default hashed to SHA256SALT). If you wish to use any other hashing algorithm, you would need to write a custom authentication adapter See Docs section.",
+                    "length": 255,
+                    "name": "password",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "Creates the user under the specified domain. Has to be accompanied with the account parameter",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "User UUID, required for adding account from external provisioning system",
+                    "length": 255,
+                    "name": "userid",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "Unique username.",
+                    "length": 255,
+                    "name": "username",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "firstname",
+                    "length": 255,
+                    "name": "firstname",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "Creates the user under the specified account. If no account is specified, the username will be used as the account name.",
+                    "length": 255,
+                    "name": "account",
+                    "required": true,
+                    "type": "string"
+                }
+            ],
+            "related": "getUser",
+            "response": [
+                {
+                    "description": "the user email address",
+                    "name": "email",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the role",
+                    "name": "rolename",
+                    "type": "string"
+                },
+                {
+                    "description": "the user ID",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain ID of the user",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the secret key of the user",
+                    "name": "secretkey",
+                    "type": "string"
+                },
+                {
+                    "description": "true if user is default, false otherwise",
+                    "name": "isdefault",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the boolean value representing if the updating target is in caller's child domain",
+                    "name": "iscallerchilddomain",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the date and time the user account was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the account type of the user",
+                    "name": "accounttype",
+                    "type": "short"
+                },
+                {
+                    "description": "the account ID of the user",
+                    "name": "accountid",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain name of the user",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the user name",
+                    "name": "username",
+                    "type": "string"
+                },
+                {
+                    "description": "the api key of the user",
+                    "name": "apikey",
+                    "type": "string"
+                },
+                {
+                    "description": "the user firstname",
+                    "name": "firstname",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the role",
+                    "name": "roleid",
+                    "type": "string"
+                },
+                {
+                    "description": "the user lastname",
+                    "name": "lastname",
+                    "type": "string"
+                },
+                {
+                    "description": "the timezone user was created in",
+                    "name": "timezone",
+                    "type": "string"
+                },
+                {
+                    "description": "the account name of the user",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the user state",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the type of the role",
+                    "name": "roletype",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "lists all available apis on the server, provided by the Api Discovery plugin",
+            "isasync": false,
+            "name": "listApis",
+            "params": [
+                {
+                    "description": "API name",
+                    "length": 255,
+                    "name": "name",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "response field type",
+                    "name": "type",
+                    "type": "string"
+                },
+                {
+                    "description": "the list params the api accepts",
+                    "name": "params",
+                    "response": [
+                        {
+                            "description": "comma separated related apis to get the parameter",
+                            "name": "related",
+                            "type": "string"
+                        },
+                        {
+                            "description": "description of the api parameter",
+                            "name": "description",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the name of the api parameter",
+                            "name": "name",
+                            "type": "string"
+                        },
+                        {
+                            "description": "version of CloudStack the api was introduced in",
+                            "name": "since",
+                            "type": "string"
+                        },
+                        {
+                            "description": "parameter type",
+                            "name": "type",
+                            "type": "string"
+                        },
+                        {
+                            "description": "length of the parameter",
+                            "name": "length",
+                            "type": "int"
+                        },
+                        {
+                            "description": "true if this parameter is required for the api request",
+                            "name": "required",
+                            "type": "boolean"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "the name of the api command",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "true if api is asynchronous",
+                    "name": "isasync",
+                    "type": "boolean"
+                },
+                {
+                    "description": "comma separated related apis",
+                    "name": "related",
+                    "type": "string"
+                },
+                {
+                    "description": "api response fields",
+                    "name": "response",
+                    "response": [
+                        {
+                            "description": "api response fields",
+                            "name": "response",
+                            "type": "set"
+                        },
+                        {
+                            "description": "the name of the api response field",
+                            "name": "name",
+                            "type": "string"
+                        },
+                        {
+                            "description": "description of the api response field",
+                            "name": "description",
+                            "type": "string"
+                        },
+                        {
+                            "description": "response field type",
+                            "name": "type",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "description of the api",
+                    "name": "description",
+                    "type": "string"
+                },
+                {
+                    "description": "version of CloudStack the api was introduced in",
+                    "name": "since",
+                    "type": "string"
+                }
+            ],
+            "since": "4.1.0"
+        },
+        {
+            "description": "deletes baremetal rack configuration text",
+            "isasync": true,
+            "name": "deleteBaremetalRct",
+            "params": [
+                {
+                    "description": "RCT id",
+                    "length": 255,
+                    "name": "id",
+                    "related": "",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "Creates site to site vpn local gateway",
+            "isasync": true,
+            "name": "createVpnGateway",
+            "params": [
+                {
+                    "description": "an optional field, whether to the display the vpn to the end user or not",
+                    "length": 255,
+                    "name": "fordisplay",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "boolean"
+                },
+                {
+                    "description": "public ip address id of the vpn gateway",
+                    "length": 255,
+                    "name": "vpcid",
+                    "related": "updateVPC,listVPCs,createVPC",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the owner",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "is vpn gateway for display to the regular user",
+                    "name": "fordisplay",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the public IP address",
+                    "name": "publicip",
+                    "type": "string"
+                },
+                {
+                    "description": "the date and time the host was removed",
+                    "name": "removed",
+                    "type": "date"
+                },
+                {
+                    "description": "the domain name of the owner",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the vpc id of this gateway",
+                    "name": "vpcid",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain id of the owner",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the vpn gateway ID",
+                    "name": "id",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Adds detail for the Resource.",
+            "isasync": true,
+            "name": "addResourceDetail",
+            "params": [
+                {
+                    "description": "resource id to create the details for",
+                    "length": 255,
+                    "name": "resourceid",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "type of the resource",
+                    "length": 255,
+                    "name": "resourcetype",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "Map of (key/value pairs)",
+                    "length": 255,
+                    "name": "details",
+                    "required": true,
+                    "type": "map"
+                },
+                {
+                    "description": "pass false if you want this detail to be disabled for the regular user. True by default",
+                    "length": 255,
+                    "name": "fordisplay",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "boolean"
+                }
+            ],
+            "response": [
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                },
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Creates snapshot for a vm.",
+            "isasync": true,
+            "name": "createVMSnapshot",
+            "params": [
+                {
+                    "description": "The description of the snapshot",
+                    "length": 255,
+                    "name": "description",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "The ID of the vm",
+                    "length": 255,
+                    "name": "virtualmachineid",
+                    "related": "resetSSHKeyForVirtualMachine,removeNicFromVirtualMachine,updateVMAffinityGroup,rebootVirtualMachine,restoreVirtualMachine,destroyVirtualMachine,stopVirtualMachine,detachIso,deployVirtualMachine,updateVirtualMachine,revertToVMSnapshot,resetPasswordForVirtualMachine,startVirtualMachine,updateDefaultNicForVirtualMachine,startVirtualMachine,attachIso,listVirtualMachines,addNicToVirtualMachine,stopVirtualMachine,destroyVirtualMachine,removeNicFromVirtualMachine,changeServiceForVirtualMachine",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "quiesce vm if true",
+                    "length": 255,
+                    "name": "quiescevm",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "The display name of the snapshot",
+                    "length": 255,
+                    "name": "name",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "snapshot memory if true",
+                    "length": 255,
+                    "name": "snapshotmemory",
+                    "required": false,
+                    "type": "boolean"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the parent ID of the vm snapshot",
+                    "name": "parent",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the domain associated with the disk volume",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "VM Snapshot type",
+                    "name": "type",
+                    "type": "string"
+                },
+                {
+                    "description": "the vm ID of the vm snapshot",
+                    "name": "virtualmachineid",
+                    "type": "string"
+                },
+                {
+                    "description": "indiates if this is current snapshot",
+                    "name": "current",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the description of the vm snapshot",
+                    "name": "description",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the vm snapshot",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the parent displayName of the vm snapshot",
+                    "name": "parentName",
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone ID of the vm snapshot",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of the vm snapshot",
+                    "name": "state",
+                    "type": "state"
+                },
+                {
+                    "description": "the account associated with the disk volume",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain associated with the disk volume",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the create date of the vm snapshot",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the project id of the vpn",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the display name of the vm snapshot",
+                    "name": "displayname",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the vpn",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the vm snapshot",
+                    "name": "id",
+                    "type": "string"
+                }
+            ],
+            "since": "4.2.0"
+        },
+        {
+            "description": "Lists vpn users",
+            "isasync": false,
+            "name": "listVpnUsers",
+            "params": [
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "If set to false, list only resources belonging to the command's caller; if set to true - list resources that the caller is authorized to see. Default value is false",
+                    "length": 255,
+                    "name": "listall",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.",
+                    "length": 255,
+                    "name": "isrecursive",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "list resources by account. Must be used with the domainId parameter.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "list objects by project",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "activateProject",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list only resources belonging to the domain specified",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "The uuid of the Vpn user",
+                    "length": 255,
+                    "name": "id",
+                    "related": "listVpnUsers,addVpnUser",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the username of the vpn user.",
+                    "length": 255,
+                    "name": "username",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                }
+            ],
+            "related": "addVpnUser",
+            "response": [
+                {
+                    "description": "the project name of the vpn",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain id of the account of the remote access vpn",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the vpn userID",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain name of the account of the remote access vpn",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the username of the vpn user",
+                    "name": "username",
+                    "type": "string"
+                },
+                {
+                    "description": "the account of the remote access vpn",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of the Vpn User",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the vpn",
+                    "name": "projectid",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Deletes a load balancer",
+            "isasync": true,
+            "name": "deleteLoadBalancer",
+            "params": [
+                {
+                    "description": "the ID of the Load Balancer",
+                    "length": 255,
+                    "name": "id",
+                    "related": "",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                },
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                }
+            ],
+            "since": "4.2.0"
+        },
+        {
+            "description": "Deletes an IP forwarding rule",
+            "isasync": true,
+            "name": "deleteIpForwardingRule",
+            "params": [
+                {
+                    "description": "the ID of the forwarding rule",
+                    "length": 255,
+                    "name": "id",
+                    "related": "",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                },
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Adds a Region",
+            "isasync": false,
+            "name": "addRegion",
+            "params": [
+                {
+                    "description": "Region service endpoint",
+                    "length": 255,
+                    "name": "endpoint",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "Name of the region",
+                    "length": 255,
+                    "name": "name",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "Id of the Region",
+                    "length": 255,
+                    "name": "id",
+                    "required": true,
+                    "type": "integer"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the name of the region",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the region",
+                    "name": "id",
+                    "type": "integer"
+                },
+                {
+                    "description": "the end point of the region",
+                    "name": "endpoint",
+                    "type": "string"
+                },
+                {
+                    "description": "true if GSLB service is enabled in the region, false otherwise",
+                    "name": "gslbserviceenabled",
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if security groups support is enabled, false otherwise",
+                    "name": "portableipserviceenabled",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "Generates usage records. This will generate records only if there any records to be generated, i.e if the scheduled usage job was not run or failed",
+            "isasync": false,
+            "name": "generateUsageRecords",
+            "params": [
+                {
+                    "description": "Start date range for usage record query. Use yyyy-MM-dd as the date format, e.g. startDate=2009-06-01.",
+                    "length": 255,
+                    "name": "startdate",
+                    "required": true,
+                    "type": "date"
+                },
+                {
+                    "description": "List events for the specified domain.",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "End date range for usage record query. Use yyyy-MM-dd as the date format, e.g. startDate=2009-06-03.",
+                    "length": 255,
+                    "name": "enddate",
+                    "required": true,
+                    "type": "date"
+                }
+            ],
+            "response": [
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                },
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Updates a role permission order",
+            "isasync": false,
+            "name": "updateRolePermission",
+            "params": [
+                {
+                    "description": "ID of the role",
+                    "length": 255,
+                    "name": "roleid",
+                    "related": "",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "The parent role permission uuid, use 0 to move this rule at the top of the list",
+                    "length": 255,
+                    "name": "ruleorder",
+                    "related": "",
+                    "required": true,
+                    "type": "list"
+                }
+            ],
+            "response": [
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                },
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                }
+            ],
+            "since": "4.9.0"
+        },
+        {
+            "description": "List registered keypairs",
+            "isasync": false,
+            "name": "listSSHKeyPairs",
+            "params": [
+                {
+                    "description": "list only resources belonging to the domain specified",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.",
+                    "length": 255,
+                    "name": "isrecursive",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "list resources by account. Must be used with the domainId parameter.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "A public key fingerprint to look for",
+                    "length": 255,
+                    "name": "fingerprint",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "list objects by project",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "activateProject",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "A key pair name to look for",
+                    "length": 255,
+                    "name": "name",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "If set to false, list only resources belonging to the command's caller; if set to true - list resources that the caller is authorized to see. Default value is false",
+                    "length": 255,
+                    "name": "listall",
+                    "required": false,
+                    "type": "boolean"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the owner of the keypair",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain id of the keypair owner",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain name of the keypair owner",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "Name of the keypair",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "Fingerprint of the public key",
+                    "name": "fingerprint",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Lists accounts and provides detailed account information for listed accounts",
+            "isasync": false,
+            "name": "listAccounts",
+            "params": [
+                {
+                    "description": "list only resources belonging to the domain specified",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "list accounts by cleanuprequired attribute (values are true or false)",
+                    "length": 255,
+                    "name": "iscleanuprequired",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "list account by account ID",
+                    "length": 255,
+                    "name": "id",
+                    "related": "listAccounts,listAccounts,enableAccount",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list accounts by state. Valid states are enabled, disabled, and locked.",
+                    "length": 255,
+                    "name": "state",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.",
+                    "length": 255,
+                    "name": "isrecursive",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "list account by account name",
+                    "length": 255,
+                    "name": "name",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "If set to false, list only resources belonging to the command's caller; if set to true - list resources that the caller is authorized to see. Default value is false",
+                    "length": 255,
+                    "name": "listall",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "list accounts by account type. Valid account types are 1 (admin), 2 (domain-admin), and 0 (user).",
+                    "length": 255,
+                    "name": "accounttype",
+                    "required": false,
+                    "type": "long"
+                }
+            ],
+            "related": "listAccounts,enableAccount",
+            "response": [
+                {
+                    "description": "the list of acl groups that account belongs to",
+                    "name": "groups",
+                    "type": "list"
+                },
+                {
+                    "description": "the network domain",
+                    "name": "networkdomain",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of the account",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the total secondary storage space (in GiB) the account can own",
+                    "name": "secondarystoragelimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of snapshots available for this account",
+                    "name": "snapshotavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of virtual machines available for this account to acquire",
+                    "name": "vmavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of projects being administrated by this account",
+                    "name": "projecttotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the name of the role",
+                    "name": "rolename",
+                    "type": "string"
+                },
+                {
+                    "description": "the total secondary storage space (in GiB) owned by account",
+                    "name": "secondarystoragetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of projects available for administration by this account",
+                    "name": "projectavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of virtual machines running for this account",
+                    "name": "vmrunning",
+                    "type": "integer"
+                },
+                {
+                    "description": "the total number of projects the account can own",
+                    "name": "projectlimit",
+                    "type": "string"
+                },
+                {
+                    "description": "account type (admin, domain-admin, user)",
+                    "name": "accounttype",
+                    "type": "short"
+                },
+                {
+                    "description": "the total number of vpcs owned by account",
+                    "name": "vpctotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of virtual machines stopped for this account",
+                    "name": "vmstopped",
+                    "type": "integer"
+                },
+                {
+                    "description": "the total number of public ip addresses allocated for this account",
+                    "name": "iptotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total memory (in MB) the account can own",
+                    "name": "memorylimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of snapshots stored by this account",
+                    "name": "snapshottotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total primary storage space (in GiB) the account can own",
+                    "name": "primarystoragelimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of public ip addresses available for this account to acquire",
+                    "name": "ipavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total primary storage space (in GiB) available to be used for this account",
+                    "name": "primarystorageavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of public ip addresses this account can acquire",
+                    "name": "iplimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of virtual machines deployed by this account",
+                    "name": "vmtotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of cpu cores the account can own",
+                    "name": "cpulimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total volume being used by this account",
+                    "name": "volumetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the list of users associated with account",
+                    "name": "user",
+                    "response": [
+                        {
+                            "description": "the user email address",
+                            "name": "email",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the secret key of the user",
+                            "name": "secretkey",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the user ID",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the name of the role",
+                            "name": "rolename",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain name of the user",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the timezone user was created in",
+                            "name": "timezone",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if user is default, false otherwise",
+                            "name": "isdefault",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "the user state",
+                            "name": "state",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the date and time the user account was created",
+                            "name": "created",
+                            "type": "date"
+                        },
+                        {
+                            "description": "the account ID of the user",
+                            "name": "accountid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the user firstname",
+                            "name": "firstname",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the role",
+                            "name": "roleid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account type of the user",
+                            "name": "accounttype",
+                            "type": "short"
+                        },
+                        {
+                            "description": "the account name of the user",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the type of the role",
+                            "name": "roletype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the user lastname",
+                            "name": "lastname",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the user name",
+                            "name": "username",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain ID of the user",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the api key of the user",
+                            "name": "apikey",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the boolean value representing if the updating target is in caller's child domain",
+                            "name": "iscallerchilddomain",
+                            "type": "boolean"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "the total number of network traffic bytes received",
+                    "name": "receivedbytes",
+                    "type": "long"
+                },
+                {
+                    "description": "name of the Domain the account belongs too",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of cpu cores owned by account",
+                    "name": "cputotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total volume available for this account",
+                    "name": "volumeavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of networks the account can own",
+                    "name": "networklimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total primary storage space (in GiB) owned by account",
+                    "name": "primarystoragetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of networks owned by account",
+                    "name": "networktotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of snapshots which can be stored by this account",
+                    "name": "snapshotlimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the type of the role (Admin, ResourceAdmin, DomainAdmin, User)",
+                    "name": "roletype",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of network traffic bytes sent",
+                    "name": "sentbytes",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of templates which have been created by this account",
+                    "name": "templatetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "details for the account",
+                    "name": "accountdetails",
+                    "type": "map"
+                },
+                {
+                    "description": "the total number of vpcs the account can own",
+                    "name": "vpclimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the role",
+                    "name": "roleid",
+                    "type": "string"
+                },
+                {
+                    "description": "the default zone of the account",
+                    "name": "defaultzoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the total memory (in MB) owned by account",
+                    "name": "memorytotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total secondary storage space (in GiB) available to be used for this account",
+                    "name": "secondarystorageavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "true if the account requires cleanup",
+                    "name": "iscleanuprequired",
+                    "type": "boolean"
+                },
+                {
+                    "description": "id of the Domain the account belongs too",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the id of the account",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of cpu cores available to be created for this account",
+                    "name": "cpuavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "true if account is default, false otherwise",
+                    "name": "isdefault",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the name of the account",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of vpcs available to be created for this account",
+                    "name": "vpcavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of templates available to be created by this account",
+                    "name": "templateavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total volume which can be used by this account",
+                    "name": "volumelimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total memory (in MB) available to be created for this account",
+                    "name": "memoryavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of templates which can be created by this account",
+                    "name": "templatelimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of virtual machines that can be deployed by this account",
+                    "name": "vmlimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of networks available to be created for this account",
+                    "name": "networkavailable",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Cancels maintenance for primary storage",
+            "isasync": true,
+            "name": "cancelStorageMaintenance",
+            "params": [
+                {
+                    "description": "the primary storage ID",
+                    "length": 255,
+                    "name": "id",
+                    "related": "cancelStorageMaintenance",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the hypervisor type of the storage pool",
+                    "name": "hypervisor",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of the storage pool",
+                    "name": "state",
+                    "type": "storagepoolstatus"
+                },
+                {
+                    "description": "the name of the storage pool",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the storage pool path",
+                    "name": "path",
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone ID of the storage pool",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the tags for the storage pool",
+                    "name": "tags",
+                    "type": "string"
+                },
+                {
+                    "description": "the total disk size of the storage pool",
+                    "name": "disksizetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the Zone name of the storage pool",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the IP address of the storage pool",
+                    "name": "ipaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the Pod name of the storage pool",
+                    "name": "podname",
+                    "type": "string"
+                },
+                {
+                    "description": "the storage pool type",
+                    "name": "type",
+                    "type": "string"
+                },
+                {
+                    "description": "the host's currently allocated disk size",
+                    "name": "disksizeallocated",
+                    "type": "long"
+                },
+                {
+                    "description": "the ID of the cluster for the storage pool",
+                    "name": "clusterid",
+                    "type": "string"
+                },
+                {
+                    "description": "true if this pool is suitable to migrate a volume, false otherwise",
+                    "name": "suitableformigration",
+                    "type": "boolean"
+                },
+                {
+                    "description": "IOPS CloudStack can provision from this storage pool",
+                    "name": "capacityiops",
+                    "type": "long"
+                },
+                {
+                    "description": "the scope of the storage pool",
+                    "name": "scope",
+                    "type": "string"
+                },
+                {
+                    "description": "the overprovisionfactor for the storage pool",
+                    "name": "overprovisionfactor",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the storage pool",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the Pod ID of the storage pool",
+                    "name": "podid",
+                    "type": "string"
+                },
+                {
+                    "description": "the host's currently used disk size",
+                    "name": "disksizeused",
+                    "type": "long"
+                },
+                {
+                    "description": "the date and time the storage pool was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the storage pool capabilities",
+                    "name": "storagecapabilities",
+                    "type": "map"
+                },
+                {
+                    "description": "the name of the cluster for the storage pool",
+                    "name": "clustername",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Destroys a router.",
+            "isasync": true,
+            "name": "destroyRouter",
+            "params": [
+                {
+                    "description": "the ID of the router",
+                    "length": 255,
+                    "name": "id",
+                    "related": "destroyRouter",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the second DNS for the router",
+                    "name": "dns2",
+                    "type": "string"
+                },
+                {
+                    "description": "the template ID for the router",
+                    "name": "templateid",
+                    "type": "string"
+                },
+                {
+                    "description": "the hostname for the router",
+                    "name": "hostname",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the corresponding public network",
+                    "name": "publicnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "the guest netmask for the router",
+                    "name": "guestnetmask",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the service offering of the virtual machine",
+                    "name": "serviceofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain ID associated with the router",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "role of the domain router",
+                    "name": "role",
+                    "type": "string"
+                },
+                {
+                    "description": "the host ID for the router",
+                    "name": "hostid",
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone name for the router",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the second IPv6 DNS for the router",
+                    "name": "ip6dns2",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the corresponding link local network",
+                    "name": "linklocalnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "the public MAC address for the router",
+                    "name": "publicmacaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the guest MAC address for the router",
+                    "name": "guestmacaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the id of the router",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of redundant virtual router",
+                    "name": "redundantstate",
+                    "type": "string"
+                },
+                {
+                    "description": "the hypervisor on which the template runs",
+                    "name": "hypervisor",
+                    "type": "string"
+                },
+                {
+                    "description": "the link local netmask for the router",
+                    "name": "linklocalnetmask",
+                    "type": "string"
+                },
+                {
+                    "description": "true if the router template requires upgrader",
+                    "name": "requiresupgrade",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the account associated with the router",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the gateway for the router",
+                    "name": "gateway",
+                    "type": "string"
+                },
+                {
+                    "description": "the link local IP address for the router",
+                    "name": "linklocalip",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the service offering of the virtual machine",
+                    "name": "serviceofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of the router",
+                    "name": "state",
+                    "type": "state"
+                },
+                {
+                    "description": "the date and time the router was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the project id of the ipaddress",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the version of scripts",
+                    "name": "scriptsversion",
+                    "type": "string"
+                },
+                {
+                    "description": "the first DNS for the router",
+                    "name": "dns1",
+                    "type": "string"
+                },
+                {
+                    "description": "the first IPv6 DNS for the router",
+                    "name": "ip6dns1",
+                    "type": "string"
+                },
+                {
+                    "description": "the Pod ID for the router",
+                    "name": "podid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the corresponding guest network",
+                    "name": "guestnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of VPC the router belongs to",
+                    "name": "vpcname",
+                    "type": "string"
+                },
+                {
+                    "description": "the link local MAC address for the router",
+                    "name": "linklocalmacaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "if this router is an redundant virtual router",
+                    "name": "isredundantrouter",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the public netmask for the router",
+                    "name": "publicnetmask",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the corresponding guest network",
+                    "name": "guestnetworkname",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the address",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of nics associated with the router",
+                    "name": "nic",
+                    "response": [
+                        {
+                            "description": "the gateway of IPv6 network",
+                            "name": "ip6gateway",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the NSX Logical Switch (if NSX based), null otherwise",
+                            "name": "nsxlogicalswitch",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the isolation uri of the nic",
+                            "name": "isolationuri",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the netmask of the nic",
+                            "name": "netmask",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the vm to which the nic belongs",
+                            "name": "virtualmachineid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the NSX Logical Switch Port (if NSX based), null otherwise",
+                            "name": "nsxlogicalswitchport",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the broadcast uri of the nic",
+                            "name": "broadcasturi",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the cidr of IPv6 network",
+                            "name": "ip6cidr",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the IPv6 address of network",
+                            "name": "ip6address",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the type of the nic",
+                            "name": "type",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the traffic type of the nic",
+                            "name": "traffictype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the gateway of the nic",
+                            "name": "gateway",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if nic is default, false otherwise",
+                            "name": "macaddress",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ip address of the nic",
+                            "name": "ipaddress",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the corresponding network",
+                            "name": "networkid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if nic is default, false otherwise",
+                            "name": "isdefault",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "the name of the corresponding network",
+                            "name": "networkname",
+                            "type": "string"
+                        },
+                        {
+                            "description": "device id for the network when plugged into the virtual machine",
+                            "name": "deviceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the nic",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the Secondary ipv4 addr of nic",
+                            "name": "secondaryip",
+                            "type": "list"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "the version of template",
+                    "name": "version",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the router",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain associated with the router",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the guest IP address for the router",
+                    "name": "guestipaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the public IP address for the router",
+                    "name": "publicip",
+                    "type": "string"
+                },
+                {
+                    "description": "the network domain for the router",
+                    "name": "networkdomain",
+                    "type": "string"
+                },
+                {
+                    "description": "VPC the router belongs to",
+                    "name": "vpcid",
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone ID for the router",
+                    "name": "zoneid",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Updates the snapshot policy.",
+            "isasync": true,
+            "name": "updateSnapshotPolicy",
+            "params": [
+                {
+                    "description": "an optional field, in case you want to set a custom id to the resource. Allowed to Root Admins only",
+                    "length": 255,
+                    "name": "customid",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the snapshot policy",
+                    "length": 255,
+                    "name": "id",
+                    "related": "updateSnapshotPolicy",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "an optional field, whether to the display the snapshot policy to the end user or not.",
+                    "length": 255,
+                    "name": "fordisplay",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "boolean"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the ID of the disk volume",
+                    "name": "volumeid",
+                    "type": "string"
+                },
+                {
+                    "description": "maximum number of snapshots retained",
+                    "name": "maxsnaps",
+                    "type": "int"
+                },
+                {
+                    "description": "the interval type of the snapshot policy",
+                    "name": "intervaltype",
+                    "type": "short"
+                },
+                {
+                    "description": "the time zone of the snapshot policy",
+                    "name": "timezone",
+                    "type": "string"
+                },
+                {
+                    "description": "time the snapshot is scheduled to be taken.",
+                    "name": "schedule",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the snapshot policy",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "is this policy for display to the regular user",
+                    "name": "fordisplay",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "Retrieves the current status of asynchronous job.",
+            "isasync": false,
+            "name": "queryAsyncJobResult",
+            "params": [
+                {
+                    "description": "the ID of the asychronous job",
+                    "length": 255,
+                    "name": "jobid",
+                    "related": "queryAsyncJobResult",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the result code for the job",
+                    "name": "jobresultcode",
+                    "type": "integer"
+                },
+                {
+                    "description": "the user that executed the async command",
+                    "name": "userid",
+                    "type": "string"
+                },
+                {
+                    "description": "the account that executed the async command",
+                    "name": "accountid",
+                    "type": "string"
+                },
+                {
+                    "description": "the unique ID of the instance/entity object related to the job",
+                    "name": "jobinstanceid",
+                    "type": "string"
+                },
+                {
+                    "description": "the current job status-should be 0 for PENDING",
+                    "name": "jobstatus",
+                    "type": "integer"
+                },
+                {
+                    "description": "  the created date of the job",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the async command executed",
+                    "name": "cmd",
+                    "type": "string"
+                },
+                {
+                    "description": "the result type",
+                    "name": "jobresulttype",
+                    "type": "string"
+                },
+                {
+                    "description": "the instance/entity object related to the job",
+                    "name": "jobinstancetype",
+                    "type": "string"
+                },
+                {
+                    "description": "the progress information of the PENDING job",
+                    "name": "jobprocstatus",
+                    "type": "integer"
+                },
+                {
+                    "description": "the result reason",
+                    "name": "jobresult",
+                    "type": "responseobject"
+                }
+            ]
+        },
+        {
+            "description": "Lists image stores.",
+            "isasync": false,
+            "name": "listImageStores",
+            "params": [
+                {
+                    "description": "the Zone ID for the image store",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the ID of the storage pool",
+                    "length": 255,
+                    "name": "id",
+                    "related": "listImageStores",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the image store provider",
+                    "length": 255,
+                    "name": "provider",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the image store",
+                    "length": 255,
+                    "name": "name",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the image store protocol",
+                    "length": 255,
+                    "name": "protocol",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the provider name of the image store",
+                    "name": "providername",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the image store",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the protocol of the image store",
+                    "name": "protocol",
+                    "type": "string"
+                },
+                {
+                    "description": "the scope of the image store",
+                    "name": "scope",
+                    "type": "scopetype"
+                },
+                {
+                    "description": "the url of the image store",
+                    "name": "url",
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone name of the image store",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the details of the image store",
+                    "name": "details",
+                    "type": "set"
+                },
+                {
+                    "description": "the ID of the image store",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone ID of the image store",
+                    "name": "zoneid",
+                    "type": "string"
+                }
+            ],
+            "since": "4.2.0"
+        },
+        {
+            "description": "Deletes a account, and all users associated with this account",
+            "isasync": true,
+            "name": "deleteAccount",
+            "params": [
+                {
+                    "description": "Account id",
+                    "length": 255,
+                    "name": "id",
+                    "related": "listAccounts,enableAccount",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "Adds metric counter",
+            "isasync": true,
+            "name": "createCounter",
+            "params": [
+                {
+                    "description": "Value of the counter e.g. oid in case of snmp.",
+                    "length": 255,
+                    "name": "value",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "Source of the counter.",
+                    "length": 255,
+                    "name": "source",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "Name of the counter.",
+                    "length": 255,
+                    "name": "name",
+                    "required": true,
+                    "type": "string"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the id of the Counter",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "Value in case of snmp or other specific counters.",
+                    "name": "value",
+                    "type": "string"
+                },
+                {
+                    "description": "zone id of counter",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "Name of the counter.",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "Source of the counter.",
+                    "name": "source",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "List Event Types",
+            "isasync": false,
+            "name": "listEventTypes",
+            "params": [
+
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "Event Type",
+                    "name": "name",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Disables out-of-band management for a cluster",
+            "isasync": true,
+            "name": "disableOutOfBandManagementForCluster",
+            "params": [
+                {
+                    "description": "the ID of the cluster",
+                    "length": 255,
+                    "name": "clusterid",
+                    "related": "addCluster",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the operation result",
+                    "name": "status",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the out-of-band management interface address",
+                    "name": "address",
+                    "type": "string"
+                },
+                {
+                    "description": "the out-of-band management interface port",
+                    "name": "port",
+                    "type": "string"
+                },
+                {
+                    "description": "the out-of-band management driver for the host",
+                    "name": "driver",
+                    "type": "string"
+                },
+                {
+                    "description": "the out-of-band management action (if issued)",
+                    "name": "action",
+                    "type": "string"
+                },
+                {
+                    "description": "the out-of-band management interface powerState of the host",
+                    "name": "powerstate",
+                    "type": "powerstate"
+                },
+                {
+                    "description": "the operation result description",
+                    "name": "description",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the host",
+                    "name": "hostid",
+                    "type": "string"
+                },
+                {
+                    "description": "the out-of-band management interface password",
+                    "name": "password",
+                    "type": "string"
+                },
+                {
+                    "description": "true if out-of-band management is enabled for the host",
+                    "name": "enabled",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the out-of-band management interface username",
+                    "name": "username",
+                    "type": "string"
+                }
+            ],
+            "since": "4.9.0"
+        },
+        {
+            "description": "Removes VM from specified network by deleting a NIC",
+            "isasync": true,
+            "name": "removeNicFromVirtualMachine",
+            "params": [
+                {
+                    "description": "Virtual Machine ID",
+                    "length": 255,
+                    "name": "virtualmachineid",
+                    "related": "resetSSHKeyForVirtualMachine,removeNicFromVirtualMachine,updateVMAffinityGroup,rebootVirtualMachine,restoreVirtualMachine,destroyVirtualMachine,stopVirtualMachine,detachIso,deployVirtualMachine,updateVirtualMachine,revertToVMSnapshot,resetPasswordForVirtualMachine,startVirtualMachine,updateDefaultNicForVirtualMachine,startVirtualMachine,attachIso,listVirtualMachines,addNicToVirtualMachine,stopVirtualMachine,destroyVirtualMachine,removeNicFromVirtualMachine,changeServiceForVirtualMachine",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "NIC ID",
+                    "length": 255,
+                    "name": "nicid",
+                    "related": "",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "resetSSHKeyForVirtualMachine,updateVMAffinityGroup,rebootVirtualMachine,restoreVirtualMachine,destroyVirtualMachine,stopVirtualMachine,detachIso,deployVirtualMachine,updateVirtualMachine,revertToVMSnapshot,resetPasswordForVirtualMachine,startVirtualMachine,updateDefaultNicForVirtualMachine,startVirtualMachine,attachIso,listVirtualMachines,addNicToVirtualMachine,stopVirtualMachine,destroyVirtualMachine,removeNicFromVirtualMachine,changeServiceForVirtualMachine",
+            "response": [
+                {
+                    "description": "the target memory in vm",
+                    "name": "memorytargetkbs",
+                    "type": "long"
+                },
+                {
+                    "description": "the project id of the vm",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "State of the Service from LB rule",
+                    "name": "servicestate",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the virtual machine",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the template for the virtual machine. A -1 is returned if the virtual machine was created from an ISO file.",
+                    "name": "templateid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the domain in which the virtual machine exists",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "list of security groups associated with the virtual machine",
+                    "name": "securitygroup",
+                    "response": [
+                        {
+                            "description": "the account owning the security group",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of egress rules associated with the security group",
+                            "name": "egressrule",
+                            "response": [
+                                {
+                                    "description": "account owning the security group rule",
+                                    "name": "account",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the protocol of the security group rule",
+                                    "name": "protocol",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the ending IP of the security group rule ",
+                                    "name": "endport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the type of the ICMP message response",
+                                    "name": "icmptype",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the CIDR notation for the base IP address of the security group rule",
+                                    "name": "cidr",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the code for the ICMP message response",
+                                    "name": "icmpcode",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "security group name",
+                                    "name": "securitygroupname",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the list of resource tags associated with the rule",
+                                    "name": "tags",
+                                    "response": [
+                                        {
+                                            "description": "tag value",
+                                            "name": "value",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "id of the resource",
+                                            "name": "resourceid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the ID of the domain associated with the tag",
+                                            "name": "domainid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag key name",
+                                            "name": "key",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project id the tag belongs to",
+                                            "name": "projectid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "customer associated with the tag",
+                                            "name": "customer",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the domain associated with the tag",
+                                            "name": "domain",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the account associated with the tag",
+                                            "name": "account",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project name where tag belongs to",
+                                            "name": "project",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "resource type",
+                                            "name": "resourcetype",
+                                            "type": "string"
+                                        }
+                                    ],
+                                    "type": "set"
+                                },
+                                {
+                                    "description": "the id of the security group rule",
+                                    "name": "ruleid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the starting IP of the security group rule",
+                                    "name": "startport",
+                                    "type": "integer"
+                                }
+                            ],
+                            "type": "set"
+                        },
+                        {
+                            "description": "the list of virtualmachine ids associated with this securitygroup",
+                            "name": "virtualmachineids",
+                            "type": "set"
+                        },
+                        {
+                            "description": "the project name of the group",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain ID of the security group",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the description of the security group",
+                            "name": "description",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of ingress rules associated with the security group",
+                            "name": "ingressrule",
+                            "response": [
+                                {
+                                    "description": "the protocol of the security group rule",
+                                    "name": "protocol",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the id of the security group rule",
+                                    "name": "ruleid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "security group name",
+                                    "name": "securitygroupname",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the list of resource tags associated with the rule",
+                                    "name": "tags",
+                                    "response": [
+                                        {
+                                            "description": "tag value",
+                                            "name": "value",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the ID of the domain associated with the tag",
+                                            "name": "domainid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag key name",
+                                            "name": "key",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "id of the resource",
+                                            "name": "resourceid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "resource type",
+                                            "name": "resourcetype",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the account associated with the tag",
+                                            "name": "account",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project id the tag belongs to",
+                                            "name": "projectid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project name where tag belongs to",
+                                            "name": "project",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the domain associated with the tag",
+                                            "name": "domain",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "customer associated with the tag",
+                                            "name": "customer",
+                                            "type": "string"
+                                        }
+                                    ],
+                                    "type": "set"
+                                },
+                                {
+                                    "description": "the code for the ICMP message response",
+                                    "name": "icmpcode",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the ending IP of the security group rule ",
+                                    "name": "endport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the starting IP of the security group rule",
+                                    "name": "startport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the CIDR notation for the base IP address of the security group rule",
+                                    "name": "cidr",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "account owning the security group rule",
+                                    "name": "account",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the type of the ICMP message response",
+                                    "name": "icmptype",
+                                    "type": "integer"
+                                }
+                            ],
+                            "type": "set"
+                        },
+                        {
+                            "description": "the ID of the security group",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the name of the security group",
+                            "name": "name",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the number of virtualmachines associated with this securitygroup",
+                            "name": "virtualmachinecount",
+                            "type": "integer"
+                        },
+                        {
+                            "description": "the project id of the group",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of resource tags associated with the rule",
+                            "name": "tags",
+                            "response": [
+                                {
+                                    "description": "tag value",
+                                    "name": "value",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the account associated with the tag",
+                                    "name": "account",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "customer associated with the tag",
+                                    "name": "customer",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the domain associated with the tag",
+                                    "name": "domain",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "id of the resource",
+                                    "name": "resourceid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the project id the tag belongs to",
+                                    "name": "projectid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the project name where tag belongs to",
+                                    "name": "project",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "tag key name",
+                                    "name": "key",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the ID of the domain associated with the tag",
+                                    "name": "domainid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "resource type",
+                                    "name": "resourcetype",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "set"
+                        },
+                        {
+                            "description": "the domain name of the security group",
+                            "name": "domain",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "OS type id of the vm",
+                    "name": "ostypeid",
+                    "type": "long"
+                },
+                {
+                    "description": "the memory allocated for the virtual machine",
+                    "name": "memory",
+                    "type": "integer"
+                },
+                {
+                    "description": "instance name of the user vm; this parameter is returned to the ROOT admin only",
+                    "name": "instancename",
+                    "type": "string"
+                },
+                {
+
+                },
+                {
+                    "description": "the ID of the disk offering of the virtual machine",
+                    "name": "diskofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "the virtual network for the service offering",
+                    "name": "forvirtualnetwork",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the name of the host for the virtual machine",
+                    "name": "hostname",
+                    "type": "string"
+                },
+                {
+                    "description": "the amount of the vm's CPU currently used",
+                    "name": "cpuused",
+                    "type": "string"
+                },
+                {
+                    "description": "an optional field whether to the display the vm to the end user or not.",
+                    "name": "displayvm",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the read (io) of disk on the vm",
+                    "name": "diskioread",
+                    "type": "long"
+                },
+                {
+                    "description": "the name of the domain in which the virtual machine exists",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the account associated with the virtual machine",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the hypervisor on which the template runs",
+                    "name": "hypervisor",
+                    "type": "string"
+                },
+                {
+                    "description": "the write (io) of disk on the vm",
+                    "name": "diskiowrite",
+                    "type": "long"
+                },
+                {
+                    "description": "device type of the root volume",
+                    "name": "rootdevicetype",
+                    "type": "string"
+                },
+                {
+                    "description": "the number of cpu this virtual machine is running with",
+                    "name": "cpunumber",
+                    "type": "integer"
+                },
+                {
+                    "description": "the write (bytes) of disk on the vm",
+                    "name": "diskkbswrite",
+                    "type": "long"
+                },
+                {
+                    "description": "the ID of the ISO attached to the virtual machine",
+                    "name": "isoid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the disk offering of the virtual machine",
+                    "name": "diskofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the ISO attached to the virtual machine",
+                    "name": "isoname",
+                    "type": "string"
+                },
+                {
+                    "description": "the outgoing network traffic on the host",
+                    "name": "networkkbswrite",
+                    "type": "long"
+                },
+                {
+                    "description": "the ID of the availablility zone for the virtual machine",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "Vm details in key/value pairs.",
+                    "name": "details",
+                    "type": "map"
+                },
+                {
+                    "description": "Os type ID of the virtual machine",
+                    "name": "guestosid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the template for the virtual machine",
+                    "name": "templatename",
+                    "type": "string"
+                },
+                {
+                    "description": "the internal memory thats free in vm",
+                    "name": "memoryintfreekbs",
+                    "type": "long"
+                },
+                {
+                    "description": "the memory used by the vm",
+                    "name": "memorykbs",
+                    "type": "long"
+                },
+                {
+                    "description": "the group name of the virtual machine",
+                    "name": "group",
+                    "type": "string"
+                },
+                {
+                    "description": "the group ID of the virtual machine",
+                    "name": "groupid",
+                    "type": "string"
+                },
+                {
+                    "description": "an alternate display text of the ISO attached to the virtual machine",
+                    "name": "isodisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the service offering of the virtual machine",
+                    "name": "serviceofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "the read (bytes) of disk on the vm",
+                    "name": "diskkbsread",
+                    "type": "long"
+                },
+                {
+                    "description": "the incoming network traffic on the vm",
+                    "name": "networkkbsread",
+                    "type": "long"
+                },
+                {
+                    "description": "the password (if exists) of the virtual machine",
+                    "name": "password",
+                    "type": "string"
+                },
+                {
+                    "description": " an alternate display text of the template for the virtual machine",
+                    "name": "templatedisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the host for the virtual machine",
+                    "name": "hostid",
+                    "type": "string"
+                },
+                {
+                    "description": "device ID of the root volume",
+                    "name": "rootdeviceid",
+                    "type": "long"
+                },
+                {
+                    "description": "true if high-availability is enabled, false otherwise",
+                    "name": "haenable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the project name of the vm",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "list of affinity groups associated with the virtual machine",
+                    "name": "affinitygroup",
+                    "response": [
+                        {
+                            "description": "the ID of the affinity group",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain name of the affinity group",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the description of the affinity group",
+                            "name": "description",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain ID of the affinity group",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name of the affinity group",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the type of the affinity group",
+                            "name": "type",
+                            "type": "string"
+                        },
+                        {
+                            "description": "virtual machine IDs associated with this affinity group",
+                            "name": "virtualmachineIds",
+                            "type": "list"
+                        },
+                        {
+                            "description": "the name of the affinity group",
+                            "name": "name",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account owning the affinity group",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project ID of the affinity group",
+                            "name": "projectid",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "public IP address id associated with vm via Static nat rule",
+                    "name": "publicipid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the virtual machine",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "user generated name. The name of the virtual machine is returned if no displayname exists.",
+                    "name": "displayname",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of the virtual machine",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "true if vm contains XS/VMWare tools inorder to support dynamic scaling of VM cpu/memory.",
+                    "name": "isdynamicallyscalable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the date when this virtual machine was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the user's name who deployed the virtual machine",
+                    "name": "username",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the service offering of the virtual machine",
+                    "name": "serviceofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "public IP address id associated with vm via Static nat rule",
+                    "name": "publicip",
+                    "type": "string"
+                },
+                {
+                    "description": "the speed of each cpu",
+                    "name": "cpuspeed",
+                    "type": "integer"
+                },
+                {
+                    "description": "the vgpu type used by the virtual machine",
+                    "name": "vgpu",
+                    "type": "string"
+                },
+                {
+                    "description": "true if the password rest feature is enabled, false otherwise",
+                    "name": "passwordenabled",
+                    "type": "boolean"
+                },
+                {
+                    "description": "ssh key-pair",
+                    "name": "keypair",
+                    "type": "string"
+                },
+                {
+                    "description": "the user's ID who deployed the virtual machine",
+                    "name": "userid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the availability zone for the virtual machine",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of nics associated with vm",
+                    "name": "nic",
+                    "response": [
+                        {
+                            "description": "the cidr of IPv6 network",
+                            "name": "ip6cidr",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the traffic type of the nic",
+                            "name": "traffictype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the corresponding network",
+                            "name": "networkid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the Secondary ipv4 addr of nic",
+                            "name": "secondaryip",
+                            "type": "list"
+                        },
+                        {
+                            "description": "Id of the vm to which the nic belongs",
+                            "name": "virtualmachineid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the gateway of the nic",
+                            "name": "gateway",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ip address of the nic",
+                            "name": "ipaddress",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the nic",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the type of the nic",
+                            "name": "type",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the isolation uri of the nic",
+                            "name": "isolationuri",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the broadcast uri of the nic",
+                            "name": "broadcasturi",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the NSX Logical Switch Port (if NSX based), null otherwise",
+                            "name": "nsxlogicalswitchport",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the name of the corresponding network",
+                            "name": "networkname",
+                            "type": "string"
+                        },
+                        {
+                            "description": "device id for the network when plugged into the virtual machine",
+                            "name": "deviceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the NSX Logical Switch (if NSX based), null otherwise",
+                            "name": "nsxlogicalswitch",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the IPv6 address of network",
+                            "name": "ip6address",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if nic is default, false otherwise",
+                            "name": "isdefault",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "true if nic is default, false otherwise",
+                            "name": "macaddress",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the netmask of the nic",
+                            "name": "netmask",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the gateway of IPv6 network",
+                            "name": "ip6gateway",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "set"
+                }
+            ]
+        },
+        {
+            "description": "Adds a new cluster",
+            "isasync": false,
+            "name": "addCluster",
+            "params": [
+                {
+                    "description": "Ovm3 vip to use for pool (and cluster)",
+                    "length": 255,
+                    "name": "ovm3vip",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "Allocation state of this cluster for allocation of new resources",
+                    "length": 255,
+                    "name": "allocationstate",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "Name of virtual switch used for guest traffic in the cluster. This would override zone wide traffic label setting.",
+                    "length": 255,
+                    "name": "guestvswitchname",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone ID for the cluster",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "Type of virtual switch used for public traffic in the cluster. Allowed values are, vmwaresvs (for VMware standard vSwitch) and vmwaredvs (for VMware distributed vSwitch)",
+                    "length": 255,
+                    "name": "publicvswitchtype",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "Ovm3 native pooling enabled for cluster",
+                    "length": 255,
+                    "name": "ovm3pool",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "hypervisor type of the cluster: XenServer,KVM,VMware,Hyperv,BareMetal,Simulator,Ovm3",
+                    "length": 255,
+                    "name": "hypervisor",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the password for the VSM associated with this cluster",
+                    "length": 255,
+                    "name": "vsmpassword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "Name of virtual switch used for public traffic in the cluster.  This would override zone wide traffic label setting.",
+                    "length": 255,
+                    "name": "publicvswitchname",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the username for the cluster",
+                    "length": 255,
+                    "name": "username",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "type of the cluster: CloudManaged, ExternalManaged",
+                    "length": 255,
+                    "name": "clustertype",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the URL",
+                    "length": 255,
+                    "name": "url",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the ipaddress of the VSM associated with this cluster",
+                    "length": 255,
+                    "name": "vsmipaddress",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the Pod ID for the host",
+                    "length": 255,
+                    "name": "podid",
+                    "related": "",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the cluster name",
+                    "length": 255,
+                    "name": "clustername",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the username for the VSM associated with this cluster",
+                    "length": 255,
+                    "name": "vsmusername",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the password for the host",
+                    "length": 255,
+                    "name": "password",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "Ovm3 native OCFS2 clustering enabled for cluster",
+                    "length": 255,
+                    "name": "ovm3cluster",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "Type of virtual switch used for guest traffic in the cluster. Allowed values are, vmwaresvs (for VMware standard vSwitch) and vmwaredvs (for VMware distributed vSwitch)",
+                    "length": 255,
+                    "name": "guestvswitchtype",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the hypervisor type of the cluster",
+                    "name": "hypervisortype",
+                    "type": "string"
+                },
+                {
+                    "description": "The memory overcommit ratio of the cluster",
+                    "name": "memoryovercommitratio",
+                    "type": "string"
+                },
+                {
+                    "description": "the capacity of the Cluster",
+                    "name": "capacity",
+                    "response": [
+                        {
+                            "description": "the Cluster name",
+                            "name": "clustername",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the Zone ID",
+                            "name": "zoneid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the capacity currently in use",
+                            "name": "capacityused",
+                            "type": "long"
+                        },
+                        {
+                            "description": "the percentage of capacity currently in use",
+                            "name": "percentused",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the Pod name",
+                            "name": "podname",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the capacity type",
+                            "name": "type",
+                            "type": "short"
+                        },
+                        {
+                            "description": "the Pod ID",
+                            "name": "podid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the total capacity available",
+                            "name": "capacitytotal",
+                            "type": "long"
+                        },
+                        {
+                            "description": "the Cluster ID",
+                            "name": "clusterid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the Zone name",
+                            "name": "zonename",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "the Zone ID of the cluster",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "Ovm3 VIP to use for pooling and/or clustering",
+                    "name": "ovm3vip",
+                    "type": "string"
+                },
+                {
+                    "description": "the allocation state of the cluster",
+                    "name": "allocationstate",
+                    "type": "string"
+                },
+                {
+                    "description": "the Pod ID of the cluster",
+                    "name": "podid",
+                    "type": "string"
+                },
+                {
+                    "description": "the type of the cluster",
+                    "name": "clustertype",
+                    "type": "string"
+                },
+                {
+                    "description": "whether this cluster is managed by cloudstack",
+                    "name": "managedstate",
+                    "type": "string"
+                },
+                {
+                    "description": "the cluster ID",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone name of the cluster",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the Pod name of the cluster",
+                    "name": "podname",
+                    "type": "string"
+                },
+                {
+                    "description": "the cluster name",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "Meta data associated with the zone (key/value pairs)",
+                    "name": "resourcedetails",
+                    "type": "map"
+                },
+                {
+                    "description": "The cpu overcommit ratio of the cluster",
+                    "name": "cpuovercommitratio",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Deletes an traffic monitor host.",
+            "isasync": false,
+            "name": "deleteTrafficMonitor",
+            "params": [
+                {
+                    "description": "Id of the Traffic Monitor Host.",
+                    "length": 255,
+                    "name": "id",
+                    "related": "addBaremetalHost,reconnectHost",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "Activates a project",
+            "isasync": true,
+            "name": "activateProject",
+            "params": [
+                {
+                    "description": "id of the project to be modified",
+                    "length": 255,
+                    "name": "id",
+                    "related": "activateProject",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the total memory (in MB) owned by project",
+                    "name": "memorytotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of public ip addresses available for this project to acquire",
+                    "name": "ipavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of snapshots stored by this project",
+                    "name": "snapshottotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of networks available to be created for this project",
+                    "name": "networkavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of templates which can be created by this project",
+                    "name": "templatelimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of virtual machines deployed by this project",
+                    "name": "vmtotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total volume being used by this project",
+                    "name": "volumetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of templates which have been created by this project",
+                    "name": "templatetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of cpu cores available to be created for this project",
+                    "name": "cpuavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain name where the project belongs to",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of virtual machines available for this project to acquire",
+                    "name": "vmavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of snapshots which can be stored by this project",
+                    "name": "snapshotlimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of resource tags associated with vm",
+                    "name": "tags",
+                    "response": [
+                        {
+                            "description": "resource type",
+                            "name": "resourcetype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "customer associated with the tag",
+                            "name": "customer",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag value",
+                            "name": "value",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account associated with the tag",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain associated with the tag",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag key name",
+                            "name": "key",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name where tag belongs to",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the domain associated with the tag",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "id of the resource",
+                            "name": "resourceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project id the tag belongs to",
+                            "name": "projectid",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "the total primary storage space (in GiB) available to be used for this project",
+                    "name": "primarystorageavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain id the project belongs to",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the total volume which can be used by this project",
+                    "name": "volumelimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of virtual machines that can be deployed by this project",
+                    "name": "vmlimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total primary storage space (in GiB) owned by project",
+                    "name": "primarystoragetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of virtual machines stopped for this project",
+                    "name": "vmstopped",
+                    "type": "integer"
+                },
+                {
+                    "description": "the displaytext of the project",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "the total memory (in MB) available to be created for this project",
+                    "name": "memoryavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of networks owned by project",
+                    "name": "networktotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total primary storage space (in GiB) the project can own",
+                    "name": "primarystoragelimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of public ip addresses allocated for this project",
+                    "name": "iptotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of templates available to be created by this project",
+                    "name": "templateavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of cpu cores the project can own",
+                    "name": "cpulimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of cpu cores owned by project",
+                    "name": "cputotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the account name of the project's owner",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of virtual machines running for this project",
+                    "name": "vmrunning",
+                    "type": "integer"
+                },
+                {
+                    "description": "the total number of networks the project can own",
+                    "name": "networklimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total volume available for this project",
+                    "name": "volumeavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of the project",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of snapshots available for this project",
+                    "name": "snapshotavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of vpcs the project can own",
+                    "name": "vpclimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of vpcs owned by project",
+                    "name": "vpctotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of vpcs available to be created for this project",
+                    "name": "vpcavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total secondary storage space (in GiB) the project can own",
+                    "name": "secondarystoragelimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of public ip addresses this project can acquire",
+                    "name": "iplimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the id of the project",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the total memory (in MB) the project can own",
+                    "name": "memorylimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total secondary storage space (in GiB) owned by project",
+                    "name": "secondarystoragetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total secondary storage space (in GiB) available to be used for this project",
+                    "name": "secondarystorageavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the project",
+                    "name": "name",
+                    "type": "string"
+                }
+            ],
+            "since": "3.0.0"
+        },
+        {
+            "description": "Delete a certificate to CloudStack",
+            "isasync": false,
+            "name": "deleteSslCert",
+            "params": [
+                {
+                    "description": "Id of SSL certificate",
+                    "length": 255,
+                    "name": "id",
+                    "related": "uploadSslCert",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "Lists dedicated hosts.",
+            "isasync": false,
+            "name": "listDedicatedHosts",
+            "params": [
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "the ID of the host",
+                    "length": 255,
+                    "name": "hostid",
+                    "related": "addBaremetalHost,reconnectHost",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the name of the account associated with the host. Must be used with domainId.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "list dedicated hosts by affinity group",
+                    "length": 255,
+                    "name": "affinitygroupid",
+                    "related": "",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the ID of the domain associated with the host",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the ID of the host",
+                    "name": "hostid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the dedicated resource",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the Account ID of the host",
+                    "name": "accountid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the host",
+                    "name": "hostname",
+                    "type": "string"
+                },
+                {
+                    "description": "the Dedication Affinity Group ID of the host",
+                    "name": "affinitygroupid",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain ID of the host",
+                    "name": "domainid",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Deletes a autoscale vm group.",
+            "isasync": true,
+            "name": "deleteAutoScaleVmGroup",
+            "params": [
+                {
+                    "description": "the ID of the autoscale group",
+                    "length": 255,
+                    "name": "id",
+                    "related": "",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "lists Palo Alto firewall devices in a physical network",
+            "isasync": false,
+            "name": "listPaloAltoFirewalls",
+            "params": [
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "Palo Alto firewall device ID",
+                    "length": 255,
+                    "name": "fwdeviceid",
+                    "related": "listPaloAltoFirewalls,addPaloAltoFirewall",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the Physical Network ID",
+                    "length": 255,
+                    "name": "physicalnetworkid",
+                    "related": "",
+                    "required": false,
+                    "type": "uuid"
+                }
+            ],
+            "related": "addPaloAltoFirewall",
+            "response": [
+                {
+                    "description": "the zone ID of the external firewall",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "device state",
+                    "name": "fwdevicestate",
+                    "type": "string"
+                },
+                {
+                    "description": "device id of the Palo Alto firewall",
+                    "name": "fwdeviceid",
+                    "type": "string"
+                },
+                {
+                    "description": "name of the provider",
+                    "name": "provider",
+                    "type": "string"
+                },
+                {
+                    "description": "device name",
+                    "name": "fwdevicename",
+                    "type": "string"
+                },
+                {
+                    "description": "the public security zone of the external firewall",
+                    "name": "publiczone",
+                    "type": "string"
+                },
+                {
+                    "description": "the usage interface of the external firewall",
+                    "name": "usageinterface",
+                    "type": "string"
+                },
+                {
+                    "description": "the timeout (in seconds) for requests to the external firewall",
+                    "name": "timeout",
+                    "type": "string"
+                },
+                {
+                    "description": "device capacity",
+                    "name": "fwdevicecapacity",
+                    "type": "long"
+                },
+                {
+                    "description": "the management IP address of the external firewall",
+                    "name": "ipaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the username that's used to log in to the external firewall",
+                    "name": "username",
+                    "type": "string"
+                },
+                {
+                    "description": "the private security zone of the external firewall",
+                    "name": "privatezone",
+                    "type": "string"
+                },
+                {
+                    "description": "the number of times to retry requests to the external firewall",
+                    "name": "numretries",
+                    "type": "string"
+                },
+                {
+                    "description": "the public interface of the external firewall",
+                    "name": "publicinterface",
+                    "type": "string"
+                },
+                {
+                    "description": "the physical network to which this Palo Alto firewall belongs to",
+                    "name": "physicalnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "the private interface of the external firewall",
+                    "name": "privateinterface",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Updates load balancer",
+            "isasync": true,
+            "name": "updateLoadBalancerRule",
+            "params": [
+                {
+                    "description": "the ID of the load balancer rule to update",
+                    "length": 255,
+                    "name": "id",
+                    "related": "",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "an optional field, in case you want to set a custom id to the resource. Allowed to Root Admins only",
+                    "length": 255,
+                    "name": "customid",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "string"
+                },
+                {
+                    "description": "the description of the load balancer rule",
+                    "length": 4096,
+                    "name": "description",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the load balancer rule",
+                    "length": 255,
+                    "name": "name",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "an optional field, whether to the display the rule to the end user or not",
+                    "length": 255,
+                    "name": "fordisplay",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "boolean"
+                },
+                {
+                    "description": "load balancer algorithm (source, roundrobin, leastconn)",
+                    "length": 255,
+                    "name": "algorithm",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "listLoadBalancerRules",
+            "response": [
+                {
+                    "description": "the project name of the load balancer",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain of the load balancer rule",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the load balancer algorithm (source, roundrobin, leastconn)",
+                    "name": "algorithm",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of the rule",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the account of the load balancer rule",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the public port",
+                    "name": "publicport",
+                    "type": "string"
+                },
+                {
+                    "description": "the private port",
+                    "name": "privateport",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of resource tags associated with load balancer",
+                    "name": "tags",
+                    "response": [
+                        {
+                            "description": "the project id the tag belongs to",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name where tag belongs to",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag value",
+                            "name": "value",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account associated with the tag",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag key name",
+                            "name": "key",
+                            "type": "string"
+                        },
+                        {
+                            "description": "resource type",
+                            "name": "resourcetype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the domain associated with the tag",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "id of the resource",
+                            "name": "resourceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain associated with the tag",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "customer associated with the tag",
+                            "name": "customer",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "the project id of the load balancer",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain ID of the load balancer rule",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the load balancer rule ID",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the public ip address id",
+                    "name": "publicipid",
+                    "type": "string"
+                },
+                {
+                    "description": "the cidr list to forward traffic from",
+                    "name": "cidrlist",
+                    "type": "string"
+                },
+                {
+                    "description": "the public ip address",
+                    "name": "publicip",
+                    "type": "string"
+                },
+                {
+                    "description": "is rule for display to the regular user",
+                    "name": "fordisplay",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the protocol of the loadbalanacer rule",
+                    "name": "protocol",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the load balancer",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the id of the zone the rule belongs to",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the description of the load balancer",
+                    "name": "description",
+                    "type": "string"
+                },
+                {
+                    "description": "the id of the guest network the lb rule belongs to",
+                    "name": "networkid",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Delete one or more alerts.",
+            "isasync": false,
+            "name": "deleteAlerts",
+            "params": [
+                {
+                    "description": "delete by alert type",
+                    "length": 255,
+                    "name": "type",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "end date range to delete alerts (including) this date (use format \"yyyy-MM-dd\" or the new format \"yyyy-MM-ddThh:mm:ss\")",
+                    "length": 255,
+                    "name": "enddate",
+                    "required": false,
+                    "type": "date"
+                },
+                {
+                    "description": "start date range to delete alerts (including) this date (use format \"yyyy-MM-dd\" or the new format \"yyyy-MM-ddThh:mm:ss\")",
+                    "length": 255,
+                    "name": "startdate",
+                    "required": false,
+                    "type": "date"
+                },
+                {
+                    "description": "the IDs of the alerts",
+                    "length": 255,
+                    "name": "ids",
+                    "related": "",
+                    "required": false,
+                    "type": "list"
+                }
+            ],
+            "response": [
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "Enables an account",
+            "isasync": false,
+            "name": "enableAccount",
+            "params": [
+                {
+                    "description": "Enables specified account.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "Enables specified account in this domain.",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "Account id",
+                    "length": 255,
+                    "name": "id",
+                    "related": "listAccounts,enableAccount",
+                    "required": false,
+                    "type": "uuid"
+                }
+            ],
+            "related": "listAccounts",
+            "response": [
+                {
+                    "description": "details for the account",
+                    "name": "accountdetails",
+                    "type": "map"
+                },
+                {
+                    "description": "the total number of projects being administrated by this account",
+                    "name": "projecttotal",
+                    "type": "long"
+                },
+                {
+                    "description": "true if account is default, false otherwise",
+                    "name": "isdefault",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the total number of public ip addresses available for this account to acquire",
+                    "name": "ipavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total volume being used by this account",
+                    "name": "volumetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total primary storage space (in GiB) available to be used for this account",
+                    "name": "primarystorageavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total volume available for this account",
+                    "name": "volumeavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of network traffic bytes sent",
+                    "name": "sentbytes",
+                    "type": "long"
+                },
+                {
+                    "description": "the default zone of the account",
+                    "name": "defaultzoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "id of the Domain the account belongs too",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of public ip addresses this account can acquire",
+                    "name": "iplimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of vpcs the account can own",
+                    "name": "vpclimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total secondary storage space (in GiB) available to be used for this account",
+                    "name": "secondarystorageavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the network domain",
+                    "name": "networkdomain",
+                    "type": "string"
+                },
+                {
+                    "description": "the total primary storage space (in GiB) owned by account",
+                    "name": "primarystoragetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total primary storage space (in GiB) the account can own",
+                    "name": "primarystoragelimit",
+                    "type": "string"
+                },
+                {
+                    "description": "account type (admin, domain-admin, user)",
+                    "name": "accounttype",
+                    "type": "short"
+                },
+                {
+                    "description": "the total number of snapshots which can be stored by this account",
+                    "name": "snapshotlimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total memory (in MB) owned by account",
+                    "name": "memorytotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of cpu cores the account can own",
+                    "name": "cpulimit",
+                    "type": "string"
+                },
+                {
+                    "description": "true if the account requires cleanup",
+                    "name": "iscleanuprequired",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the total number of networks the account can own",
+                    "name": "networklimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of vpcs owned by account",
+                    "name": "vpctotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of virtual machines available for this account to acquire",
+                    "name": "vmavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the type of the role (Admin, ResourceAdmin, DomainAdmin, User)",
+                    "name": "roletype",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of network traffic bytes received",
+                    "name": "receivedbytes",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of networks owned by account",
+                    "name": "networktotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of templates which can be created by this account",
+                    "name": "templatelimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of virtual machines that can be deployed by this account",
+                    "name": "vmlimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of templates which have been created by this account",
+                    "name": "templatetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of snapshots available for this account",
+                    "name": "snapshotavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total secondary storage space (in GiB) the account can own",
+                    "name": "secondarystoragelimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of snapshots stored by this account",
+                    "name": "snapshottotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of vpcs available to be created for this account",
+                    "name": "vpcavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total memory (in MB) available to be created for this account",
+                    "name": "memoryavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the id of the account",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of the account",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of acl groups that account belongs to",
+                    "name": "groups",
+                    "type": "list"
+                },
+                {
+                    "description": "the total number of templates available to be created by this account",
+                    "name": "templateavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the account",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the role",
+                    "name": "rolename",
+                    "type": "string"
+                },
+                {
+                    "description": "name of the Domain the account belongs too",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of cpu cores owned by account",
+                    "name": "cputotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of public ip addresses allocated for this account",
+                    "name": "iptotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of virtual machines stopped for this account",
+                    "name": "vmstopped",
+                    "type": "integer"
+                },
+                {
+                    "description": "the total number of projects the account can own",
+                    "name": "projectlimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the role",
+                    "name": "roleid",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of networks available to be created for this account",
+                    "name": "networkavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total secondary storage space (in GiB) owned by account",
+                    "name": "secondarystoragetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of virtual machines running for this account",
+                    "name": "vmrunning",
+                    "type": "integer"
+                },
+                {
+                    "description": "the total memory (in MB) the account can own",
+                    "name": "memorylimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the total number of projects available for administration by this account",
+                    "name": "projectavailable",
+                    "type": "string"
+                },
+                {
+                    "description": "the total volume which can be used by this account",
+                    "name": "volumelimit",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of users associated with account",
+                    "name": "user",
+                    "response": [
+                        {
+                            "description": "the user firstname",
+                            "name": "firstname",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account type of the user",
+                            "name": "accounttype",
+                            "type": "short"
+                        },
+                        {
+                            "description": "the user lastname",
+                            "name": "lastname",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the secret key of the user",
+                            "name": "secretkey",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the type of the role",
+                            "name": "roletype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the boolean value representing if the updating target is in caller's child domain",
+                            "name": "iscallerchilddomain",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "the domain ID of the user",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the user email address",
+                            "name": "email",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the user ID",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the user name",
+                            "name": "username",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the timezone user was created in",
+                            "name": "timezone",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the role",
+                            "name": "roleid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the date and time the user account was created",
+                            "name": "created",
+                            "type": "date"
+                        },
+                        {
+                            "description": "the user state",
+                            "name": "state",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account name of the user",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the api key of the user",
+                            "name": "apikey",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain name of the user",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if user is default, false otherwise",
+                            "name": "isdefault",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "the name of the role",
+                            "name": "rolename",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account ID of the user",
+                            "name": "accountid",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "the total number of virtual machines deployed by this account",
+                    "name": "vmtotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the total number of cpu cores available to be created for this account",
+                    "name": "cpuavailable",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Creates a profile that contains information about the virtual machine which will be provisioned automatically by autoscale feature.",
+            "isasync": true,
+            "name": "createAutoScaleVmProfile",
+            "params": [
+                {
+                    "description": "the time allowed for existing connections to get closed before a vm is destroyed",
+                    "length": 255,
+                    "name": "destroyvmgraceperiod",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "the service offering of the auto deployed virtual machine",
+                    "length": 255,
+                    "name": "serviceofferingid",
+                    "related": "updateServiceOffering,listServiceOfferings",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "availability zone for the auto deployed virtual machine",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the ID of the user used to launch and destroy the VMs",
+                    "length": 255,
+                    "name": "autoscaleuserid",
+                    "related": "getUser",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "counterparam list. Example: counterparam[0].name=snmpcommunity&counterparam[0].value=public&counterparam[1].name=snmpport&counterparam[1].value=161",
+                    "length": 255,
+                    "name": "counterparam",
+                    "required": false,
+                    "type": "map"
+                },
+                {
+                    "description": "the template of the auto deployed virtual machine",
+                    "length": 255,
+                    "name": "templateid",
+                    "related": "copyTemplate,registerTemplate,listTemplates,registerIso,listIsos,createTemplate,copyIso",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "parameters other than zoneId/serviceOfferringId/templateId of the auto deployed virtual machine",
+                    "length": 255,
+                    "name": "otherdeployparams",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "an optional field, whether to the display the profile to the end user or not",
+                    "length": 255,
+                    "name": "fordisplay",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "boolean"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+
+                },
+                {
+                    "description": "the account owning the instance group",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the template to be used while deploying a virtual machine",
+                    "name": "templateid",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id vm profile",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the time allowed for existing connections to get closed before a vm is destroyed",
+                    "name": "destroyvmgraceperiod",
+                    "type": "integer"
+                },
+                {
+                    "description": "the availability zone to be used while deploying a virtual machine",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+
+                },
+                {
+                    "description": "parameters other than zoneId/serviceOfferringId/templateId to be used while deploying a virtual machine",
+                    "name": "otherdeployparams",
+                    "type": "string"
+                },
+                {
+                    "description": "the service offering to be used while deploying a virtual machine",
+                    "name": "serviceofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "the autoscale vm profile ID",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the user used to launch and destroy the VMs",
+                    "name": "autoscaleuserid",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the vm profile",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain name of the vm profile",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "is profile for display to the regular user",
+                    "name": "fordisplay",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the domain ID of the vm profile",
+                    "name": "domainid",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Lists load balancer stickiness policies.",
+            "isasync": false,
+            "name": "listLBStickinessPolicies",
+            "params": [
+                {
+                    "description": "the ID of the load balancer rule",
+                    "length": 255,
+                    "name": "lbruleid",
+                    "related": "",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list resources by display flag; only ROOT admin is eligible to pass this parameter",
+                    "length": 255,
+                    "name": "fordisplay",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "boolean"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the load balancer stickiness policy",
+                    "length": 255,
+                    "name": "id",
+                    "related": "listLBStickinessPolicies",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the domain ID of the Stickiness policy",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of the policy",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the LB rule ID",
+                    "name": "lbruleid",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain of the Stickiness policy",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the description of the Stickiness policy",
+                    "name": "description",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the Stickiness policy",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of stickinesspolicies",
+                    "name": "stickinesspolicy",
+                    "response": [
+                        {
+                            "description": "the name of the Stickiness policy",
+                            "name": "name",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the description of the Stickiness policy",
+                            "name": "description",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the params of the policy",
+                            "name": "params",
+                            "type": "map"
+                        },
+                        {
+                            "description": "the method name of the Stickiness policy",
+                            "name": "methodname",
+                            "type": "string"
+                        },
+                        {
+                            "description": "is policy for display to the regular user",
+                            "name": "fordisplay",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "the state of the policy",
+                            "name": "state",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the LB Stickiness policy ID",
+                            "name": "id",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "the id of the zone the Stickiness policy belongs to",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the account of the Stickiness policy",
+                    "name": "account",
+                    "type": "string"
+                }
+            ],
+            "since": "3.0.0"
+        },
+        {
+            "description": "Adds a Ucs manager",
+            "isasync": false,
+            "name": "addUcsManager",
+            "params": [
+                {
+                    "description": "the name of UCS manager",
+                    "length": 255,
+                    "name": "name",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone id for the ucs manager",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the password of UCS",
+                    "length": 255,
+                    "name": "password",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the username of UCS",
+                    "length": 255,
+                    "name": "username",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the name of UCS url",
+                    "length": 255,
+                    "name": "url",
+                    "required": true,
+                    "type": "string"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the zone ID of ucs manager",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of ucs manager",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the ucs manager",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the url of ucs manager",
+                    "name": "url",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Deletes a network",
+            "isasync": true,
+            "name": "deleteNetwork",
+            "params": [
+                {
+                    "description": "Force delete a network. Network will be marked as 'Destroy' even when commands to shutdown and cleanup to the backend fails.",
+                    "length": 255,
+                    "name": "forced",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "the ID of the network",
+                    "length": 255,
+                    "name": "id",
+                    "related": "updateNetwork,createNetwork,listNetworks",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "Reconnects a host.",
+            "isasync": true,
+            "name": "reconnectHost",
+            "params": [
+                {
+                    "description": "the host ID",
+                    "length": 255,
+                    "name": "id",
+                    "related": "addBaremetalHost,reconnectHost",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "addBaremetalHost",
+            "response": [
+                {
+                    "description": "the OS category name of the host",
+                    "name": "oscategoryname",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of the host",
+                    "name": "state",
+                    "type": "status"
+                },
+                {
+                    "description": "the Pod ID of the host",
+                    "name": "podid",
+                    "type": "string"
+                },
+                {
+                    "description": "the amount of the host's CPU currently allocated",
+                    "name": "cpuallocated",
+                    "type": "string"
+                },
+                {
+                    "description": "GPU cards present in the host",
+                    "name": "gpugroup",
+                    "response": [
+                        {
+                            "description": "GPU cards present in the host",
+                            "name": "gpugroupname",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of enabled vGPUs",
+                            "name": "vgpu",
+                            "response": [
+                                {
+                                    "description": "Model Name of vGPU",
+                                    "name": "vgputype",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "Maximum no. of vgpu per gpu card (pgpu)",
+                                    "name": "maxvgpuperpgpu",
+                                    "type": "long"
+                                },
+                                {
+                                    "description": "Remaining capacity in terms of no. of more VMs that can be deployped with this vGPU type",
+                                    "name": "remainingcapacity",
+                                    "type": "long"
+                                },
+                                {
+                                    "description": "Video RAM for this vGPU type",
+                                    "name": "videoram",
+                                    "type": "long"
+                                },
+                                {
+                                    "description": "Maximum displays per user",
+                                    "name": "maxheads",
+                                    "type": "long"
+                                },
+                                {
+                                    "description": "Maximum X resolution per display",
+                                    "name": "maxresolutionx",
+                                    "type": "long"
+                                },
+                                {
+                                    "description": "Maximum Y resolution per display",
+                                    "name": "maxresolutiony",
+                                    "type": "long"
+                                },
+                                {
+                                    "description": "Maximum vgpu can be created with this vgpu type on the given gpu group",
+                                    "name": "maxcapacity",
+                                    "type": "long"
+                                }
+                            ],
+                            "type": "list"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "true if the host is Ha host (dedicated to vms started by HA process; false otherwise",
+                    "name": "hahost",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the incoming network traffic on the host",
+                    "name": "networkkbsread",
+                    "type": "long"
+                },
+                {
+                    "description": "the Zone name of the host",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the host out-of-band management information",
+                    "name": "outofbandmanagement",
+                    "type": "outofbandmanagementresponse"
+                },
+                {
+                    "description": "the name of the host",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the outgoing network traffic on the host",
+                    "name": "networkkbswrite",
+                    "type": "long"
+                },
+                {
+                    "description": "the date and time the host was last pinged",
+                    "name": "lastpinged",
+                    "type": "date"
+                },
+                {
+                    "description": "the IP address of the host",
+                    "name": "ipaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the management server ID of the host",
+                    "name": "managementserverid",
+                    "type": "long"
+                },
+                {
+                    "description": "the host hypervisor",
+                    "name": "hypervisor",
+                    "type": "hypervisortype"
+                },
+                {
+                    "description": "the CPU number of the host",
+                    "name": "cpunumber",
+                    "type": "integer"
+                },
+                {
+                    "description": "the cluster name of the host",
+                    "name": "clustername",
+                    "type": "string"
+                },
+                {
+                    "description": "the number of CPU sockets on the host",
+                    "name": "cpusockets",
+                    "type": "integer"
+                },
+                {
+                    "description": "the total disk size of the host",
+                    "name": "disksizetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "true if the host is disconnected. False otherwise.",
+                    "name": "disconnected",
+                    "type": "date"
+                },
+                {
+                    "description": "the amount of the host's memory currently used",
+                    "name": "memoryused",
+                    "type": "long"
+                },
+                {
+                    "description": "the host's currently allocated disk size",
+                    "name": "disksizeallocated",
+                    "type": "long"
+                },
+                {
+                    "description": "events available for the host",
+                    "name": "events",
+                    "type": "string"
+                },
+                {
+                    "description": "the cluster ID of the host",
+                    "name": "clusterid",
+                    "type": "string"
+                },
+                {
+                    "description": "the resource state of the host",
+                    "name": "resourcestate",
+                    "type": "string"
+                },
+                {
+                    "description": "the memory total of the host",
+                    "name": "memorytotal",
+                    "type": "long"
+                },
+                {
+                    "description": "comma-separated list of tags for the host",
+                    "name": "hosttags",
+                    "type": "string"
+                },
+                {
+                    "description": "the host type",
+                    "name": "type",
+                    "type": "type"
+                },
+                {
+                    "description": "the CPU speed of the host",
+                    "name": "cpuspeed",
+                    "type": "long"
+                },
+                {
+                    "description": "Host details in key/value pairs.",
+                    "name": "details",
+                    "type": "map"
+                },
+                {
+                    "description": "the host version",
+                    "name": "version",
+                    "type": "string"
+                },
+                {
+                    "description": "capabilities of the host",
+                    "name": "capabilities",
+                    "type": "string"
+                },
+                {
+                    "description": "the date and time the host was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the date and time the host was removed",
+                    "name": "removed",
+                    "type": "date"
+                },
+                {
+                    "description": "true if this host has enough CPU and RAM capacity to migrate a VM to it, false otherwise",
+                    "name": "hasenoughcapacity",
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if local storage is active, false otherwise",
+                    "name": "islocalstorageactive",
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if this host is suitable(has enough capacity and satisfies all conditions like hosttags, max guests vm limit etc) to migrate a VM to it , false otherwise",
+                    "name": "suitableformigration",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the Zone ID of the host",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the cpu average load on the host",
+                    "name": "averageload",
+                    "type": "long"
+                },
+                {
+                    "description": "the ID of the host",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the cluster type of the cluster that host belongs to",
+                    "name": "clustertype",
+                    "type": "string"
+                },
+                {
+                    "description": "the Pod name of the host",
+                    "name": "podname",
+                    "type": "string"
+                },
+                {
+                    "description": "the amount of the host's memory currently allocated",
+                    "name": "memoryallocated",
+                    "type": "long"
+                },
+                {
+                    "description": "the amount of the host's CPU after applying the cpu.overprovisioning.factor ",
+                    "name": "cpuwithoverprovisioning",
+                    "type": "string"
+                },
+                {
+                    "description": "the OS category ID of the host",
+                    "name": "oscategoryid",
+                    "type": "string"
+                },
+                {
+                    "description": "the amount of the host's CPU currently used",
+                    "name": "cpuused",
+                    "type": "string"
+                },
+                {
+                    "description": "the hypervisor version",
+                    "name": "hypervisorversion",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Deletes a project",
+            "isasync": true,
+            "name": "deleteProject",
+            "params": [
+                {
+                    "description": "id of the project to be deleted",
+                    "length": 255,
+                    "name": "id",
+                    "related": "",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                }
+            ],
+            "since": "3.0.0"
+        },
+        {
+            "description": "lists netscaler load balancer devices",
+            "isasync": false,
+            "name": "listNetscalerLoadBalancers",
+            "params": [
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "the Physical Network ID",
+                    "length": 255,
+                    "name": "physicalnetworkid",
+                    "related": "",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "netscaler load balancer device ID",
+                    "length": 255,
+                    "name": "lbdeviceid",
+                    "related": "addNetscalerLoadBalancer,listNetscalerLoadBalancers",
+                    "required": false,
+                    "type": "uuid"
+                }
+            ],
+            "related": "addNetscalerLoadBalancer",
+            "response": [
+                {
+                    "description": "device state",
+                    "name": "lbdevicestate",
+                    "type": "string"
+                },
+                {
+                    "description": "the private interface of the load balancer",
+                    "name": "privateinterface",
+                    "type": "string"
+                },
+                {
+                    "description": "true if NetScaler device is provisioned exclusively to be a GSLB service provider",
+                    "name": "isexclusivegslbprovider",
+                    "type": "boolean"
+                },
+                {
+                    "description": "device id of the netscaler load balancer",
+                    "name": "lbdeviceid",
+                    "type": "string"
+                },
+                {
+                    "description": "true if device is dedicated for an account",
+                    "name": "lbdevicededicated",
+                    "type": "boolean"
+                },
+                {
+                    "description": "name of the provider",
+                    "name": "provider",
+                    "type": "string"
+                },
+                {
+                    "description": "device capacity",
+                    "name": "lbdevicecapacity",
+                    "type": "long"
+                },
+                {
+                    "description": "private IP of the NetScaler representing GSLB site",
+                    "name": "gslbproviderprivateip",
+                    "type": "string"
+                },
+                {
+                    "description": "device name",
+                    "name": "lbdevicename",
+                    "type": "string"
+                },
+                {
+                    "description": "true if NetScaler device is provisioned to be a GSLB service provider",
+                    "name": "gslbprovider",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the public interface of the load balancer",
+                    "name": "publicinterface",
+                    "type": "string"
+                },
+                {
+                    "description": "Used when NetScaler device is provider of EIP service. This parameter represents the list of pod's, for which there exists a policy based route on datacenter L3 router to route pod's subnet IP to a NetScaler device.",
+                    "name": "podids",
+                    "type": "list"
+                },
+                {
+                    "description": "the physical network to which this netscaler device belongs to",
+                    "name": "physicalnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "public IP of the NetScaler representing GSLB site",
+                    "name": "gslbproviderpublicip",
+                    "type": "string"
+                },
+                {
+                    "description": "the management IP address of the external load balancer",
+                    "name": "ipaddress",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Creates a vm group",
+            "isasync": false,
+            "name": "createInstanceGroup",
+            "params": [
+                {
+                    "description": "the domain ID of account owning the instance group",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "The project of the instance group",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the account of the instance group. The account parameter must be used with the domainId parameter.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the instance group",
+                    "length": 255,
+                    "name": "name",
+                    "required": true,
+                    "type": "string"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the ID of the instance group",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "time and date the instance group was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the project ID of the instance group",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the account owning the instance group",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain ID of the instance group",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain name of the instance group",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the instance group",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the instance group",
+                    "name": "project",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Adds a netscaler load balancer device",
+            "isasync": true,
+            "name": "addNetscalerLoadBalancer",
+            "params": [
+                {
+                    "description": "Credentials to reach netscaler load balancer device",
+                    "length": 255,
+                    "name": "password",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the Physical Network ID",
+                    "length": 255,
+                    "name": "physicalnetworkid",
+                    "related": "",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "Credentials to reach netscaler load balancer device",
+                    "length": 255,
+                    "name": "username",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "true if NetScaler device being added is for providing GSLB service",
+                    "length": 255,
+                    "name": "gslbprovider",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "Netscaler device type supports NetscalerMPXLoadBalancer, NetscalerVPXLoadBalancer, NetscalerSDXLoadBalancer",
+                    "length": 255,
+                    "name": "networkdevicetype",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "URL of the netscaler load balancer appliance.",
+                    "length": 255,
+                    "name": "url",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "true if NetScaler device being added is for providing GSLB service exclusively and can not be used for LB",
+                    "length": 255,
+                    "name": "isexclusivegslbprovider",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "public IP of the site",
+                    "length": 255,
+                    "name": "gslbproviderprivateip",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "public IP of the site",
+                    "length": 255,
+                    "name": "gslbproviderpublicip",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the private interface of the load balancer",
+                    "name": "privateinterface",
+                    "type": "string"
+                },
+                {
+                    "description": "Used when NetScaler device is provider of EIP service. This parameter represents the list of pod's, for which there exists a policy based route on datacenter L3 router to route pod's subnet IP to a NetScaler device.",
+                    "name": "podids",
+                    "type": "list"
+                },
+                {
+                    "description": "the public interface of the load balancer",
+                    "name": "publicinterface",
+                    "type": "string"
+                },
+                {
+                    "description": "device state",
+                    "name": "lbdevicestate",
+                    "type": "string"
+                },
+                {
+                    "description": "device id of the netscaler load balancer",
+                    "name": "lbdeviceid",
+                    "type": "string"
+                },
+                {
+                    "description": "true if NetScaler device is provisioned exclusively to be a GSLB service provider",
+                    "name": "isexclusivegslbprovider",
+                    "type": "boolean"
+                },
+                {
+                    "description": "device name",
+                    "name": "lbdevicename",
+                    "type": "string"
+                },
+                {
+                    "description": "the management IP address of the external load balancer",
+                    "name": "ipaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "true if NetScaler device is provisioned to be a GSLB service provider",
+                    "name": "gslbprovider",
+                    "type": "boolean"
+                },
+                {
+                    "description": "public IP of the NetScaler representing GSLB site",
+                    "name": "gslbproviderpublicip",
+                    "type": "string"
+                },
+                {
+                    "description": "the physical network to which this netscaler device belongs to",
+                    "name": "physicalnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "device capacity",
+                    "name": "lbdevicecapacity",
+                    "type": "long"
+                },
+                {
+                    "description": "private IP of the NetScaler representing GSLB site",
+                    "name": "gslbproviderprivateip",
+                    "type": "string"
+                },
+                {
+                    "description": "name of the provider",
+                    "name": "provider",
+                    "type": "string"
+                },
+                {
+                    "description": "true if device is dedicated for an account",
+                    "name": "lbdevicededicated",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "List ISO visibility and all accounts that have permissions to view this ISO.",
+            "isasync": false,
+            "name": "listIsoPermissions",
+            "params": [
+                {
+                    "description": "the template ID",
+                    "length": 255,
+                    "name": "id",
+                    "related": "listIsoPermissions,listTemplatePermissions,listIsoPermissions",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "listTemplatePermissions,listIsoPermissions",
+            "response": [
+                {
+                    "description": "the list of projects the template is available for",
+                    "name": "projectids",
+                    "type": "list"
+                },
+                {
+                    "description": "true if this template is a public template, false otherwise",
+                    "name": "ispublic",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the ID of the domain to which the template belongs",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the template ID",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of accounts the template is available for",
+                    "name": "account",
+                    "type": "list"
+                }
+            ]
+        },
+        {
+            "description": "Creates a load balancer",
+            "isasync": true,
+            "name": "createLoadBalancer",
+            "params": [
+                {
+                    "description": "the source port the network traffic will be load balanced from",
+                    "length": 255,
+                    "name": "sourceport",
+                    "required": true,
+                    "type": "integer"
+                },
+                {
+                    "description": "the TCP port of the virtual machine where the network traffic will be load balanced to",
+                    "length": 255,
+                    "name": "instanceport",
+                    "required": true,
+                    "type": "integer"
+                },
+                {
+                    "description": "the description of the load balancer",
+                    "length": 4096,
+                    "name": "description",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "name of the load balancer",
+                    "length": 255,
+                    "name": "name",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "load balancer algorithm (source, roundrobin, leastconn)",
+                    "length": 255,
+                    "name": "algorithm",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the source IP address the network traffic will be load balanced from",
+                    "length": 255,
+                    "name": "sourceipaddress",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the load balancer scheme. Supported value in this release is Internal",
+                    "length": 255,
+                    "name": "scheme",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "The guest network the load balancer will be created for",
+                    "length": 255,
+                    "name": "networkid",
+                    "related": "updateNetwork,createNetwork,listNetworks",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the network id of the source ip address",
+                    "length": 255,
+                    "name": "sourceipaddressnetworkid",
+                    "related": "updateNetwork,createNetwork,listNetworks",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "an optional field, whether to the display the rule to the end user or not",
+                    "length": 255,
+                    "name": "fordisplay",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "boolean"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the domain of the Load Balancer",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of rules associated with the Load Balancer",
+                    "name": "loadbalancerrule",
+                    "response": [
+                        {
+                            "description": "source port of the load balancer rule",
+                            "name": "sourceport",
+                            "type": "integer"
+                        },
+                        {
+                            "description": "instance port of the load balancer rule",
+                            "name": "instanceport",
+                            "type": "integer"
+                        },
+                        {
+                            "description": "the state of the load balancer rule",
+                            "name": "state",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "Load Balancer network id",
+                    "name": "networkid",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of instances associated with the Load Balancer",
+                    "name": "loadbalancerinstance",
+                    "response": [
+                        {
+                            "description": "the name of the instance",
+                            "name": "name",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ip address of the instance",
+                            "name": "ipaddress",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the state of the instance",
+                            "name": "state",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the instance ID",
+                            "name": "id",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "the load balancer algorithm (source, roundrobin, leastconn)",
+                    "name": "algorithm",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the Load Balancer",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of resource tags associated with the Load Balancer",
+                    "name": "tags",
+                    "response": [
+                        {
+                            "description": "the project id the tag belongs to",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "customer associated with the tag",
+                            "name": "customer",
+                            "type": "string"
+                        },
+                        {
+                            "description": "id of the resource",
+                            "name": "resourceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag key name",
+                            "name": "key",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account associated with the tag",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "resource type",
+                            "name": "resourcetype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name where tag belongs to",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag value",
+                            "name": "value",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain associated with the tag",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the domain associated with the tag",
+                            "name": "domainid",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "Load Balancer source ip",
+                    "name": "sourceipaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain ID of the Load Balancer",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the account of the Load Balancer",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the Load Balancer",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the Load Balancer ID",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "Load Balancer source ip network id",
+                    "name": "sourceipaddressnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "is rule for display to the regular user",
+                    "name": "fordisplay",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the description of the Load Balancer",
+                    "name": "description",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the Load Balancer",
+                    "name": "projectid",
+                    "type": "string"
+                }
+            ],
+            "since": "4.2.0"
+        },
+        {
+            "description": "list baremetal pxe server",
+            "isasync": false,
+            "name": "listBaremetalPxeServers",
+            "params": [
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "the Physical Network ID",
+                    "length": 255,
+                    "name": "physicalnetworkid",
+                    "related": "",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "Pxe server device ID",
+                    "length": 255,
+                    "name": "id",
+                    "required": false,
+                    "type": "long"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "url",
+                    "name": "url",
+                    "type": "string"
+                },
+                {
+                    "description": "the physical network to which this external dhcp device belongs to",
+                    "name": "physicalnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "name of the provider",
+                    "name": "provider",
+                    "type": "string"
+                },
+                {
+                    "description": "device id of ",
+                    "name": "id",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Adds a Palo Alto firewall device",
+            "isasync": true,
+            "name": "addPaloAltoFirewall",
+            "params": [
+                {
+                    "description": "Credentials to reach Palo Alto firewall device",
+                    "length": 255,
+                    "name": "username",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "Credentials to reach Palo Alto firewall device",
+                    "length": 255,
+                    "name": "password",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "supports only PaloAltoFirewall",
+                    "length": 255,
+                    "name": "networkdevicetype",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the Physical Network ID",
+                    "length": 255,
+                    "name": "physicalnetworkid",
+                    "related": "",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "URL of the Palo Alto appliance.",
+                    "length": 255,
+                    "name": "url",
+                    "required": true,
+                    "type": "string"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the physical network to which this Palo Alto firewall belongs to",
+                    "name": "physicalnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "name of the provider",
+                    "name": "provider",
+                    "type": "string"
+                },
+                {
+                    "description": "device state",
+                    "name": "fwdevicestate",
+                    "type": "string"
+                },
+                {
+                    "description": "the zone ID of the external firewall",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the usage interface of the external firewall",
+                    "name": "usageinterface",
+                    "type": "string"
+                },
+                {
+                    "description": "device name",
+                    "name": "fwdevicename",
+                    "type": "string"
+                },
+                {
+                    "description": "the number of times to retry requests to the external firewall",
+                    "name": "numretries",
+                    "type": "string"
+                },
+                {
+                    "description": "the timeout (in seconds) for requests to the external firewall",
+                    "name": "timeout",
+                    "type": "string"
+                },
+                {
+                    "description": "device capacity",
+                    "name": "fwdevicecapacity",
+                    "type": "long"
+                },
+                {
+                    "description": "the username that's used to log in to the external firewall",
+                    "name": "username",
+                    "type": "string"
+                },
+                {
+                    "description": "the management IP address of the external firewall",
+                    "name": "ipaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "the public interface of the external firewall",
+                    "name": "publicinterface",
+                    "type": "string"
+                },
+                {
+                    "description": "the private security zone of the external firewall",
+                    "name": "privatezone",
+                    "type": "string"
+                },
+                {
+                    "description": "device id of the Palo Alto firewall",
+                    "name": "fwdeviceid",
+                    "type": "string"
+                },
+                {
+                    "description": "the public security zone of the external firewall",
+                    "name": "publiczone",
+                    "type": "string"
+                },
+                {
+                    "description": "the private interface of the external firewall",
+                    "name": "privateinterface",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Creates a private gateway",
+            "isasync": true,
+            "name": "createPrivateGateway",
+            "params": [
+                {
+                    "description": "the netmask of the Private gateway",
+                    "length": 255,
+                    "name": "netmask",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the network ACL",
+                    "length": 255,
+                    "name": "aclid",
+                    "related": "createNetworkACLList",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "source NAT supported value. Default value false. If 'true' source NAT is enabled on the private gateway 'false': sourcenat is not supported",
+                    "length": 255,
+                    "name": "sourcenatsupported",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "the VPC network belongs to",
+                    "length": 255,
+                    "name": "vpcid",
+                    "related": "updateVPC,listVPCs,createVPC",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the IP address of the Private gateaway",
+                    "length": 255,
+                    "name": "ipaddress",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the gateway of the Private gateway",
+                    "length": 255,
+                    "name": "gateway",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the uuid of the network offering to use for the private gateways network connection",
+                    "length": 255,
+                    "name": "networkofferingid",
+                    "related": "",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the network implementation uri for the private gateway",
+                    "length": 255,
+                    "name": "vlan",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the Physical Network ID the network belongs to",
+                    "length": 255,
+                    "name": "physicalnetworkid",
+                    "related": "",
+                    "required": false,
+                    "type": "uuid"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the private gateway's netmask",
+                    "name": "netmask",
+                    "type": "string"
+                },
+                {
+                    "description": "VPC the private gateaway belongs to",
+                    "name": "vpcid",
+                    "type": "string"
+                },
+                {
+                    "description": "the id of the private gateway",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "State of the gateway, can be Creating, Ready, Deleting",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "ACL Id set for private gateway",
+                    "name": "aclid",
+                    "type": "string"
+                },
+                {
+                    "description": "the physical network id",
+                    "name": "physicalnetworkid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the zone the private gateway belongs to",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the private gateway",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the network implementation uri for the private gateway",
+                    "name": "vlan",
+                    "type": "string"
+                },
+                {
+                    "description": "the private gateway's ip address",
+                    "name": "ipaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "Souce Nat enable status",
+                    "name": "sourcenatsupported",
+                    "type": "boolean"
+                },
+                {
+                    "description": "zone id of the private gateway",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the account associated with the private gateway",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the domain associated with the private gateway",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain associated with the private gateway",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the gateway",
+                    "name": "gateway",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the private gateway",
+                    "name": "project",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Lists load balancer rules.",
+            "isasync": false,
+            "name": "listLoadBalancerRules",
+            "params": [
+                {
+                    "description": "list objects by project",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "If set to false, list only resources belonging to the command's caller; if set to true - list resources that the caller is authorized to see. Default value is false",
+                    "length": 255,
+                    "name": "listall",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.",
+                    "length": 255,
+                    "name": "isrecursive",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "the name of the load balancer rule",
+                    "length": 255,
+                    "name": "name",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "list by network ID the rule belongs to",
+                    "length": 255,
+                    "name": "networkid",
+                    "related": "updateNetwork,createNetwork,listNetworks",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "the ID of the virtual machine of the load balancer rule",
+                    "length": 255,
+                    "name": "virtualmachineid",
+                    "related": "resetSSHKeyForVirtualMachine,updateVMAffinityGroup,rebootVirtualMachine,restoreVirtualMachine,destroyVirtualMachine,stopVirtualMachine,detachIso,deployVirtualMachine,updateVirtualMachine,revertToVMSnapshot,resetPasswordForVirtualMachine,startVirtualMachine,updateDefaultNicForVirtualMachine,startVirtualMachine,attachIso,listVirtualMachines,addNicToVirtualMachine,stopVirtualMachine,destroyVirtualMachine,removeNicFromVirtualMachine,changeServiceForVirtualMachine",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "List resources by tags (key/value pairs)",
+                    "length": 255,
+                    "name": "tags",
+                    "required": false,
+                    "type": "map"
+                },
+                {
+                    "description": "list resources by display flag; only ROOT admin is eligible to pass this parameter",
+                    "length": 255,
+                    "name": "fordisplay",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the ID of the load balancer rule",
+                    "length": 255,
+                    "name": "id",
+                    "related": "",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list only resources belonging to the domain specified",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the public IP address ID of the load balancer rule",
+                    "length": 255,
+                    "name": "publicipid",
+                    "related": "associateIpAddress,listPublicIpAddresses",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the availability zone ID",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list resources by account. Must be used with the domainId parameter.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the domain ID of the load balancer rule",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the private port",
+                    "name": "privateport",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of resource tags associated with load balancer",
+                    "name": "tags",
+                    "response": [
+                        {
+                            "description": "resource type",
+                            "name": "resourcetype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account associated with the tag",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project id the tag belongs to",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the domain associated with the tag",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag key name",
+                            "name": "key",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag value",
+                            "name": "value",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name where tag belongs to",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "id of the resource",
+                            "name": "resourceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain associated with the tag",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "customer associated with the tag",
+                            "name": "customer",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "the protocol of the loadbalanacer rule",
+                    "name": "protocol",
+                    "type": "string"
+                },
+                {
+                    "description": "the cidr list to forward traffic from",
+                    "name": "cidrlist",
+                    "type": "string"
+                },
+                {
+                    "description": "the public ip address id",
+                    "name": "publicipid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the load balancer",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of the rule",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the load balancer",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain of the load balancer rule",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the description of the load balancer",
+                    "name": "description",
+                    "type": "string"
+                },
+                {
+                    "description": "the account of the load balancer rule",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the public ip address",
+                    "name": "publicip",
+                    "type": "string"
+                },
+                {
+                    "description": "the load balancer algorithm (source, roundrobin, leastconn)",
+                    "name": "algorithm",
+                    "type": "string"
+                },
+                {
+                    "description": "the id of the guest network the lb rule belongs to",
+                    "name": "networkid",
+                    "type": "string"
+                },
+                {
+                    "description": "the load balancer rule ID",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the load balancer",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the id of the zone the rule belongs to",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the public port",
+                    "name": "publicport",
+                    "type": "string"
+                },
+                {
+                    "description": "is rule for display to the regular user",
+                    "name": "fordisplay",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "Find user account by API key",
+            "isasync": false,
+            "name": "getUser",
+            "params": [
+                {
+                    "description": "API key of the user",
+                    "length": 255,
+                    "name": "userapikey",
+                    "required": true,
+                    "type": "string"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "true if user is default, false otherwise",
+                    "name": "isdefault",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the account type of the user",
+                    "name": "accounttype",
+                    "type": "short"
+                },
+                {
+                    "description": "the ID of the role",
+                    "name": "roleid",
+                    "type": "string"
+                },
+                {
+                    "description": "the user email address",
+                    "name": "email",
+                    "type": "string"
+                },
+                {
+                    "description": "the user ID",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the api key of the user",
+                    "name": "apikey",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain ID of the user",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the account ID of the user",
+                    "name": "accountid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the role",
+                    "name": "rolename",
+                    "type": "string"
+                },
+                {
+                    "description": "the date and time the user account was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the user firstname",
+                    "name": "firstname",
+                    "type": "string"
+                },
+                {
+                    "description": "the account name of the user",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the user name",
+                    "name": "username",
+                    "type": "string"
+                },
+                {
+                    "description": "the user lastname",
+                    "name": "lastname",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain name of the user",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the timezone user was created in",
+                    "name": "timezone",
+                    "type": "string"
+                },
+                {
+                    "description": "the secret key of the user",
+                    "name": "secretkey",
+                    "type": "string"
+                },
+                {
+                    "description": "the user state",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the type of the role",
+                    "name": "roletype",
+                    "type": "string"
+                },
+                {
+                    "description": "the boolean value representing if the updating target is in caller's child domain",
+                    "name": "iscallerchilddomain",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "Deletes a firewall rule",
+            "isasync": true,
+            "name": "deleteFirewallRule",
+            "params": [
+                {
+                    "description": "the ID of the firewall rule",
+                    "length": 255,
+                    "name": "id",
+                    "related": "",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "Upload a certificate to CloudStack",
+            "isasync": false,
+            "name": "uploadSslCert",
+            "params": [
+                {
+                    "description": "Certificate chain of trust",
+                    "length": 2097152,
+                    "name": "certchain",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "SSL certificate",
+                    "length": 16384,
+                    "name": "certificate",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "Private key",
+                    "length": 16384,
+                    "name": "privatekey",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "account that will own the SSL certificate",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "domain ID of the account owning the SSL certificate",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "an optional project for the SSL certificate",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "Password for the private key",
+                    "length": 255,
+                    "name": "password",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "List of loabalancers this certificate is bound to",
+                    "name": "loadbalancerrulelist",
+                    "type": "list"
+                },
+                {
+                    "description": "the project name of the certificate",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "SSL certificate ID",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the certificate",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "certificate",
+                    "name": "certificate",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain id of the network owner",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain name of the network owner",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "certificate chain",
+                    "name": "certchain",
+                    "type": "string"
+                },
+                {
+                    "description": "certificate fingerprint",
+                    "name": "fingerprint",
+                    "type": "string"
+                },
+                {
+                    "description": "account for the certificate",
+                    "name": "account",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Creates site to site vpn customer gateway",
+            "isasync": true,
+            "name": "createVpnCustomerGateway",
+            "params": [
+                {
+                    "description": "IKE policy of the customer gateway",
+                    "length": 255,
+                    "name": "ikepolicy",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "create site-to-site VPN customer gateway for the project",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "ESP policy of the customer gateway",
+                    "length": 255,
+                    "name": "esppolicy",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "public ip address id of the customer gateway",
+                    "length": 255,
+                    "name": "gateway",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "Lifetime of phase 2 VPN connection to the customer gateway, in seconds",
+                    "length": 255,
+                    "name": "esplifetime",
+                    "required": false,
+                    "type": "long"
+                },
+                {
+                    "description": "the account associated with the gateway. Must be used with the domainId parameter.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "If DPD is enabled for VPN connection",
+                    "length": 255,
+                    "name": "dpd",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "Lifetime of phase 1 VPN connection to the customer gateway, in seconds",
+                    "length": 255,
+                    "name": "ikelifetime",
+                    "required": false,
+                    "type": "long"
+                },
+                {
+                    "description": "guest cidr list of the customer gateway",
+                    "length": 255,
+                    "name": "cidrlist",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "Force Encapsulation for NAT traversal",
+                    "length": 255,
+                    "name": "forceencap",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "IPsec Preshared-Key of the customer gateway. Cannot contain newline or double quotes.",
+                    "length": 255,
+                    "name": "ipsecpsk",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the domain ID associated with the gateway. If used with the account parameter returns the gateway associated with the account for the specified domain.",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "name of this customer gateway",
+                    "length": 255,
+                    "name": "name",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "if Force NAT Encapsulation is enabled for customer gateway",
+                    "name": "forceencap",
+                    "type": "boolean"
+                },
+                {
+                    "description": "Lifetime of ESP SA of customer gateway",
+                    "name": "esplifetime",
+                    "type": "long"
+                },
+                {
+                    "description": "the project name",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "name of the customer gateway",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the date and time the host was removed",
+                    "name": "removed",
+                    "type": "date"
+                },
+                {
+                    "description": "the domain name of the owner",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "IPsec preshared-key of customer gateway",
+                    "name": "ipsecpsk",
+                    "type": "string"
+                },
+                {
+                    "description": "if DPD is enabled for customer gateway",
+                    "name": "dpd",
+                    "type": "boolean"
+                },
+                {
+                    "description": "public ip address id of the customer gateway",
+                    "name": "gateway",
+                    "type": "string"
+                },
+                {
+                    "description": "guest ip of the customer gateway",
+                    "name": "ipaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "Lifetime of IKE SA of customer gateway",
+                    "name": "ikelifetime",
+                    "type": "long"
+                },
+                {
+                    "description": "the domain id of the owner",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "guest cidr list of the customer gateway",
+                    "name": "cidrlist",
+                    "type": "string"
+                },
+                {
+                    "description": "IPsec policy of customer gateway",
+                    "name": "esppolicy",
+                    "type": "string"
+                },
+                {
+                    "description": "the owner",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the vpn gateway ID",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "IKE policy of customer gateway",
+                    "name": "ikepolicy",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Retrieves a Cisco Nexus 1000v Virtual Switch Manager device associated with a Cluster",
+            "isasync": false,
+            "name": "listCiscoNexusVSMs",
+            "params": [
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "Id of the CloudStack cluster in which the Cisco Nexus 1000v VSM appliance.",
+                    "length": 255,
+                    "name": "clusterid",
+                    "related": "",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "Id of the CloudStack cluster in which the Cisco Nexus 1000v VSM appliance.",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "control vlan id of the VSM",
+                    "name": "vsmctrlvlanid",
+                    "type": "int"
+                },
+                {
+                    "description": "management vlan id of the VSM",
+                    "name": "vsmmgmtvlanid",
+                    "type": "string"
+                },
+                {
+                    "description": "device id of the Cisco N1KV VSM device",
+                    "name": "vsmdeviceid",
+                    "type": "string"
+                },
+                {
+                    "description": "device name",
+                    "name": "vsmdevicename",
+                    "type": "string"
+                },
+                {
+                    "description": "device state",
+                    "name": "vsmdevicestate",
+                    "type": "string"
+                },
+                {
+                    "description": "packet vlan id of the VSM",
+                    "name": "vsmpktvlanid",
+                    "type": "int"
+                },
+                {
+                    "description": "The VSM is a switch supervisor. This is the VSM's switch domain id",
+                    "name": "vsmdomainid",
+                    "type": "string"
+                },
+                {
+                    "description": "The Device State (Enabled/Disabled) of the VSM",
+                    "name": "vsmdevicestate",
+                    "type": "string"
+                },
+                {
+                    "description": "The Config State (Primary/Standby) of the VSM",
+                    "name": "vsmconfigstate",
+                    "type": "string"
+                },
+                {
+                    "description": "the management IP address of the external Cisco Nexus 1000v Virtual Supervisor Module",
+                    "name": "ipaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "The mode of the VSM (standalone/HA)",
+                    "name": "vsmconfigmode",
+                    "type": "string"
+                },
+                {
+                    "description": "storage vlan id of the VSM",
+                    "name": "vsmstoragevlanid",
+                    "type": "int"
+                }
+            ]
+        },
+        {
+            "description": "Adds vpn users",
+            "isasync": true,
+            "name": "addVpnUser",
+            "params": [
+                {
+                    "description": "password for the username",
+                    "length": 255,
+                    "name": "password",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "add vpn user to the specific project",
+                    "length": 255,
+                    "name": "projectid",
+                    "related": "",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "an optional domainId for the vpn user. If the account parameter is used, domainId must also be used.",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "username for the vpn user",
+                    "length": 255,
+                    "name": "username",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "an optional account for the vpn user. Must be used with domainId.",
+                    "length": 255,
+                    "name": "account",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the vpn userID",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain name of the account of the remote access vpn",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the vpn",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the username of the vpn user",
+                    "name": "username",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the vpn",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the account of the remote access vpn",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain id of the account of the remote access vpn",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of the Vpn User",
+                    "name": "state",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "add a baremetal host",
+            "isasync": false,
+            "name": "addBaremetalHost",
+            "params": [
+                {
+                    "description": "the Pod ID for the host",
+                    "length": 255,
+                    "name": "podid",
+                    "related": "",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the cluster ID for the host",
+                    "length": 255,
+                    "name": "clusterid",
+                    "related": "",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list of tags to be added to the host",
+                    "length": 255,
+                    "name": "hosttags",
+                    "required": false,
+                    "type": "list"
+                },
+                {
+                    "description": "the password for the host",
+                    "length": 255,
+                    "name": "password",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "ip address intentionally allocated to this host after provisioning",
+                    "length": 255,
+                    "name": "ipaddress",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone ID for the host",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the username for the host",
+                    "length": 255,
+                    "name": "username",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the host URL",
+                    "length": 255,
+                    "name": "url",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "the cluster name for the host",
+                    "length": 255,
+                    "name": "clustername",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "hypervisor type of the host",
+                    "length": 255,
+                    "name": "hypervisor",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "Allocation state of this Host for allocation of new resources",
+                    "length": 255,
+                    "name": "allocationstate",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the Zone name of the host",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the CPU number of the host",
+                    "name": "cpunumber",
+                    "type": "integer"
+                },
+                {
+                    "description": "the date and time the host was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the hypervisor version",
+                    "name": "hypervisorversion",
+                    "type": "string"
+                },
+                {
+                    "description": "the OS category name of the host",
+                    "name": "oscategoryname",
+                    "type": "string"
+                },
+                {
+                    "description": "the host out-of-band management information",
+                    "name": "outofbandmanagement",
+                    "type": "outofbandmanagementresponse"
+                },
+                {
+                    "description": "the total disk size of the host",
+                    "name": "disksizetotal",
+                    "type": "long"
+                },
+                {
+                    "description": "true if the host is disconnected. False otherwise.",
+                    "name": "disconnected",
+                    "type": "date"
+                },
+                {
+                    "description": "the memory total of the host",
+                    "name": "memorytotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the ID of the host",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the CPU speed of the host",
+                    "name": "cpuspeed",
+                    "type": "long"
+                },
+                {
+                    "description": "the amount of the host's memory currently allocated",
+                    "name": "memoryallocated",
+                    "type": "long"
+                },
+                {
+                    "description": "capabilities of the host",
+                    "name": "capabilities",
+                    "type": "string"
+                },
+                {
+                    "description": "true if the host is Ha host (dedicated to vms started by HA process; false otherwise",
+                    "name": "hahost",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the Zone ID of the host",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "comma-separated list of tags for the host",
+                    "name": "hosttags",
+                    "type": "string"
+                },
+                {
+                    "description": "the host hypervisor",
+                    "name": "hypervisor",
+                    "type": "hypervisortype"
+                },
+                {
+                    "description": "the cluster name of the host",
+                    "name": "clustername",
+                    "type": "string"
+                },
+                {
+                    "description": "the Pod ID of the host",
+                    "name": "podid",
+                    "type": "string"
+                },
+                {
+                    "description": "Host details in key/value pairs.",
+                    "name": "details",
+                    "type": "map"
+                },
+                {
+                    "description": "the amount of the host's CPU currently allocated",
+                    "name": "cpuallocated",
+                    "type": "string"
+                },
+                {
+                    "description": "the Pod name of the host",
+                    "name": "podname",
+                    "type": "string"
+                },
+                {
+                    "description": "the host's currently allocated disk size",
+                    "name": "disksizeallocated",
+                    "type": "long"
+                },
+                {
+                    "description": "the host type",
+                    "name": "type",
+                    "type": "type"
+                },
+                {
+                    "description": "the state of the host",
+                    "name": "state",
+                    "type": "status"
+                },
+                {
+                    "description": "the date and time the host was removed",
+                    "name": "removed",
+                    "type": "date"
+                },
+                {
+                    "description": "the outgoing network traffic on the host",
+                    "name": "networkkbswrite",
+                    "type": "long"
+                },
+                {
+                    "description": "the cluster ID of the host",
+                    "name": "clusterid",
+                    "type": "string"
+                },
+                {
+                    "description": "the OS category ID of the host",
+                    "name": "oscategoryid",
+                    "type": "string"
+                },
+                {
+                    "description": "the cluster type of the cluster that host belongs to",
+                    "name": "clustertype",
+                    "type": "string"
+                },
+                {
+                    "description": "events available for the host",
+                    "name": "events",
+                    "type": "string"
+                },
+                {
+                    "description": "the cpu average load on the host",
+                    "name": "averageload",
+                    "type": "long"
+                },
+                {
+                    "description": "the amount of the host's memory currently used",
+                    "name": "memoryused",
+                    "type": "long"
+                },
+                {
+                    "description": "GPU cards present in the host",
+                    "name": "gpugroup",
+                    "response": [
+                        {
+                            "description": "GPU cards present in the host",
+                            "name": "gpugroupname",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of enabled vGPUs",
+                            "name": "vgpu",
+                            "response": [
+                                {
+                                    "description": "Video RAM for this vGPU type",
+                                    "name": "videoram",
+                                    "type": "long"
+                                },
+                                {
+                                    "description": "Maximum Y resolution per display",
+                                    "name": "maxresolutiony",
+                                    "type": "long"
+                                },
+                                {
+                                    "description": "Maximum displays per user",
+                                    "name": "maxheads",
+                                    "type": "long"
+                                },
+                                {
+                                    "description": "Maximum no. of vgpu per gpu card (pgpu)",
+                                    "name": "maxvgpuperpgpu",
+                                    "type": "long"
+                                },
+                                {
+                                    "description": "Maximum vgpu can be created with this vgpu type on the given gpu group",
+                                    "name": "maxcapacity",
+                                    "type": "long"
+                                },
+                                {
+                                    "description": "Maximum X resolution per display",
+                                    "name": "maxresolutionx",
+                                    "type": "long"
+                                },
+                                {
+                                    "description": "Remaining capacity in terms of no. of more VMs that can be deployped with this vGPU type",
+                                    "name": "remainingcapacity",
+                                    "type": "long"
+                                },
+                                {
+                                    "description": "Model Name of vGPU",
+                                    "name": "vgputype",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "list"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "the amount of the host's CPU after applying the cpu.overprovisioning.factor ",
+                    "name": "cpuwithoverprovisioning",
+                    "type": "string"
+                },
+                {
+                    "description": "the incoming network traffic on the host",
+                    "name": "networkkbsread",
+                    "type": "long"
+                },
+                {
+                    "description": "the date and time the host was last pinged",
+                    "name": "lastpinged",
+                    "type": "date"
+                },
+                {
+                    "description": "the number of CPU sockets on the host",
+                    "name": "cpusockets",
+                    "type": "integer"
+                },
+                {
+                    "description": "the name of the host",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the host version",
+                    "name": "version",
+                    "type": "string"
+                },
+                {
+                    "description": "the amount of the host's CPU currently used",
+                    "name": "cpuused",
+                    "type": "string"
+                },
+                {
+                    "description": "the management server ID of the host",
+                    "name": "managementserverid",
+                    "type": "long"
+                },
+                {
+                    "description": "the IP address of the host",
+                    "name": "ipaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "true if this host is suitable(has enough capacity and satisfies all conditions like hosttags, max guests vm limit etc) to migrate a VM to it , false otherwise",
+                    "name": "suitableformigration",
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if local storage is active, false otherwise",
+                    "name": "islocalstorageactive",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the resource state of the host",
+                    "name": "resourcestate",
+                    "type": "string"
+                },
+                {
+                    "description": "true if this host has enough CPU and RAM capacity to migrate a VM to it, false otherwise",
+                    "name": "hasenoughcapacity",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "Deletes a role permission",
+            "isasync": false,
+            "name": "deleteRolePermission",
+            "params": [
+                {
+                    "description": "ID of the role permission",
+                    "length": 255,
+                    "name": "id",
+                    "related": "",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                },
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                }
+            ],
+            "since": "4.9.0"
+        },
+        {
+            "description": "Updates remote access vpn",
+            "isasync": true,
+            "name": "updateRemoteAccessVpn",
+            "params": [
+                {
+                    "description": "an optional field, whether to the display the vpn to the end user or not",
+                    "length": 255,
+                    "name": "fordisplay",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "boolean"
+                },
+                {
+                    "description": "an optional field, in case you want to set a custom id to the resource. Allowed to Root Admins only",
+                    "length": 255,
+                    "name": "customid",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "string"
+                },
+                {
+                    "description": "id of the remote access vpn",
+                    "length": 255,
+                    "name": "id",
+                    "related": "updateRemoteAccessVpn",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the project id of the vpn",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the range of ips to allocate to the clients",
+                    "name": "iprange",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the vpn",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the account of the remote access vpn",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the id of the remote access vpn",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the public ip address of the vpn server",
+                    "name": "publicip",
+                    "type": "string"
+                },
+                {
+                    "description": "the ipsec preshared key",
+                    "name": "presharedkey",
+                    "type": "string"
+                },
+                {
+                    "description": "is vpn for display to the regular user",
+                    "name": "fordisplay",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the domain id of the account of the remote access vpn",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the domain name of the account of the remote access vpn",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of the rule",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the public ip address of the vpn server",
+                    "name": "publicipid",
+                    "type": "string"
+                }
+            ],
+            "since": "4.4"
+        },
+        {
+            "description": "Updates VPC offering",
+            "isasync": true,
+            "name": "updateVPCOffering",
+            "params": [
+                {
+                    "description": "the name of the VPC offering",
+                    "length": 255,
+                    "name": "name",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the id of the VPC offering",
+                    "length": 255,
+                    "name": "id",
+                    "related": "updateVPCOffering",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the display text of the VPC offering",
+                    "length": 255,
+                    "name": "displaytext",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "update state for the VPC offering; supported states - Enabled/Disabled",
+                    "length": 255,
+                    "name": "state",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "an alternate display text of the vpc offering.",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": " indicates if the vpc offering supports distributed router for one-hop forwarding",
+                    "name": "distributedvpcrouter",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the date this vpc offering was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": " indicated if the offering can support region level vpc",
+                    "name": "supportsregionLevelvpc",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the name of the vpc offering",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the id of the vpc offering",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of supported services",
+                    "name": "service",
+                    "response": [
+                        {
+                            "description": "the list of capabilities",
+                            "name": "capability",
+                            "response": [
+                                {
+                                    "description": "can this service capability value can be choosable while creatine network offerings",
+                                    "name": "canchooseservicecapability",
+                                    "type": "boolean"
+                                },
+                                {
+                                    "description": "the capability value",
+                                    "name": "value",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the capability name",
+                                    "name": "name",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "list"
+                        },
+                        {
+                            "description": "the service name",
+                            "name": "name",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the service provider name",
+                            "name": "provider",
+                            "response": [
+                                {
+                                    "description": "the physical network this belongs to",
+                                    "name": "physicalnetworkid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "state of the network provider",
+                                    "name": "state",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "true if individual services can be enabled/disabled",
+                                    "name": "canenableindividualservice",
+                                    "type": "boolean"
+                                },
+                                {
+                                    "description": "the destination physical network",
+                                    "name": "destinationphysicalnetworkid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "services for this provider",
+                                    "name": "servicelist",
+                                    "type": "list"
+                                },
+                                {
+                                    "description": "uuid of the network provider",
+                                    "name": "id",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the provider name",
+                                    "name": "name",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "list"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "state of the vpc offering. Can be Disabled/Enabled",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "true if vpc offering is default, false otherwise",
+                    "name": "isdefault",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "Scales the virtual machine to a new service offering.",
+            "isasync": true,
+            "name": "scaleVirtualMachine",
+            "params": [
+                {
+                    "description": "The ID of the virtual machine",
+                    "length": 255,
+                    "name": "id",
+                    "related": "resetSSHKeyForVirtualMachine,updateVMAffinityGroup,rebootVirtualMachine,restoreVirtualMachine,destroyVirtualMachine,stopVirtualMachine,detachIso,deployVirtualMachine,updateVirtualMachine,revertToVMSnapshot,resetPasswordForVirtualMachine,startVirtualMachine,updateDefaultNicForVirtualMachine,startVirtualMachine,attachIso,listVirtualMachines,addNicToVirtualMachine,stopVirtualMachine,destroyVirtualMachine,removeNicFromVirtualMachine,changeServiceForVirtualMachine",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "the ID of the service offering for the virtual machine",
+                    "length": 255,
+                    "name": "serviceofferingid",
+                    "related": "updateServiceOffering,listServiceOfferings",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "name value pairs of custom parameters for cpu,memory and cpunumber. example details[i].name=value",
+                    "length": 255,
+                    "name": "details",
+                    "required": false,
+                    "type": "map"
+                }
+            ],
+            "response": [
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                },
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Destroys a virtual machine.",
+            "isasync": true,
+            "name": "destroyVirtualMachine",
+            "params": [
+                {
+                    "description": "The ID of the virtual machine",
+                    "length": 255,
+                    "name": "id",
+                    "related": "resetSSHKeyForVirtualMachine,updateVMAffinityGroup,rebootVirtualMachine,restoreVirtualMachine,destroyVirtualMachine,stopVirtualMachine,detachIso,deployVirtualMachine,updateVirtualMachine,revertToVMSnapshot,resetPasswordForVirtualMachine,startVirtualMachine,updateDefaultNicForVirtualMachine,startVirtualMachine,attachIso,listVirtualMachines,addNicToVirtualMachine,stopVirtualMachine,destroyVirtualMachine,removeNicFromVirtualMachine,changeServiceForVirtualMachine",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "If true is passed, the vm is expunged immediately. False by default.",
+                    "length": 255,
+                    "name": "expunge",
+                    "required": false,
+                    "since": "4.2.1",
+                    "type": "boolean"
+                }
+            ],
+            "related": "resetSSHKeyForVirtualMachine,updateVMAffinityGroup,rebootVirtualMachine,restoreVirtualMachine,stopVirtualMachine,detachIso,deployVirtualMachine,updateVirtualMachine,revertToVMSnapshot,resetPasswordForVirtualMachine,startVirtualMachine,updateDefaultNicForVirtualMachine,startVirtualMachine,attachIso,listVirtualMachines,addNicToVirtualMachine,stopVirtualMachine,destroyVirtualMachine,removeNicFromVirtualMachine,changeServiceForVirtualMachine",
+            "response": [
+                {
+                    "description": "the ID of the virtual machine",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "true if high-availability is enabled, false otherwise",
+                    "name": "haenable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "device ID of the root volume",
+                    "name": "rootdeviceid",
+                    "type": "long"
+                },
+                {
+                    "description": "the incoming network traffic on the vm",
+                    "name": "networkkbsread",
+                    "type": "long"
+                },
+                {
+                    "description": "the password (if exists) of the virtual machine",
+                    "name": "password",
+                    "type": "string"
+                },
+                {
+                    "description": "the speed of each cpu",
+                    "name": "cpuspeed",
+                    "type": "integer"
+                },
+                {
+                    "description": "the hypervisor on which the template runs",
+                    "name": "hypervisor",
+                    "type": "string"
+                },
+                {
+                    "description": "the outgoing network traffic on the host",
+                    "name": "networkkbswrite",
+                    "type": "long"
+                },
+                {
+                    "description": "State of the Service from LB rule",
+                    "name": "servicestate",
+                    "type": "string"
+                },
+                {
+                    "description": "the project name of the vm",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the date when this virtual machine was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the amount of the vm's CPU currently used",
+                    "name": "cpuused",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the domain in which the virtual machine exists",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the disk offering of the virtual machine",
+                    "name": "diskofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "true if the password rest feature is enabled, false otherwise",
+                    "name": "passwordenabled",
+                    "type": "boolean"
+                },
+                {
+                    "description": "user generated name. The name of the virtual machine is returned if no displayname exists.",
+                    "name": "displayname",
+                    "type": "string"
+                },
+                {
+                    "description": "the vgpu type used by the virtual machine",
+                    "name": "vgpu",
+                    "type": "string"
+                },
+                {
+                    "description": "ssh key-pair",
+                    "name": "keypair",
+                    "type": "string"
+                },
+                {
+                    "description": " an alternate display text of the template for the virtual machine",
+                    "name": "templatedisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "list of security groups associated with the virtual machine",
+                    "name": "securitygroup",
+                    "response": [
+                        {
+                            "description": "the domain ID of the security group",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the description of the security group",
+                            "name": "description",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of virtualmachine ids associated with this securitygroup",
+                            "name": "virtualmachineids",
+                            "type": "set"
+                        },
+                        {
+                            "description": "the number of virtualmachines associated with this securitygroup",
+                            "name": "virtualmachinecount",
+                            "type": "integer"
+                        },
+                        {
+                            "description": "the ID of the security group",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account owning the security group",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of egress rules associated with the security group",
+                            "name": "egressrule",
+                            "response": [
+                                {
+                                    "description": "the starting IP of the security group rule",
+                                    "name": "startport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the code for the ICMP message response",
+                                    "name": "icmpcode",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "account owning the security group rule",
+                                    "name": "account",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the protocol of the security group rule",
+                                    "name": "protocol",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the type of the ICMP message response",
+                                    "name": "icmptype",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "security group name",
+                                    "name": "securitygroupname",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the CIDR notation for the base IP address of the security group rule",
+                                    "name": "cidr",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the id of the security group rule",
+                                    "name": "ruleid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the list of resource tags associated with the rule",
+                                    "name": "tags",
+                                    "response": [
+                                        {
+                                            "description": "id of the resource",
+                                            "name": "resourceid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag key name",
+                                            "name": "key",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the ID of the domain associated with the tag",
+                                            "name": "domainid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag value",
+                                            "name": "value",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project name where tag belongs to",
+                                            "name": "project",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "customer associated with the tag",
+                                            "name": "customer",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the domain associated with the tag",
+                                            "name": "domain",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "resource type",
+                                            "name": "resourcetype",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the account associated with the tag",
+                                            "name": "account",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project id the tag belongs to",
+                                            "name": "projectid",
+                                            "type": "string"
+                                        }
+                                    ],
+                                    "type": "set"
+                                },
+                                {
+                                    "description": "the ending IP of the security group rule ",
+                                    "name": "endport",
+                                    "type": "integer"
+                                }
+                            ],
+                            "type": "set"
+                        },
+                        {
+                            "description": "the name of the security group",
+                            "name": "name",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name of the group",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain name of the security group",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of resource tags associated with the rule",
+                            "name": "tags",
+                            "response": [
+                                {
+                                    "description": "the ID of the domain associated with the tag",
+                                    "name": "domainid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the project name where tag belongs to",
+                                    "name": "project",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "customer associated with the tag",
+                                    "name": "customer",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "tag value",
+                                    "name": "value",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "resource type",
+                                    "name": "resourcetype",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the project id the tag belongs to",
+                                    "name": "projectid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the account associated with the tag",
+                                    "name": "account",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the domain associated with the tag",
+                                    "name": "domain",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "tag key name",
+                                    "name": "key",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "id of the resource",
+                                    "name": "resourceid",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "set"
+                        },
+                        {
+                            "description": "the list of ingress rules associated with the security group",
+                            "name": "ingressrule",
+                            "response": [
+                                {
+                                    "description": "the id of the security group rule",
+                                    "name": "ruleid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the CIDR notation for the base IP address of the security group rule",
+                                    "name": "cidr",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "security group name",
+                                    "name": "securitygroupname",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the starting IP of the security group rule",
+                                    "name": "startport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the protocol of the security group rule",
+                                    "name": "protocol",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the ending IP of the security group rule ",
+                                    "name": "endport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the list of resource tags associated with the rule",
+                                    "name": "tags",
+                                    "response": [
+                                        {
+                                            "description": "tag key name",
+                                            "name": "key",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the domain associated with the tag",
+                                            "name": "domain",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag value",
+                                            "name": "value",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "resource type",
+                                            "name": "resourcetype",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project id the tag belongs to",
+                                            "name": "projectid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the ID of the domain associated with the tag",
+                                            "name": "domainid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "id of the resource",
+                                            "name": "resourceid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project name where tag belongs to",
+                                            "name": "project",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "customer associated with the tag",
+                                            "name": "customer",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the account associated with the tag",
+                                            "name": "account",
+                                            "type": "string"
+                                        }
+                                    ],
+                                    "type": "set"
+                                },
+                                {
+                                    "description": "the code for the ICMP message response",
+                                    "name": "icmpcode",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "account owning the security group rule",
+                                    "name": "account",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the type of the ICMP message response",
+                                    "name": "icmptype",
+                                    "type": "integer"
+                                }
+                            ],
+                            "type": "set"
+                        },
+                        {
+                            "description": "the project id of the group",
+                            "name": "projectid",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "the ID of the service offering of the virtual machine",
+                    "name": "serviceofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "Os type ID of the virtual machine",
+                    "name": "guestosid",
+                    "type": "string"
+                },
+                {
+                    "description": "the number of cpu this virtual machine is running with",
+                    "name": "cpunumber",
+                    "type": "integer"
+                },
+                {
+                    "description": "an optional field whether to the display the vm to the end user or not.",
+                    "name": "displayvm",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the user's ID who deployed the virtual machine",
+                    "name": "userid",
+                    "type": "string"
+                },
+                {
+                    "description": "the internal memory thats free in vm",
+                    "name": "memoryintfreekbs",
+                    "type": "long"
+                },
+                {
+                    "description": "the name of the ISO attached to the virtual machine",
+                    "name": "isoname",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the virtual machine",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the virtual network for the service offering",
+                    "name": "forvirtualnetwork",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the memory used by the vm",
+                    "name": "memorykbs",
+                    "type": "long"
+                },
+                {
+                    "description": "the ID of the domain in which the virtual machine exists",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the account associated with the virtual machine",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "Vm details in key/value pairs.",
+                    "name": "details",
+                    "type": "map"
+                },
+                {
+                    "description": "device type of the root volume",
+                    "name": "rootdevicetype",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the availability zone for the virtual machine",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the availablility zone for the virtual machine",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the read (bytes) of disk on the vm",
+                    "name": "diskkbsread",
+                    "type": "long"
+                },
+                {
+                    "description": "public IP address id associated with vm via Static nat rule",
+                    "name": "publicipid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the template for the virtual machine",
+                    "name": "templatename",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the service offering of the virtual machine",
+                    "name": "serviceofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "the read (io) of disk on the vm",
+                    "name": "diskioread",
+                    "type": "long"
+                },
+                {
+                    "description": "the target memory in vm",
+                    "name": "memorytargetkbs",
+                    "type": "long"
+                },
+                {
+                    "description": "OS type id of the vm",
+                    "name": "ostypeid",
+                    "type": "long"
+                },
+                {
+                    "description": "the list of nics associated with vm",
+                    "name": "nic",
+                    "response": [
+                        {
+                            "description": "the ID of the nic",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the broadcast uri of the nic",
+                            "name": "broadcasturi",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if nic is default, false otherwise",
+                            "name": "isdefault",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "the traffic type of the nic",
+                            "name": "traffictype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ip address of the nic",
+                            "name": "ipaddress",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if nic is default, false otherwise",
+                            "name": "macaddress",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the corresponding network",
+                            "name": "networkid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "device id for the network when plugged into the virtual machine",
+                            "name": "deviceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the cidr of IPv6 network",
+                            "name": "ip6cidr",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the Secondary ipv4 addr of nic",
+                            "name": "secondaryip",
+                            "type": "list"
+                        },
+                        {
+                            "description": "Id of the vm to which the nic belongs",
+                            "name": "virtualmachineid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the gateway of the nic",
+                            "name": "gateway",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the isolation uri of the nic",
+                            "name": "isolationuri",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the NSX Logical Switch Port (if NSX based), null otherwise",
+                            "name": "nsxlogicalswitchport",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the netmask of the nic",
+                            "name": "netmask",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the name of the corresponding network",
+                            "name": "networkname",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the IPv6 address of network",
+                            "name": "ip6address",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the type of the nic",
+                            "name": "type",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the gateway of IPv6 network",
+                            "name": "ip6gateway",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the NSX Logical Switch (if NSX based), null otherwise",
+                            "name": "nsxlogicalswitch",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "the group name of the virtual machine",
+                    "name": "group",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the vm",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the user's name who deployed the virtual machine",
+                    "name": "username",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the disk offering of the virtual machine",
+                    "name": "diskofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "instance name of the user vm; this parameter is returned to the ROOT admin only",
+                    "name": "instancename",
+                    "type": "string"
+                },
+                {
+
+                },
+                {
+                    "description": "the group ID of the virtual machine",
+                    "name": "groupid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the host for the virtual machine",
+                    "name": "hostid",
+                    "type": "string"
+                },
+                {
+                    "description": "an alternate display text of the ISO attached to the virtual machine",
+                    "name": "isodisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "the write (io) of disk on the vm",
+                    "name": "diskiowrite",
+                    "type": "long"
+                },
+                {
+                    "description": "true if vm contains XS/VMWare tools inorder to support dynamic scaling of VM cpu/memory.",
+                    "name": "isdynamicallyscalable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the name of the host for the virtual machine",
+                    "name": "hostname",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of the virtual machine",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "public IP address id associated with vm via Static nat rule",
+                    "name": "publicip",
+                    "type": "string"
+                },
+                {
+                    "description": "list of affinity groups associated with the virtual machine",
+                    "name": "affinitygroup",
+                    "response": [
+                        {
+                            "description": "the description of the affinity group",
+                            "name": "description",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain name of the affinity group",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the affinity group",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain ID of the affinity group",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name of the affinity group",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account owning the affinity group",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project ID of the affinity group",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "virtual machine IDs associated with this affinity group",
+                            "name": "virtualmachineIds",
+                            "type": "list"
+                        },
+                        {
+                            "description": "the name of the affinity group",
+                            "name": "name",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the type of the affinity group",
+                            "name": "type",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "the ID of the template for the virtual machine. A -1 is returned if the virtual machine was created from an ISO file.",
+                    "name": "templateid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the ISO attached to the virtual machine",
+                    "name": "isoid",
+                    "type": "string"
+                },
+                {
+                    "description": "the write (bytes) of disk on the vm",
+                    "name": "diskkbswrite",
+                    "type": "long"
+                },
+                {
+                    "description": "the memory allocated for the virtual machine",
+                    "name": "memory",
+                    "type": "integer"
+                }
+            ]
+        },
+        {
+            "description": "Updates egress firewall rule ",
+            "isasync": true,
+            "name": "updateEgressFirewallRule",
+            "params": [
+                {
+                    "description": "the ID of the egress firewall rule",
+                    "length": 255,
+                    "name": "id",
+                    "related": "",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "an optional field, whether to the display the rule to the end user or not",
+                    "length": 255,
+                    "name": "fordisplay",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "boolean"
+                },
+                {
+                    "description": "an optional field, in case you want to set a custom id to the resource. Allowed to Root Admins only",
+                    "length": 255,
+                    "name": "customid",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "string"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the protocol of the firewall rule",
+                    "name": "protocol",
+                    "type": "string"
+                },
+                {
+                    "description": "the network id of the firewall rule",
+                    "name": "networkid",
+                    "type": "string"
+                },
+                {
+                    "description": "the public ip address for the firewall rule",
+                    "name": "ipaddress",
+                    "type": "string"
+                },
+                {
+                    "description": "type of the icmp message being sent",
+                    "name": "icmptype",
+                    "type": "integer"
+                },
+                {
+                    "description": "is rule for display to the regular user",
+                    "name": "fordisplay",
+                    "type": "boolean"
+                },
+                {
+                    "description": "error code for this icmp message",
+                    "name": "icmpcode",
+                    "type": "integer"
+                },
+                {
+                    "description": "the cidr list to forward traffic from",
+                    "name": "cidrlist",
+                    "type": "string"
+                },
+                {
+                    "description": "the list of resource tags associated with the rule",
+                    "name": "tags",
+                    "response": [
+                        {
+                            "description": "id of the resource",
+                            "name": "resourceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name where tag belongs to",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "customer associated with the tag",
+                            "name": "customer",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag key name",
+                            "name": "key",
+                            "type": "string"
+                        },
+                        {
+                            "description": "tag value",
+                            "name": "value",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the domain associated with the tag",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain associated with the tag",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account associated with the tag",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "resource type",
+                            "name": "resourcetype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project id the tag belongs to",
+                            "name": "projectid",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "list"
+                },
+                {
+                    "description": "the ID of the firewall rule",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the starting port of firewall rule's port range",
+                    "name": "startport",
+                    "type": "integer"
+                },
+                {
+                    "description": "the state of the rule",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the public ip address id for the firewall rule",
+                    "name": "ipaddressid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ending port of firewall rule's port range",
+                    "name": "endport",
+                    "type": "integer"
+                }
+            ],
+            "since": "4.4"
+        },
+        {
+            "description": "Lists all supported OS categories for this cloud.",
+            "isasync": false,
+            "name": "listOsCategories",
+            "params": [
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "list Os category by id",
+                    "length": 255,
+                    "name": "id",
+                    "related": "listOsCategories",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "list os category by name",
+                    "length": 255,
+                    "name": "name",
+                    "required": false,
+                    "since": "3.0.1",
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the name of the OS category",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the OS category",
+                    "name": "id",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Lists all available service offerings.",
+            "isasync": false,
+            "name": "listServiceOfferings",
+            "params": [
+                {
+                    "description": "ID of the service offering",
+                    "length": 255,
+                    "name": "id",
+                    "related": "updateServiceOffering,listServiceOfferings",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "name of the service offering",
+                    "length": 255,
+                    "name": "name",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "list only resources belonging to the domain specified",
+                    "length": 255,
+                    "name": "domainid",
+                    "related": "listDomains",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "If set to false, list only resources belonging to the command's caller; if set to true - list resources that the caller is authorized to see. Default value is false",
+                    "length": 255,
+                    "name": "listall",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "is this a system vm offering",
+                    "length": 255,
+                    "name": "issystem",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "the ID of the virtual machine. Pass this in if you want to see the available service offering that a virtual machine can be changed to.",
+                    "length": 255,
+                    "name": "virtualmachineid",
+                    "related": "resetSSHKeyForVirtualMachine,updateVMAffinityGroup,rebootVirtualMachine,restoreVirtualMachine,stopVirtualMachine,detachIso,deployVirtualMachine,updateVirtualMachine,revertToVMSnapshot,resetPasswordForVirtualMachine,startVirtualMachine,updateDefaultNicForVirtualMachine,startVirtualMachine,attachIso,listVirtualMachines,addNicToVirtualMachine,stopVirtualMachine,destroyVirtualMachine,removeNicFromVirtualMachine,changeServiceForVirtualMachine",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.",
+                    "length": 255,
+                    "name": "isrecursive",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "the system VM type. Possible types are \"consoleproxy\", \"secondarystoragevm\" or \"domainrouter\".",
+                    "length": 255,
+                    "name": "systemvmtype",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "updateServiceOffering",
+            "response": [
+                {
+                    "description": "bytes read rate of the service offering",
+                    "name": "diskBytesReadRate",
+                    "type": "long"
+                },
+                {
+                    "description": "an alternate display text of the service offering.",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "the memory in MB",
+                    "name": "memory",
+                    "type": "integer"
+                },
+                {
+                    "description": "the storage type for this service offering",
+                    "name": "storagetype",
+                    "type": "string"
+                },
+                {
+                    "description": "the number of CPU",
+                    "name": "cpunumber",
+                    "type": "integer"
+                },
+                {
+                    "description": "data transfer rate in megabits per second allowed.",
+                    "name": "networkrate",
+                    "type": "integer"
+                },
+                {
+                    "description": "the clock rate CPU speed in Mhz",
+                    "name": "cpuspeed",
+                    "type": "integer"
+                },
+                {
+                    "description": "the id of the service offering",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "true if the vm needs to be volatile, i.e., on every reboot of vm from API root disk is discarded and creates a new root disk",
+                    "name": "isvolatile",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the host tag for the service offering",
+                    "name": "hosttags",
+                    "type": "string"
+                },
+                {
+                    "description": "true if disk offering uses custom iops, false otherwise",
+                    "name": "iscustomizediops",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the name of the service offering",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "provisioning type used to create volumes. Valid values are thin, sparse, fat.",
+                    "name": "provisioningtype",
+                    "type": "string"
+                },
+                {
+                    "description": "io requests read rate of the service offering",
+                    "name": "diskIopsReadRate",
+                    "type": "long"
+                },
+                {
+                    "description": "restrict the CPU usage to committed service offering",
+                    "name": "limitcpuuse",
+                    "type": "boolean"
+                },
+                {
+                    "description": "is true if the offering is customized",
+                    "name": "iscustomized",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the min iops of the disk offering",
+                    "name": "miniops",
+                    "type": "long"
+                },
+                {
+                    "description": "the max iops of the disk offering",
+                    "name": "maxiops",
+                    "type": "long"
+                },
+                {
+                    "description": "is this a the systemvm type for system vm offering",
+                    "name": "systemvmtype",
+                    "type": "string"
+                },
+                {
+                    "description": "additional key/value details tied with this service offering",
+                    "name": "serviceofferingdetails",
+                    "type": "map"
+                },
+                {
+                    "description": "the tags for the service offering",
+                    "name": "tags",
+                    "type": "string"
+                },
+                {
+                    "description": "io requests write rate of the service offering",
+                    "name": "diskIopsWriteRate",
+                    "type": "long"
+                },
+                {
+                    "description": "the ha support in the service offering",
+                    "name": "offerha",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the date this service offering was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "Domain name for the offering",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "bytes write rate of the service offering",
+                    "name": "diskBytesWriteRate",
+                    "type": "long"
+                },
+                {
+                    "description": "Hypervisor snapshot reserve space as a percent of a volume (for managed storage using Xen or VMware)",
+                    "name": "hypervisorsnapshotreserve",
+                    "type": "integer"
+                },
+                {
+                    "description": "is this a system vm offering",
+                    "name": "issystem",
+                    "type": "boolean"
+                },
+                {
+                    "description": "is this a  default system vm offering",
+                    "name": "defaultuse",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the domain id of the service offering",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "deployment strategy used to deploy VM.",
+                    "name": "deploymentplanner",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Lists affinity group types available",
+            "isasync": false,
+            "name": "listAffinityGroupTypes",
+            "params": [
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the type of the affinity group",
+                    "name": "type",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Removes a load balancer rule association with global load balancer rule",
+            "isasync": true,
+            "name": "removeFromGlobalLoadBalancerRule",
+            "params": [
+                {
+                    "description": "the list load balancer rules that will be assigned to gloabal load balancer rule",
+                    "length": 255,
+                    "name": "loadbalancerrulelist",
+                    "related": "",
+                    "required": true,
+                    "type": "list"
+                },
+                {
+                    "description": "The ID of the load balancer rule",
+                    "length": 255,
+                    "name": "id",
+                    "related": "",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "response": [
+                {
+                    "description": "true if operation is executed successfully",
+                    "name": "success",
+                    "type": "boolean"
+                },
+                {
+                    "description": "any text associated with the success or failure",
+                    "name": "displaytext",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Lists all the system wide capacities.",
+            "isasync": false,
+            "name": "listCapacity",
+            "params": [
+                {
+                    "description": "lists capacity by the Zone ID",
+                    "length": 255,
+                    "name": "zoneid",
+                    "related": "listZones",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "lists capacity by type* CAPACITY_TYPE_MEMORY = 0* CAPACITY_TYPE_CPU = 1* CAPACITY_TYPE_STORAGE = 2* CAPACITY_TYPE_STORAGE_ALLOCATED = 3* CAPACITY_TYPE_VIRTUAL_NETWORK_PUBLIC_IP = 4* CAPACITY_TYPE_PRIVATE_IP = 5* CAPACITY_TYPE_SECONDARY_STORAGE = 6* CAPACITY_TYPE_VLAN = 7* CAPACITY_TYPE_DIRECT_ATTACHED_PUBLIC_IP = 8* CAPACITY_TYPE_LOCAL_STORAGE = 9.",
+                    "length": 255,
+                    "name": "type",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "Sort the results. Available values: Usage",
+                    "length": 255,
+                    "name": "sortby",
+                    "required": false,
+                    "since": "3.0.0",
+                    "type": "string"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "page",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "recalculate capacities and fetch the latest",
+                    "length": 255,
+                    "name": "fetchlatest",
+                    "required": false,
+                    "since": "3.0.0",
+                    "type": "boolean"
+                },
+                {
+                    "description": "lists capacity by the Pod ID",
+                    "length": 255,
+                    "name": "podid",
+                    "related": "",
+                    "required": false,
+                    "type": "uuid"
+                },
+                {
+                    "description": "",
+                    "length": 255,
+                    "name": "pagesize",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "lists capacity by the Cluster ID",
+                    "length": 255,
+                    "name": "clusterid",
+                    "related": "",
+                    "required": false,
+                    "since": "3.0.0",
+                    "type": "uuid"
+                },
+                {
+                    "description": "List by keyword",
+                    "length": 255,
+                    "name": "keyword",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the Cluster ID",
+                    "name": "clusterid",
+                    "type": "string"
+                },
+                {
+                    "description": "the total capacity available",
+                    "name": "capacitytotal",
+                    "type": "long"
+                },
+                {
+                    "description": "the Pod ID",
+                    "name": "podid",
+                    "type": "string"
+                },
+                {
+                    "description": "the Pod name",
+                    "name": "podname",
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone name",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "the capacity currently in use",
+                    "name": "capacityused",
+                    "type": "long"
+                },
+                {
+                    "description": "the capacity type",
+                    "name": "type",
+                    "type": "short"
+                },
+                {
+                    "description": "the Cluster name",
+                    "name": "clustername",
+                    "type": "string"
+                },
+                {
+                    "description": "the Zone ID",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the percentage of capacity currently in use",
+                    "name": "percentused",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Starts a virtual machine.",
+            "isasync": true,
+            "name": "startVirtualMachine",
+            "params": [
+                {
+                    "description": "Deployment planner to use for vm allocation. Available to ROOT admin only",
+                    "length": 255,
+                    "name": "deploymentplanner",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "string"
+                },
+                {
+                    "description": "The ID of the virtual machine",
+                    "length": 255,
+                    "name": "id",
+                    "related": "resetSSHKeyForVirtualMachine,updateVMAffinityGroup,rebootVirtualMachine,restoreVirtualMachine,stopVirtualMachine,detachIso,deployVirtualMachine,updateVirtualMachine,revertToVMSnapshot,resetPasswordForVirtualMachine,startVirtualMachine,updateDefaultNicForVirtualMachine,startVirtualMachine,attachIso,listVirtualMachines,addNicToVirtualMachine,stopVirtualMachine,destroyVirtualMachine,removeNicFromVirtualMachine,changeServiceForVirtualMachine",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "destination Host ID to deploy the VM to - parameter available for root admin only",
+                    "length": 255,
+                    "name": "hostid",
+                    "related": "",
+                    "required": false,
+                    "since": "3.0.1",
+                    "type": "uuid"
+                }
+            ],
+            "related": "resetSSHKeyForVirtualMachine,updateVMAffinityGroup,rebootVirtualMachine,restoreVirtualMachine,stopVirtualMachine,detachIso,deployVirtualMachine,updateVirtualMachine,revertToVMSnapshot,resetPasswordForVirtualMachine,updateDefaultNicForVirtualMachine,startVirtualMachine,attachIso,listVirtualMachines,addNicToVirtualMachine,stopVirtualMachine,destroyVirtualMachine,removeNicFromVirtualMachine,changeServiceForVirtualMachine",
+            "response": [
+                {
+                    "description": "ssh key-pair",
+                    "name": "keypair",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the ISO attached to the virtual machine",
+                    "name": "isoname",
+                    "type": "string"
+                },
+                {
+                    "description": "public IP address id associated with vm via Static nat rule",
+                    "name": "publicip",
+                    "type": "string"
+                },
+                {
+                    "description": "Vm details in key/value pairs.",
+                    "name": "details",
+                    "type": "map"
+                },
+                {
+                    "description": "the ID of the disk offering of the virtual machine",
+                    "name": "diskofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "public IP address id associated with vm via Static nat rule",
+                    "name": "publicipid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the availability zone for the virtual machine",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "State of the Service from LB rule",
+                    "name": "servicestate",
+                    "type": "string"
+                },
+                {
+                    "description": "the virtual network for the service offering",
+                    "name": "forvirtualnetwork",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the name of the host for the virtual machine",
+                    "name": "hostname",
+                    "type": "string"
+                },
+                {
+                    "description": "the amount of the vm's CPU currently used",
+                    "name": "cpuused",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the virtual machine",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the memory allocated for the virtual machine",
+                    "name": "memory",
+                    "type": "integer"
+                },
+                {
+                    "description": "the ID of the domain in which the virtual machine exists",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the target memory in vm",
+                    "name": "memorytargetkbs",
+                    "type": "long"
+                },
+                {
+                    "description": "user generated name. The name of the virtual machine is returned if no displayname exists.",
+                    "name": "displayname",
+                    "type": "string"
+                },
+                {
+                    "description": "OS type id of the vm",
+                    "name": "ostypeid",
+                    "type": "long"
+                },
+                {
+                    "description": "the user's ID who deployed the virtual machine",
+                    "name": "userid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the service offering of the virtual machine",
+                    "name": "serviceofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the ISO attached to the virtual machine",
+                    "name": "isoid",
+                    "type": "string"
+                },
+                {
+                    "description": "the password (if exists) of the virtual machine",
+                    "name": "password",
+                    "type": "string"
+                },
+                {
+                    "description": "the project id of the vm",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the date when this virtual machine was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the group ID of the virtual machine",
+                    "name": "groupid",
+                    "type": "string"
+                },
+                {
+                    "description": "the incoming network traffic on the vm",
+                    "name": "networkkbsread",
+                    "type": "long"
+                },
+                {
+                    "description": "the name of the template for the virtual machine",
+                    "name": "templatename",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the host for the virtual machine",
+                    "name": "hostid",
+                    "type": "string"
+                },
+                {
+                    "description": "the group name of the virtual machine",
+                    "name": "group",
+                    "type": "string"
+                },
+                {
+                    "description": "the hypervisor on which the template runs",
+                    "name": "hypervisor",
+                    "type": "string"
+                },
+                {
+                    "description": "instance name of the user vm; this parameter is returned to the ROOT admin only",
+                    "name": "instancename",
+                    "type": "string"
+                },
+                {
+
+                },
+                {
+                    "description": "the list of nics associated with vm",
+                    "name": "nic",
+                    "response": [
+                        {
+                            "description": "the traffic type of the nic",
+                            "name": "traffictype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the netmask of the nic",
+                            "name": "netmask",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the NSX Logical Switch Port (if NSX based), null otherwise",
+                            "name": "nsxlogicalswitchport",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the Secondary ipv4 addr of nic",
+                            "name": "secondaryip",
+                            "type": "list"
+                        },
+                        {
+                            "description": "the gateway of IPv6 network",
+                            "name": "ip6gateway",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the vm to which the nic belongs",
+                            "name": "virtualmachineid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the NSX Logical Switch (if NSX based), null otherwise",
+                            "name": "nsxlogicalswitch",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if nic is default, false otherwise",
+                            "name": "isdefault",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "the ip address of the nic",
+                            "name": "ipaddress",
+                            "type": "string"
+                        },
+                        {
+                            "description": "device id for the network when plugged into the virtual machine",
+                            "name": "deviceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the isolation uri of the nic",
+                            "name": "isolationuri",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the broadcast uri of the nic",
+                            "name": "broadcasturi",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the nic",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the name of the corresponding network",
+                            "name": "networkname",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the cidr of IPv6 network",
+                            "name": "ip6cidr",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the gateway of the nic",
+                            "name": "gateway",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the type of the nic",
+                            "name": "type",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if nic is default, false otherwise",
+                            "name": "macaddress",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the corresponding network",
+                            "name": "networkid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the IPv6 address of network",
+                            "name": "ip6address",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "true if the password rest feature is enabled, false otherwise",
+                    "name": "passwordenabled",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the name of the domain in which the virtual machine exists",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": " an alternate display text of the template for the virtual machine",
+                    "name": "templatedisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "the internal memory thats free in vm",
+                    "name": "memoryintfreekbs",
+                    "type": "long"
+                },
+                {
+                    "description": "the read (bytes) of disk on the vm",
+                    "name": "diskkbsread",
+                    "type": "long"
+                },
+                {
+                    "description": "the name of the disk offering of the virtual machine",
+                    "name": "diskofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "list of affinity groups associated with the virtual machine",
+                    "name": "affinitygroup",
+                    "response": [
+                        {
+                            "description": "the domain ID of the affinity group",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the description of the affinity group",
+                            "name": "description",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project ID of the affinity group",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the type of the affinity group",
+                            "name": "type",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the name of the affinity group",
+                            "name": "name",
+                            "type": "string"
+                        },
+                        {
+                            "description": "virtual machine IDs associated with this affinity group",
+                            "name": "virtualmachineIds",
+                            "type": "list"
+                        },
+                        {
+                            "description": "the project name of the affinity group",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the affinity group",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account owning the affinity group",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain name of the affinity group",
+                            "name": "domain",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "an alternate display text of the ISO attached to the virtual machine",
+                    "name": "isodisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "the user's name who deployed the virtual machine",
+                    "name": "username",
+                    "type": "string"
+                },
+                {
+                    "description": "Os type ID of the virtual machine",
+                    "name": "guestosid",
+                    "type": "string"
+                },
+                {
+                    "description": "the number of cpu this virtual machine is running with",
+                    "name": "cpunumber",
+                    "type": "integer"
+                },
+                {
+                    "description": "the name of the service offering of the virtual machine",
+                    "name": "serviceofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "the outgoing network traffic on the host",
+                    "name": "networkkbswrite",
+                    "type": "long"
+                },
+                {
+                    "description": "device ID of the root volume",
+                    "name": "rootdeviceid",
+                    "type": "long"
+                },
+                {
+                    "description": "the ID of the availablility zone for the virtual machine",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "true if vm contains XS/VMWare tools inorder to support dynamic scaling of VM cpu/memory.",
+                    "name": "isdynamicallyscalable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the write (io) of disk on the vm",
+                    "name": "diskiowrite",
+                    "type": "long"
+                },
+                {
+                    "description": "the account associated with the virtual machine",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the template for the virtual machine. A -1 is returned if the virtual machine was created from an ISO file.",
+                    "name": "templateid",
+                    "type": "string"
+                },
+                {
+                    "description": "the memory used by the vm",
+                    "name": "memorykbs",
+                    "type": "long"
+                },
+                {
+                    "description": "the read (io) of disk on the vm",
+                    "name": "diskioread",
+                    "type": "long"
+                },
+                {
+                    "description": "device type of the root volume",
+                    "name": "rootdevicetype",
+                    "type": "string"
+                },
+                {
+                    "description": "the speed of each cpu",
+                    "name": "cpuspeed",
+                    "type": "integer"
+                },
+                {
+                    "description": "the name of the virtual machine",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "list of security groups associated with the virtual machine",
+                    "name": "securitygroup",
+                    "response": [
+                        {
+                            "description": "the ID of the security group",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain ID of the security group",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the name of the security group",
+                            "name": "name",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of virtualmachine ids associated with this securitygroup",
+                            "name": "virtualmachineids",
+                            "type": "set"
+                        },
+                        {
+                            "description": "the number of virtualmachines associated with this securitygroup",
+                            "name": "virtualmachinecount",
+                            "type": "integer"
+                        },
+                        {
+                            "description": "the domain name of the security group",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of ingress rules associated with the security group",
+                            "name": "ingressrule",
+                            "response": [
+                                {
+                                    "description": "the protocol of the security group rule",
+                                    "name": "protocol",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the code for the ICMP message response",
+                                    "name": "icmpcode",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the list of resource tags associated with the rule",
+                                    "name": "tags",
+                                    "response": [
+                                        {
+                                            "description": "tag value",
+                                            "name": "value",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the account associated with the tag",
+                                            "name": "account",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project id the tag belongs to",
+                                            "name": "projectid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the domain associated with the tag",
+                                            "name": "domain",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag key name",
+                                            "name": "key",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "resource type",
+                                            "name": "resourcetype",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project name where tag belongs to",
+                                            "name": "project",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "customer associated with the tag",
+                                            "name": "customer",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the ID of the domain associated with the tag",
+                                            "name": "domainid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "id of the resource",
+                                            "name": "resourceid",
+                                            "type": "string"
+                                        }
+                                    ],
+                                    "type": "set"
+                                },
+                                {
+                                    "description": "account owning the security group rule",
+                                    "name": "account",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the starting IP of the security group rule",
+                                    "name": "startport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the id of the security group rule",
+                                    "name": "ruleid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the CIDR notation for the base IP address of the security group rule",
+                                    "name": "cidr",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "security group name",
+                                    "name": "securitygroupname",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the type of the ICMP message response",
+                                    "name": "icmptype",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the ending IP of the security group rule ",
+                                    "name": "endport",
+                                    "type": "integer"
+                                }
+                            ],
+                            "type": "set"
+                        },
+                        {
+                            "description": "the project id of the group",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name of the group",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account owning the security group",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of resource tags associated with the rule",
+                            "name": "tags",
+                            "response": [
+                                {
+                                    "description": "the account associated with the tag",
+                                    "name": "account",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the project id the tag belongs to",
+                                    "name": "projectid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "customer associated with the tag",
+                                    "name": "customer",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the ID of the domain associated with the tag",
+                                    "name": "domainid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the project name where tag belongs to",
+                                    "name": "project",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "tag key name",
+                                    "name": "key",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "resource type",
+                                    "name": "resourcetype",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the domain associated with the tag",
+                                    "name": "domain",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "tag value",
+                                    "name": "value",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "id of the resource",
+                                    "name": "resourceid",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "set"
+                        },
+                        {
+                            "description": "the list of egress rules associated with the security group",
+                            "name": "egressrule",
+                            "response": [
+                                {
+                                    "description": "the list of resource tags associated with the rule",
+                                    "name": "tags",
+                                    "response": [
+                                        {
+                                            "description": "resource type",
+                                            "name": "resourcetype",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project id the tag belongs to",
+                                            "name": "projectid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project name where tag belongs to",
+                                            "name": "project",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the ID of the domain associated with the tag",
+                                            "name": "domainid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag value",
+                                            "name": "value",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the domain associated with the tag",
+                                            "name": "domain",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "customer associated with the tag",
+                                            "name": "customer",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the account associated with the tag",
+                                            "name": "account",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag key name",
+                                            "name": "key",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "id of the resource",
+                                            "name": "resourceid",
+                                            "type": "string"
+                                        }
+                                    ],
+                                    "type": "set"
+                                },
+                                {
+                                    "description": "account owning the security group rule",
+                                    "name": "account",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the code for the ICMP message response",
+                                    "name": "icmpcode",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the starting IP of the security group rule",
+                                    "name": "startport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the type of the ICMP message response",
+                                    "name": "icmptype",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the id of the security group rule",
+                                    "name": "ruleid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the ending IP of the security group rule ",
+                                    "name": "endport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "security group name",
+                                    "name": "securitygroupname",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the CIDR notation for the base IP address of the security group rule",
+                                    "name": "cidr",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the protocol of the security group rule",
+                                    "name": "protocol",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "set"
+                        },
+                        {
+                            "description": "the description of the security group",
+                            "name": "description",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "the project name of the vm",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the vgpu type used by the virtual machine",
+                    "name": "vgpu",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of the virtual machine",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the write (bytes) of disk on the vm",
+                    "name": "diskkbswrite",
+                    "type": "long"
+                },
+                {
+                    "description": "true if high-availability is enabled, false otherwise",
+                    "name": "haenable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "an optional field whether to the display the vm to the end user or not.",
+                    "name": "displayvm",
+                    "type": "boolean"
+                }
+            ]
+        },
+        {
+            "description": "Updates a service offering.",
+            "isasync": false,
+            "name": "updateServiceOffering",
+            "params": [
+                {
+                    "description": "sort key of the service offering, integer",
+                    "length": 255,
+                    "name": "sortkey",
+                    "required": false,
+                    "type": "integer"
+                },
+                {
+                    "description": "the name of the service offering to be updated",
+                    "length": 255,
+                    "name": "name",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the display text of the service offering to be updated",
+                    "length": 255,
+                    "name": "displaytext",
+                    "required": false,
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the service offering to be updated",
+                    "length": 255,
+                    "name": "id",
+                    "related": "updateServiceOffering",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the date this service offering was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "Domain name for the offering",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "is true if the offering is customized",
+                    "name": "iscustomized",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the min iops of the disk offering",
+                    "name": "miniops",
+                    "type": "long"
+                },
+                {
+                    "description": "an alternate display text of the service offering.",
+                    "name": "displaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "restrict the CPU usage to committed service offering",
+                    "name": "limitcpuuse",
+                    "type": "boolean"
+                },
+                {
+                    "description": "true if the vm needs to be volatile, i.e., on every reboot of vm from API root disk is discarded and creates a new root disk",
+                    "name": "isvolatile",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the tags for the service offering",
+                    "name": "tags",
+                    "type": "string"
+                },
+                {
+                    "description": "provisioning type used to create volumes. Valid values are thin, sparse, fat.",
+                    "name": "provisioningtype",
+                    "type": "string"
+                },
+                {
+                    "description": "bytes write rate of the service offering",
+                    "name": "diskBytesWriteRate",
+                    "type": "long"
+                },
+                {
+                    "description": "the name of the service offering",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "the number of CPU",
+                    "name": "cpunumber",
+                    "type": "integer"
+                },
+                {
+                    "description": "the memory in MB",
+                    "name": "memory",
+                    "type": "integer"
+                },
+                {
+                    "description": "the max iops of the disk offering",
+                    "name": "maxiops",
+                    "type": "long"
+                },
+                {
+                    "description": "data transfer rate in megabits per second allowed.",
+                    "name": "networkrate",
+                    "type": "integer"
+                },
+                {
+                    "description": "Hypervisor snapshot reserve space as a percent of a volume (for managed storage using Xen or VMware)",
+                    "name": "hypervisorsnapshotreserve",
+                    "type": "integer"
+                },
+                {
+                    "description": "io requests write rate of the service offering",
+                    "name": "diskIopsWriteRate",
+                    "type": "long"
+                },
+                {
+                    "description": "is this a system vm offering",
+                    "name": "issystem",
+                    "type": "boolean"
+                },
+                {
+                    "description": "bytes read rate of the service offering",
+                    "name": "diskBytesReadRate",
+                    "type": "long"
+                },
+                {
+                    "description": "io requests read rate of the service offering",
+                    "name": "diskIopsReadRate",
+                    "type": "long"
+                },
+                {
+                    "description": "additional key/value details tied with this service offering",
+                    "name": "serviceofferingdetails",
+                    "type": "map"
+                },
+                {
+                    "description": "deployment strategy used to deploy VM.",
+                    "name": "deploymentplanner",
+                    "type": "string"
+                },
+                {
+                    "description": "is this a the systemvm type for system vm offering",
+                    "name": "systemvmtype",
+                    "type": "string"
+                },
+                {
+                    "description": "the id of the service offering",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "true if disk offering uses custom iops, false otherwise",
+                    "name": "iscustomizediops",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the host tag for the service offering",
+                    "name": "hosttags",
+                    "type": "string"
+                },
+                {
+                    "description": "the clock rate CPU speed in Mhz",
+                    "name": "cpuspeed",
+                    "type": "integer"
+                },
+                {
+                    "description": "the ha support in the service offering",
+                    "name": "offerha",
+                    "type": "boolean"
+                },
+                {
+                    "description": "is this a  default system vm offering",
+                    "name": "defaultuse",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the domain id of the service offering",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the storage type for this service offering",
+                    "name": "storagetype",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Stops a virtual machine.",
+            "isasync": true,
+            "name": "stopVirtualMachine",
+            "params": [
+                {
+                    "description": "Force stop the VM (vm is marked as Stopped even when command fails to be send to the backend, otherwise a force poweroff is attempted).  The caller knows the VM is stopped.",
+                    "length": 255,
+                    "name": "forced",
+                    "required": false,
+                    "type": "boolean"
+                },
+                {
+                    "description": "The ID of the virtual machine",
+                    "length": 255,
+                    "name": "id",
+                    "related": "resetSSHKeyForVirtualMachine,updateVMAffinityGroup,rebootVirtualMachine,restoreVirtualMachine,stopVirtualMachine,detachIso,deployVirtualMachine,updateVirtualMachine,revertToVMSnapshot,resetPasswordForVirtualMachine,updateDefaultNicForVirtualMachine,startVirtualMachine,attachIso,listVirtualMachines,addNicToVirtualMachine,stopVirtualMachine,destroyVirtualMachine,removeNicFromVirtualMachine,changeServiceForVirtualMachine",
+                    "required": true,
+                    "type": "uuid"
+                }
+            ],
+            "related": "resetSSHKeyForVirtualMachine,updateVMAffinityGroup,rebootVirtualMachine,restoreVirtualMachine,detachIso,deployVirtualMachine,updateVirtualMachine,revertToVMSnapshot,resetPasswordForVirtualMachine,updateDefaultNicForVirtualMachine,startVirtualMachine,attachIso,listVirtualMachines,addNicToVirtualMachine,stopVirtualMachine,destroyVirtualMachine,removeNicFromVirtualMachine,changeServiceForVirtualMachine",
+            "response": [
+                {
+                    "description": "the speed of each cpu",
+                    "name": "cpuspeed",
+                    "type": "integer"
+                },
+                {
+                    "description": "the write (io) of disk on the vm",
+                    "name": "diskiowrite",
+                    "type": "long"
+                },
+                {
+                    "description": " an alternate display text of the template for the virtual machine",
+                    "name": "templatedisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "the amount of the vm's CPU currently used",
+                    "name": "cpuused",
+                    "type": "string"
+                },
+                {
+                    "description": "device ID of the root volume",
+                    "name": "rootdeviceid",
+                    "type": "long"
+                },
+                {
+                    "description": "the name of the domain in which the virtual machine exists",
+                    "name": "domain",
+                    "type": "string"
+                },
+                {
+                    "description": "instance name of the user vm; this parameter is returned to the ROOT admin only",
+                    "name": "instancename",
+                    "type": "string"
+                },
+                {
+                    "description": "the state of the virtual machine",
+                    "name": "state",
+                    "type": "string"
+                },
+                {
+                    "description": "the vgpu type used by the virtual machine",
+                    "name": "vgpu",
+                    "type": "string"
+                },
+                {
+                    "description": "list of affinity groups associated with the virtual machine",
+                    "name": "affinitygroup",
+                    "response": [
+                        {
+                            "description": "the description of the affinity group",
+                            "name": "description",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the account owning the affinity group",
+                            "name": "account",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name of the affinity group",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain ID of the affinity group",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the name of the affinity group",
+                            "name": "name",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the domain name of the affinity group",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project ID of the affinity group",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "virtual machine IDs associated with this affinity group",
+                            "name": "virtualmachineIds",
+                            "type": "list"
+                        },
+                        {
+                            "description": "the type of the affinity group",
+                            "name": "type",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the affinity group",
+                            "name": "id",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "the ID of the host for the virtual machine",
+                    "name": "hostid",
+                    "type": "string"
+                },
+                {
+                    "description": "public IP address id associated with vm via Static nat rule",
+                    "name": "publicip",
+                    "type": "string"
+                },
+                {
+                    "description": "true if the password rest feature is enabled, false otherwise",
+                    "name": "passwordenabled",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the name of the availability zone for the virtual machine",
+                    "name": "zonename",
+                    "type": "string"
+                },
+                {
+                    "description": "an optional field whether to the display the vm to the end user or not.",
+                    "name": "displayvm",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the write (bytes) of disk on the vm",
+                    "name": "diskkbswrite",
+                    "type": "long"
+                },
+                {
+                    "description": "Vm details in key/value pairs.",
+                    "name": "details",
+                    "type": "map"
+                },
+                {
+                    "description": "the user's ID who deployed the virtual machine",
+                    "name": "userid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the disk offering of the virtual machine",
+                    "name": "diskofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "OS type id of the vm",
+                    "name": "ostypeid",
+                    "type": "long"
+                },
+                {
+                    "description": "the ID of the template for the virtual machine. A -1 is returned if the virtual machine was created from an ISO file.",
+                    "name": "templateid",
+                    "type": "string"
+                },
+                {
+                    "description": "the memory allocated for the virtual machine",
+                    "name": "memory",
+                    "type": "integer"
+                },
+                {
+                    "description": "user generated name. The name of the virtual machine is returned if no displayname exists.",
+                    "name": "displayname",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the service offering of the virtual machine",
+                    "name": "serviceofferingname",
+                    "type": "string"
+                },
+                {
+                    "description": "public IP address id associated with vm via Static nat rule",
+                    "name": "publicipid",
+                    "type": "string"
+                },
+                {
+                    "description": "true if high-availability is enabled, false otherwise",
+                    "name": "haenable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the ID of the ISO attached to the virtual machine",
+                    "name": "isoid",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the service offering of the virtual machine",
+                    "name": "serviceofferingid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the virtual machine",
+                    "name": "name",
+                    "type": "string"
+                },
+                {
+                    "description": "list of security groups associated with the virtual machine",
+                    "name": "securitygroup",
+                    "response": [
+                        {
+                            "description": "the domain ID of the security group",
+                            "name": "domainid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of ingress rules associated with the security group",
+                            "name": "ingressrule",
+                            "response": [
+                                {
+                                    "description": "the code for the ICMP message response",
+                                    "name": "icmpcode",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the protocol of the security group rule",
+                                    "name": "protocol",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the starting IP of the security group rule",
+                                    "name": "startport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "account owning the security group rule",
+                                    "name": "account",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "security group name",
+                                    "name": "securitygroupname",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the list of resource tags associated with the rule",
+                                    "name": "tags",
+                                    "response": [
+                                        {
+                                            "description": "the domain associated with the tag",
+                                            "name": "domain",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the account associated with the tag",
+                                            "name": "account",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "resource type",
+                                            "name": "resourcetype",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag value",
+                                            "name": "value",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag key name",
+                                            "name": "key",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project name where tag belongs to",
+                                            "name": "project",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "customer associated with the tag",
+                                            "name": "customer",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the ID of the domain associated with the tag",
+                                            "name": "domainid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project id the tag belongs to",
+                                            "name": "projectid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "id of the resource",
+                                            "name": "resourceid",
+                                            "type": "string"
+                                        }
+                                    ],
+                                    "type": "set"
+                                },
+                                {
+                                    "description": "the type of the ICMP message response",
+                                    "name": "icmptype",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the CIDR notation for the base IP address of the security group rule",
+                                    "name": "cidr",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the ending IP of the security group rule ",
+                                    "name": "endport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the id of the security group rule",
+                                    "name": "ruleid",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "set"
+                        },
+                        {
+                            "description": "the project id of the group",
+                            "name": "projectid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the list of resource tags associated with the rule",
+                            "name": "tags",
+                            "response": [
+                                {
+                                    "description": "resource type",
+                                    "name": "resourcetype",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "customer associated with the tag",
+                                    "name": "customer",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "tag value",
+                                    "name": "value",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the domain associated with the tag",
+                                    "name": "domain",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the account associated with the tag",
+                                    "name": "account",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the project id the tag belongs to",
+                                    "name": "projectid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "id of the resource",
+                                    "name": "resourceid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the project name where tag belongs to",
+                                    "name": "project",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "tag key name",
+                                    "name": "key",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the ID of the domain associated with the tag",
+                                    "name": "domainid",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "set"
+                        },
+                        {
+                            "description": "the list of egress rules associated with the security group",
+                            "name": "egressrule",
+                            "response": [
+                                {
+                                    "description": "the code for the ICMP message response",
+                                    "name": "icmpcode",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the id of the security group rule",
+                                    "name": "ruleid",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "security group name",
+                                    "name": "securitygroupname",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the type of the ICMP message response",
+                                    "name": "icmptype",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the list of resource tags associated with the rule",
+                                    "name": "tags",
+                                    "response": [
+                                        {
+                                            "description": "the domain associated with the tag",
+                                            "name": "domain",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag key name",
+                                            "name": "key",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the account associated with the tag",
+                                            "name": "account",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the ID of the domain associated with the tag",
+                                            "name": "domainid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "id of the resource",
+                                            "name": "resourceid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "customer associated with the tag",
+                                            "name": "customer",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "tag value",
+                                            "name": "value",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "resource type",
+                                            "name": "resourcetype",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project id the tag belongs to",
+                                            "name": "projectid",
+                                            "type": "string"
+                                        },
+                                        {
+                                            "description": "the project name where tag belongs to",
+                                            "name": "project",
+                                            "type": "string"
+                                        }
+                                    ],
+                                    "type": "set"
+                                },
+                                {
+                                    "description": "the CIDR notation for the base IP address of the security group rule",
+                                    "name": "cidr",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the starting IP of the security group rule",
+                                    "name": "startport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "the protocol of the security group rule",
+                                    "name": "protocol",
+                                    "type": "string"
+                                },
+                                {
+                                    "description": "the ending IP of the security group rule ",
+                                    "name": "endport",
+                                    "type": "integer"
+                                },
+                                {
+                                    "description": "account owning the security group rule",
+                                    "name": "account",
+                                    "type": "string"
+                                }
+                            ],
+                            "type": "set"
+                        },
+                        {
+                            "description": "the domain name of the security group",
+                            "name": "domain",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the name of the security group",
+                            "name": "name",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the project name of the group",
+                            "name": "project",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the description of the security group",
+                            "name": "description",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the security group",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the number of virtualmachines associated with this securitygroup",
+                            "name": "virtualmachinecount",
+                            "type": "integer"
+                        },
+                        {
+                            "description": "the list of virtualmachine ids associated with this securitygroup",
+                            "name": "virtualmachineids",
+                            "type": "set"
+                        },
+                        {
+                            "description": "the account owning the security group",
+                            "name": "account",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "the project name of the vm",
+                    "name": "project",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the domain in which the virtual machine exists",
+                    "name": "domainid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the template for the virtual machine",
+                    "name": "templatename",
+                    "type": "string"
+                },
+                {
+                    "description": "the hypervisor on which the template runs",
+                    "name": "hypervisor",
+                    "type": "string"
+                },
+                {
+                    "description": "the password (if exists) of the virtual machine",
+                    "name": "password",
+                    "type": "string"
+                },
+                {
+                    "description": "State of the Service from LB rule",
+                    "name": "servicestate",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the availablility zone for the virtual machine",
+                    "name": "zoneid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the ISO attached to the virtual machine",
+                    "name": "isoname",
+                    "type": "string"
+                },
+                {
+                    "description": "the group name of the virtual machine",
+                    "name": "group",
+                    "type": "string"
+                },
+                {
+                    "description": "the virtual network for the service offering",
+                    "name": "forvirtualnetwork",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the outgoing network traffic on the host",
+                    "name": "networkkbswrite",
+                    "type": "long"
+                },
+                {
+                    "description": "the internal memory thats free in vm",
+                    "name": "memoryintfreekbs",
+                    "type": "long"
+                },
+                {
+                    "description": "the user's name who deployed the virtual machine",
+                    "name": "username",
+                    "type": "string"
+                },
+                {
+                    "description": "the date when this virtual machine was created",
+                    "name": "created",
+                    "type": "date"
+                },
+                {
+                    "description": "the project id of the vm",
+                    "name": "projectid",
+                    "type": "string"
+                },
+                {
+                    "description": "the target memory in vm",
+                    "name": "memorytargetkbs",
+                    "type": "long"
+                },
+                {
+                    "description": "the read (bytes) of disk on the vm",
+                    "name": "diskkbsread",
+                    "type": "long"
+                },
+                {
+                    "description": "the group ID of the virtual machine",
+                    "name": "groupid",
+                    "type": "string"
+                },
+                {
+                    "description": "the number of cpu this virtual machine is running with",
+                    "name": "cpunumber",
+                    "type": "integer"
+                },
+                {
+                    "description": "the incoming network traffic on the vm",
+                    "name": "networkkbsread",
+                    "type": "long"
+                },
+                {
+                    "description": "an alternate display text of the ISO attached to the virtual machine",
+                    "name": "isodisplaytext",
+                    "type": "string"
+                },
+                {
+                    "description": "the ID of the disk offering of the virtual machine",
+                    "name": "diskofferingid",
+                    "type": "string"
+                },
+                {
+
+                },
+                {
+                    "description": "the ID of the virtual machine",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "the account associated with the virtual machine",
+                    "name": "account",
+                    "type": "string"
+                },
+                {
+                    "description": "the read (io) of disk on the vm",
+                    "name": "diskioread",
+                    "type": "long"
+                },
+                {
+                    "description": "device type of the root volume",
+                    "name": "rootdevicetype",
+                    "type": "string"
+                },
+                {
+                    "description": "ssh key-pair",
+                    "name": "keypair",
+                    "type": "string"
+                },
+                {
+                    "description": "true if vm contains XS/VMWare tools inorder to support dynamic scaling of VM cpu/memory.",
+                    "name": "isdynamicallyscalable",
+                    "type": "boolean"
+                },
+                {
+                    "description": "the memory used by the vm",
+                    "name": "memorykbs",
+                    "type": "long"
+                },
+                {
+                    "description": "the list of nics associated with vm",
+                    "name": "nic",
+                    "response": [
+                        {
+                            "description": "the traffic type of the nic",
+                            "name": "traffictype",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the Secondary ipv4 addr of nic",
+                            "name": "secondaryip",
+                            "type": "list"
+                        },
+                        {
+                            "description": "Id of the NSX Logical Switch (if NSX based), null otherwise",
+                            "name": "nsxlogicalswitch",
+                            "type": "string"
+                        },
+                        {
+                            "description": "device id for the network when plugged into the virtual machine",
+                            "name": "deviceid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if nic is default, false otherwise",
+                            "name": "isdefault",
+                            "type": "boolean"
+                        },
+                        {
+                            "description": "the ID of the corresponding network",
+                            "name": "networkid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the name of the corresponding network",
+                            "name": "networkname",
+                            "type": "string"
+                        },
+                        {
+                            "description": "true if nic is default, false otherwise",
+                            "name": "macaddress",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the netmask of the nic",
+                            "name": "netmask",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the vm to which the nic belongs",
+                            "name": "virtualmachineid",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the isolation uri of the nic",
+                            "name": "isolationuri",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the gateway of the nic",
+                            "name": "gateway",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ID of the nic",
+                            "name": "id",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the broadcast uri of the nic",
+                            "name": "broadcasturi",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the cidr of IPv6 network",
+                            "name": "ip6cidr",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the gateway of IPv6 network",
+                            "name": "ip6gateway",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the ip address of the nic",
+                            "name": "ipaddress",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the type of the nic",
+                            "name": "type",
+                            "type": "string"
+                        },
+                        {
+                            "description": "Id of the NSX Logical Switch Port (if NSX based), null otherwise",
+                            "name": "nsxlogicalswitchport",
+                            "type": "string"
+                        },
+                        {
+                            "description": "the IPv6 address of network",
+                            "name": "ip6address",
+                            "type": "string"
+                        }
+                    ],
+                    "type": "set"
+                },
+                {
+                    "description": "Os type ID of the virtual machine",
+                    "name": "guestosid",
+                    "type": "string"
+                },
+                {
+                    "description": "the name of the host for the virtual machine",
+                    "name": "hostname",
+                    "type": "string"
+                }
+            ]
+        },
+        {
+            "description": "Creates a network ACL for the given VPC",
+            "isasync": true,
+            "name": "createNetworkACLList",
+            "params": [
+                {
+                    "description": "an optional field, whether to the display the list to the end user or not",
+                    "length": 255,
+                    "name": "fordisplay",
+                    "required": false,
+                    "since": "4.4",
+                    "type": "boolean"
+                },
+                {
+                    "description": "Name of the network ACL list",
+                    "length": 255,
+                    "name": "name",
+                    "required": true,
+                    "type": "string"
+                },
+                {
+                    "description": "ID of the VPC associated with this network ACL list",
+                    "length": 255,
+                    "name": "vpcid",
+                    "related": "updateVPC,listVPCs,createVPC",
+                    "required": true,
+                    "type": "uuid"
+                },
+                {
+                    "description": "Description of the network ACL list",
+                    "length": 255,
+                    "name": "description",
+                    "required": false,
+                    "type": "string"
+                }
+            ],
+            "related": "",
+            "response": [
+                {
+                    "description": "the ID of the ACL",
+                    "name": "id",
+                    "type": "string"
+                },
+                {
+                    "description": "Description of the ACL",
+                    "name": "description",
+                    "type": "string"
+                },
+                {
+                    "description": "is ACL for display to the regular user",
+                    "name": "fordisplay",
+                    "type": "boolean"
+                },
+                {
+                    "description": "Id of the VPC this ACL is associated with",
+                    "name": "vpcid",
+                    "type": "string"
+                },
+                {
+                    "description": "the Name of the ACL",
+                    "name": "name",
+                    "type": "string"
+                }
+            ]
+        }
+    ],
+    "count": 549
+}
diff --git a/vendor/github.com/xanzy/go-cloudstack/generate/regex.txt b/vendor/github.com/xanzy/go-cloudstack/generate/regex.txt
new file mode 100644
index 0000000..45cbb6a
--- /dev/null
+++ b/vendor/github.com/xanzy/go-cloudstack/generate/regex.txt
@@ -0,0 +1,46 @@
+#
+# Copyright 2018, Sander van Harmelen
+#
+# Licensed 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.
+#
+
+Below are some search/replace regex values (within single quotes)
+used within Sublime to format the API docs from the website.
+
+Maybe I'll add another function for this later on, but for now
+this also works fine...
+
+
+Search: '<div.*\n<h5>(.*)</h5>\n<ul>\n<li>'
+Replace: '$1'
+
+Search: '<a.*>(.*)</a>\n</li>\n<li>'
+Replace: '   $1'
+
+Search: '<a.*>(.*)</a>\n</li>\n</ul>\n</div>'
+Replace: '   $1'
+
+Search: '</div>\n.*\n'
+Replace: ''
+
+Search: '^([\S]+)$'
+Replace: '},\n"$1Service": {'
+
+Search: '^([\S]+)\ ([\S]+)[^{]$'
+Replace: '},\n"$1$2Service": {'
+
+Search: ' \(A\)$'
+Replace: ''
+
+Search: '^   ([\S]+)$'
+Replace: '   "$1",'
diff --git a/vendor/gopkg.in/gcfg.v1/.appveyor/appveyor.yml b/vendor/gopkg.in/gcfg.v1/.appveyor/appveyor.yml
new file mode 100644
index 0000000..1d03f8b
--- /dev/null
+++ b/vendor/gopkg.in/gcfg.v1/.appveyor/appveyor.yml
@@ -0,0 +1,19 @@
+version: '{branch}.{build}'
+branches:
+  only:
+  - v1
+clone_folder: c:\gopath\src\gopkg.in\gcfg.v1
+environment:
+  GOPATH: c:\gopath
+install:
+- set Path=c:\go\bin;%Path%
+- echo %Path%
+- go version
+- go env
+build_script:
+- cd %APPVEYOR_BUILD_FOLDER%
+- go get -v -t ./...
+- go build -v ./...
+test_script:
+- cd %APPVEYOR_BUILD_FOLDER%
+- go test -v ./...
diff --git a/vendor/gopkg.in/gcfg.v1/.circleci/config.yml b/vendor/gopkg.in/gcfg.v1/.circleci/config.yml
new file mode 100644
index 0000000..28c4906
--- /dev/null
+++ b/vendor/gopkg.in/gcfg.v1/.circleci/config.yml
@@ -0,0 +1,42 @@
+version: 2
+
+test: &test
+  working_directory: /go/src/gopkg.in/gcfg.v1
+  steps:
+    - checkout
+    - run: go version
+    - run: go env
+    - run: go get -v -t ./...
+    - run: go test -v ./...
+
+jobs:
+  rc:
+    <<: *test
+    docker:
+      - image: circleci/golang:rc
+  go1.10:
+    <<: *test
+    docker:
+      - image: circleci/golang:1.10
+  go1.9:
+    <<: *test
+    docker:
+      - image: circleci/golang:1.9
+  go1.8:
+    <<: *test
+    docker:
+      - image: circleci/golang:1.8
+  go1.7:
+    <<: *test
+    docker:
+      - image: circleci/golang:1.7
+
+workflows:
+  version: 2
+  test:
+    jobs:
+      - rc
+      - go1.10
+      - go1.9
+      - go1.8
+      - go1.7
diff --git a/vendor/gopkg.in/gcfg.v1/LICENSE b/vendor/gopkg.in/gcfg.v1/LICENSE
new file mode 100644
index 0000000..87a5ced
--- /dev/null
+++ b/vendor/gopkg.in/gcfg.v1/LICENSE
@@ -0,0 +1,28 @@
+Copyright (c) 2012 Péter Surányi. Portions Copyright (c) 2009 The Go
+Authors. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+   * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+   * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+   * Neither the name of Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/vendor/gopkg.in/gcfg.v1/README b/vendor/gopkg.in/gcfg.v1/README
new file mode 100644
index 0000000..1ff233a
--- /dev/null
+++ b/vendor/gopkg.in/gcfg.v1/README
@@ -0,0 +1,4 @@
+Gcfg reads INI-style configuration files into Go structs;
+supports user-defined types and subsections.
+
+Package docs: https://godoc.org/gopkg.in/gcfg.v1
diff --git a/vendor/gopkg.in/gcfg.v1/doc.go b/vendor/gopkg.in/gcfg.v1/doc.go
new file mode 100644
index 0000000..32f3e9d
--- /dev/null
+++ b/vendor/gopkg.in/gcfg.v1/doc.go
@@ -0,0 +1,145 @@
+// Package gcfg reads "INI-style" text-based configuration files with
+// "name=value" pairs grouped into sections (gcfg files).
+//
+// This package is still a work in progress; see the sections below for planned
+// changes.
+//
+// Syntax
+//
+// The syntax is based on that used by git config:
+// http://git-scm.com/docs/git-config#_syntax .
+// There are some (planned) differences compared to the git config format:
+//  - improve data portability:
+//    - must be encoded in UTF-8 (for now) and must not contain the 0 byte
+//    - include and "path" type is not supported
+//      (path type may be implementable as a user-defined type)
+//  - internationalization
+//    - section and variable names can contain unicode letters, unicode digits
+//      (as defined in http://golang.org/ref/spec#Characters ) and hyphens
+//      (U+002D), starting with a unicode letter
+//  - disallow potentially ambiguous or misleading definitions:
+//    - `[sec.sub]` format is not allowed (deprecated in gitconfig)
+//    - `[sec ""]` is not allowed
+//      - use `[sec]` for section name "sec" and empty subsection name
+//    - (planned) within a single file, definitions must be contiguous for each:
+//      - section: '[secA]' -> '[secB]' -> '[secA]' is an error
+//      - subsection: '[sec "A"]' -> '[sec "B"]' -> '[sec "A"]' is an error
+//      - multivalued variable: 'multi=a' -> 'other=x' -> 'multi=b' is an error
+//
+// Data structure
+//
+// The functions in this package read values into a user-defined struct.
+// Each section corresponds to a struct field in the config struct, and each
+// variable in a section corresponds to a data field in the section struct.
+// The mapping of each section or variable name to fields is done either based
+// on the "gcfg" struct tag or by matching the name of the section or variable,
+// ignoring case. In the latter case, hyphens '-' in section and variable names
+// correspond to underscores '_' in field names.
+// Fields must be exported; to use a section or variable name starting with a
+// letter that is neither upper- or lower-case, prefix the field name with 'X'.
+// (See https://code.google.com/p/go/issues/detail?id=5763#c4 .)
+//
+// For sections with subsections, the corresponding field in config must be a
+// map, rather than a struct, with string keys and pointer-to-struct values.
+// Values for subsection variables are stored in the map with the subsection
+// name used as the map key.
+// (Note that unlike section and variable names, subsection names are case
+// sensitive.)
+// When using a map, and there is a section with the same section name but
+// without a subsection name, its values are stored with the empty string used
+// as the key.
+// It is possible to provide default values for subsections in the section
+// "default-<sectionname>" (or by setting values in the corresponding struct
+// field "Default_<sectionname>").
+//
+// The functions in this package panic if config is not a pointer to a struct,
+// or when a field is not of a suitable type (either a struct or a map with
+// string keys and pointer-to-struct values).
+//
+// Parsing of values
+//
+// The section structs in the config struct may contain single-valued or
+// multi-valued variables. Variables of unnamed slice type (that is, a type
+// starting with `[]`) are treated as multi-value; all others (including named
+// slice types) are treated as single-valued variables.
+//
+// Single-valued variables are handled based on the type as follows.
+// Unnamed pointer types (that is, types starting with `*`) are dereferenced,
+// and if necessary, a new instance is allocated.
+//
+// For types implementing the encoding.TextUnmarshaler interface, the
+// UnmarshalText method is used to set the value. Implementing this method is
+// the recommended way for parsing user-defined types.
+//
+// For fields of string kind, the value string is assigned to the field, after
+// unquoting and unescaping as needed.
+// For fields of bool kind, the field is set to true if the value is "true",
+// "yes", "on" or "1", and set to false if the value is "false", "no", "off" or
+// "0", ignoring case. In addition, single-valued bool fields can be specified
+// with a "blank" value (variable name without equals sign and value); in such
+// case the value is set to true.
+//
+// Predefined integer types [u]int(|8|16|32|64) and big.Int are parsed as
+// decimal or hexadecimal (if having '0x' prefix). (This is to prevent
+// unintuitively handling zero-padded numbers as octal.) Other types having
+// [u]int* as the underlying type, such as os.FileMode and uintptr allow
+// decimal, hexadecimal, or octal values.
+// Parsing mode for integer types can be overridden using the struct tag option
+// ",int=mode" where mode is a combination of the 'd', 'h', and 'o' characters
+// (each standing for decimal, hexadecimal, and octal, respectively.)
+//
+// All other types are parsed using fmt.Sscanf with the "%v" verb.
+//
+// For multi-valued variables, each individual value is parsed as above and
+// appended to the slice. If the first value is specified as a "blank" value
+// (variable name without equals sign and value), a new slice is allocated;
+// that is any values previously set in the slice will be ignored.
+//
+// The types subpackage for provides helpers for parsing "enum-like" and integer
+// types.
+//
+// Error handling
+//
+// There are 3 types of errors:
+//
+//  - programmer errors / panics:
+//    - invalid configuration structure
+//  - data errors:
+//    - fatal errors:
+//      - invalid configuration syntax
+//    - warnings:
+//      - data that doesn't belong to any part of the config structure
+//
+// Programmer errors trigger panics. These are should be fixed by the programmer
+// before releasing code that uses gcfg.
+//
+// Data errors cause gcfg to return a non-nil error value. This includes the
+// case when there are extra unknown key-value definitions in the configuration
+// data (extra data).
+// However, in some occasions it is desirable to be able to proceed in
+// situations when the only data error is that of extra data.
+// These errors are handled at a different (warning) priority and can be
+// filtered out programmatically. To ignore extra data warnings, wrap the
+// gcfg.Read*Into invocation into a call to gcfg.FatalOnly.
+//
+// TODO
+//
+// The following is a list of changes under consideration:
+//  - documentation
+//    - self-contained syntax documentation
+//    - more practical examples
+//    - move TODOs to issue tracker (eventually)
+//  - syntax
+//    - reconsider valid escape sequences
+//      (gitconfig doesn't support \r in value, \t in subsection name, etc.)
+//  - reading / parsing gcfg files
+//    - define internal representation structure
+//    - support multiple inputs (readers, strings, files)
+//    - support declaring encoding (?)
+//    - support varying fields sets for subsections (?)
+//  - writing gcfg files
+//  - error handling
+//    - make error context accessible programmatically?
+//    - limit input size?
+//
+package gcfg // import "gopkg.in/gcfg.v1"
diff --git a/vendor/gopkg.in/gcfg.v1/errors.go b/vendor/gopkg.in/gcfg.v1/errors.go
new file mode 100644
index 0000000..83a591d
--- /dev/null
+++ b/vendor/gopkg.in/gcfg.v1/errors.go
@@ -0,0 +1,57 @@
+package gcfg
+
+import warnings "gopkg.in/warnings.v0"
+
+// FatalOnly filters the results of a Read*Into invocation and returns only
+// fatal errors. That is, errors (warnings) indicating data for unknown
+// sections / variables is ignored. Example invocation:
+//
+//  err := gcfg.FatalOnly(gcfg.ReadFileInto(&cfg, configFile))
+//  if err != nil {
+//      ...
+//
+func FatalOnly(err error) error {
+	return warnings.FatalOnly(err)
+}
+
+func isFatal(err error) bool {
+	_, ok := err.(extraData)
+	return !ok
+}
+
+type loc struct {
+	section    string
+	subsection *string
+	variable   *string
+}
+
+type extraData struct {
+	loc
+}
+
+type locErr struct {
+	msg string
+	loc
+}
+
+func (l loc) String() string {
+	s := "section \"" + l.section + "\""
+	if l.subsection != nil {
+		s += ", subsection \"" + *l.subsection + "\""
+	}
+	if l.variable != nil {
+		s += ", variable \"" + *l.variable + "\""
+	}
+	return s
+}
+
+func (e extraData) Error() string {
+	return "can't store data at " + e.loc.String()
+}
+
+func (e locErr) Error() string {
+	return e.msg + " at " + e.loc.String()
+}
+
+var _ error = extraData{}
+var _ error = locErr{}
diff --git a/vendor/gopkg.in/gcfg.v1/example_test.go b/vendor/gopkg.in/gcfg.v1/example_test.go
new file mode 100644
index 0000000..6fda72a
--- /dev/null
+++ b/vendor/gopkg.in/gcfg.v1/example_test.go
@@ -0,0 +1,132 @@
+package gcfg_test
+
+import (
+	"fmt"
+	"log"
+)
+
+import "gopkg.in/gcfg.v1"
+
+func ExampleReadStringInto() {
+	cfgStr := `; Comment line
+[section]
+name=value # comment`
+	cfg := struct {
+		Section struct {
+			Name string
+		}
+	}{}
+	err := gcfg.ReadStringInto(&cfg, cfgStr)
+	if err != nil {
+		log.Fatalf("Failed to parse gcfg data: %s", err)
+	}
+	fmt.Println(cfg.Section.Name)
+	// Output: value
+}
+
+func ExampleReadStringInto_bool() {
+	cfgStr := `; Comment line
+[section]
+switch=on`
+	cfg := struct {
+		Section struct {
+			Switch bool
+		}
+	}{}
+	err := gcfg.ReadStringInto(&cfg, cfgStr)
+	if err != nil {
+		log.Fatalf("Failed to parse gcfg data: %s", err)
+	}
+	fmt.Println(cfg.Section.Switch)
+	// Output: true
+}
+
+func ExampleReadStringInto_hyphens() {
+	cfgStr := `; Comment line
+[section-name]
+variable-name=value # comment`
+	cfg := struct {
+		Section_Name struct {
+			Variable_Name string
+		}
+	}{}
+	err := gcfg.ReadStringInto(&cfg, cfgStr)
+	if err != nil {
+		log.Fatalf("Failed to parse gcfg data: %s", err)
+	}
+	fmt.Println(cfg.Section_Name.Variable_Name)
+	// Output: value
+}
+
+func ExampleReadStringInto_tags() {
+	cfgStr := `; Comment line
+[section]
+var-name=value # comment`
+	cfg := struct {
+		Section struct {
+			FieldName string `gcfg:"var-name"`
+		}
+	}{}
+	err := gcfg.ReadStringInto(&cfg, cfgStr)
+	if err != nil {
+		log.Fatalf("Failed to parse gcfg data: %s", err)
+	}
+	fmt.Println(cfg.Section.FieldName)
+	// Output: value
+}
+
+func ExampleReadStringInto_subsections() {
+	cfgStr := `; Comment line
+[profile "A"]
+color = white
+
+[profile "B"]
+color = black
+`
+	cfg := struct {
+		Profile map[string]*struct {
+			Color string
+		}
+	}{}
+	err := gcfg.ReadStringInto(&cfg, cfgStr)
+	if err != nil {
+		log.Fatalf("Failed to parse gcfg data: %s", err)
+	}
+	fmt.Printf("%s %s\n", cfg.Profile["A"].Color, cfg.Profile["B"].Color)
+	// Output: white black
+}
+
+func ExampleReadStringInto_multivalue() {
+	cfgStr := `; Comment line
+[section]
+multi=value1
+multi=value2`
+	cfg := struct {
+		Section struct {
+			Multi []string
+		}
+	}{}
+	err := gcfg.ReadStringInto(&cfg, cfgStr)
+	if err != nil {
+		log.Fatalf("Failed to parse gcfg data: %s", err)
+	}
+	fmt.Println(cfg.Section.Multi)
+	// Output: [value1 value2]
+}
+
+func ExampleReadStringInto_unicode() {
+	cfgStr := `; Comment line
+[甲]
+乙=丙 # comment`
+	cfg := struct {
+		X甲 struct {
+			X乙 string
+		}
+	}{}
+	err := gcfg.ReadStringInto(&cfg, cfgStr)
+	if err != nil {
+		log.Fatalf("Failed to parse gcfg data: %s", err)
+	}
+	fmt.Println(cfg.X甲.X乙)
+	// Output: 丙
+}
diff --git a/vendor/gopkg.in/gcfg.v1/issues_test.go b/vendor/gopkg.in/gcfg.v1/issues_test.go
new file mode 100644
index 0000000..3d3e039
--- /dev/null
+++ b/vendor/gopkg.in/gcfg.v1/issues_test.go
@@ -0,0 +1,110 @@
+package gcfg
+
+import (
+	"fmt"
+	"math/big"
+	"strings"
+	"testing"
+)
+
+type Config1 struct {
+	Section struct {
+		Int    int
+		BigInt big.Int
+	}
+}
+
+var testsGoogleCodeIssue1 = []struct {
+	cfg      string
+	typename string
+}{
+	{"[section]\nint=X", "int"},
+	{"[section]\nint=", "int"},
+	{"[section]\nint=1A", "int"},
+	{"[section]\nbigint=X", "big.Int"},
+	{"[section]\nbigint=", "big.Int"},
+	{"[section]\nbigint=1A", "big.Int"},
+}
+
+// Value parse error should:
+//  - include plain type name
+//  - not include reflect internals
+func TestGoogleCodeIssue1(t *testing.T) {
+	for i, tt := range testsGoogleCodeIssue1 {
+		var c Config1
+		err := ReadStringInto(&c, tt.cfg)
+		switch {
+		case err == nil:
+			t.Errorf("%d fail: got ok; wanted error", i)
+		case !strings.Contains(err.Error(), tt.typename):
+			t.Errorf("%d fail: error message doesn't contain type name %q: %v",
+				i, tt.typename, err)
+		case strings.Contains(err.Error(), "reflect"):
+			t.Errorf("%d fail: error message includes reflect internals: %v",
+				i, err)
+		default:
+			t.Logf("%d pass: %v", i, err)
+		}
+	}
+}
+
+type confGoogleCodeIssue2 struct{ Main struct{ Foo string } }
+
+var testsGoogleCodeIssue2 = []readtest{
+	{"[main]\n;\nfoo = bar\n", &confGoogleCodeIssue2{struct{ Foo string }{"bar"}}, true},
+	{"[main]\r\n;\r\nfoo = bar\r\n", &confGoogleCodeIssue2{struct{ Foo string }{"bar"}}, true},
+}
+
+func TestGoogleCodeIssue2(t *testing.T) {
+	for i, tt := range testsGoogleCodeIssue2 {
+		id := fmt.Sprintf("issue2:%d", i)
+		testRead(t, id, tt)
+	}
+}
+
+type ConfigIssue11 struct {
+	Sect struct {
+		Var bool
+	}
+}
+
+var testsIssue11 = []struct {
+	cfg string
+	loc string
+}{
+	{"[Sect]\nVar=X", "Sect"},
+	{"[Sect]\nVar=X", "Var"},
+}
+
+// Value parse error should include location
+func TestIssue11(t *testing.T) {
+	for i, tt := range testsIssue11 {
+		var c ConfigIssue11
+		err := ReadStringInto(&c, tt.cfg)
+		switch {
+		case err == nil:
+			t.Errorf("%d fail: got ok; wanted error", i)
+		case !strings.Contains(err.Error(), tt.loc):
+			t.Errorf("%d fail: error message doesn't contain location %q: %v",
+				i, tt.loc, err)
+		default:
+			t.Logf("%d pass: %v", i, err)
+		}
+	}
+}
+
+// Escaped double quote should be supported in "raw" string literals
+func TestIssue12(t *testing.T) {
+	var c struct {
+		Section struct {
+			Name string
+		}
+	}
+	err := ReadFileInto(&c, "testdata/issue12.gcfg")
+	if err != nil {
+		t.Fatalf("fail: want ok, got error %v", err)
+	}
+	if c.Section.Name != `"value"` {
+		t.Errorf("fail: want `\"value\"`, got %q", c.Section.Name)
+	}
+}
diff --git a/vendor/gopkg.in/gcfg.v1/read.go b/vendor/gopkg.in/gcfg.v1/read.go
new file mode 100644
index 0000000..0679665
--- /dev/null
+++ b/vendor/gopkg.in/gcfg.v1/read.go
@@ -0,0 +1,257 @@
+package gcfg
+
+import (
+	"bytes"
+	"fmt"
+	"io"
+	"io/ioutil"
+	"os"
+	"strings"
+
+	"gopkg.in/gcfg.v1/scanner"
+	"gopkg.in/gcfg.v1/token"
+	"gopkg.in/warnings.v0"
+)
+
+var unescape = map[rune]rune{'\\': '\\', '"': '"', 'n': '\n', 't': '\t'}
+var utf8Bom = []byte("\ufeff")
+
+// no error: invalid literals should be caught by scanner
+func unquote(s string) string {
+	u, q, esc := make([]rune, 0, len(s)), false, false
+	for _, c := range s {
+		if esc {
+			uc, ok := unescape[c]
+			switch {
+			case ok:
+				u = append(u, uc)
+				fallthrough
+			case !q && c == '\n':
+				esc = false
+				continue
+			}
+			panic("invalid escape sequence")
+		}
+		switch c {
+		case '"':
+			q = !q
+		case '\\':
+			esc = true
+		default:
+			u = append(u, c)
+		}
+	}
+	if q {
+		panic("missing end quote")
+	}
+	if esc {
+		panic("invalid escape sequence")
+	}
+	return string(u)
+}
+
+func readIntoPass(c *warnings.Collector, config interface{}, fset *token.FileSet,
+	file *token.File, src []byte, subsectPass bool) error {
+	//
+	var s scanner.Scanner
+	var errs scanner.ErrorList
+	s.Init(file, src, func(p token.Position, m string) { errs.Add(p, m) }, 0)
+	sect, sectsub := "", ""
+	pos, tok, lit := s.Scan()
+	errfn := func(msg string) error {
+		return fmt.Errorf("%s: %s", fset.Position(pos), msg)
+	}
+	for {
+		if errs.Len() > 0 {
+			if err := c.Collect(errs.Err()); err != nil {
+				return err
+			}
+		}
+		switch tok {
+		case token.EOF:
+			return nil
+		case token.EOL, token.COMMENT:
+			pos, tok, lit = s.Scan()
+		case token.LBRACK:
+			pos, tok, lit = s.Scan()
+			if errs.Len() > 0 {
+				if err := c.Collect(errs.Err()); err != nil {
+					return err
+				}
+			}
+			if tok != token.IDENT {
+				if err := c.Collect(errfn("expected section name")); err != nil {
+					return err
+				}
+			}
+			sect, sectsub = lit, ""
+			pos, tok, lit = s.Scan()
+			if errs.Len() > 0 {
+				if err := c.Collect(errs.Err()); err != nil {
+					return err
+				}
+			}
+			if tok == token.STRING {
+				sectsub = unquote(lit)
+				if sectsub == "" {
+					if err := c.Collect(errfn("empty subsection name")); err != nil {
+						return err
+					}
+				}
+				pos, tok, lit = s.Scan()
+				if errs.Len() > 0 {
+					if err := c.Collect(errs.Err()); err != nil {
+						return err
+					}
+				}
+			}
+			if tok != token.RBRACK {
+				if sectsub == "" {
+					if err := c.Collect(errfn("expected subsection name or right bracket")); err != nil {
+						return err
+					}
+				}
+				if err := c.Collect(errfn("expected right bracket")); err != nil {
+					return err
+				}
+			}
+			pos, tok, lit = s.Scan()
+			if tok != token.EOL && tok != token.EOF && tok != token.COMMENT {
+				if err := c.Collect(errfn("expected EOL, EOF, or comment")); err != nil {
+					return err
+				}
+			}
+			// If a section/subsection header was found, ensure a
+			// container object is created, even if there are no
+			// variables further down.
+			err := c.Collect(set(c, config, sect, sectsub, "", true, "", subsectPass))
+			if err != nil {
+				return err
+			}
+		case token.IDENT:
+			if sect == "" {
+				if err := c.Collect(errfn("expected section header")); err != nil {
+					return err
+				}
+			}
+			n := lit
+			pos, tok, lit = s.Scan()
+			if errs.Len() > 0 {
+				return errs.Err()
+			}
+			blank, v := tok == token.EOF || tok == token.EOL || tok == token.COMMENT, ""
+			if !blank {
+				if tok != token.ASSIGN {
+					if err := c.Collect(errfn("expected '='")); err != nil {
+						return err
+					}
+				}
+				pos, tok, lit = s.Scan()
+				if errs.Len() > 0 {
+					if err := c.Collect(errs.Err()); err != nil {
+						return err
+					}
+				}
+				if tok != token.STRING {
+					if err := c.Collect(errfn("expected value")); err != nil {
+						return err
+					}
+				}
+				v = unquote(lit)
+				pos, tok, lit = s.Scan()
+				if errs.Len() > 0 {
+					if err := c.Collect(errs.Err()); err != nil {
+						return err
+					}
+				}
+				if tok != token.EOL && tok != token.EOF && tok != token.COMMENT {
+					if err := c.Collect(errfn("expected EOL, EOF, or comment")); err != nil {
+						return err
+					}
+				}
+			}
+			err := set(c, config, sect, sectsub, n, blank, v, subsectPass)
+			if err != nil {
+				return err
+			}
+		default:
+			if sect == "" {
+				if err := c.Collect(errfn("expected section header")); err != nil {
+					return err
+				}
+			}
+			if err := c.Collect(errfn("expected section header or variable declaration")); err != nil {
+				return err
+			}
+		}
+	}
+}
+
+func readInto(config interface{}, fset *token.FileSet, file *token.File,
+	src []byte) error {
+	//
+	c := warnings.NewCollector(isFatal)
+	err := readIntoPass(c, config, fset, file, src, false)
+	if err != nil {
+		return err
+	}
+	err = readIntoPass(c, config, fset, file, src, true)
+	if err != nil {
+		return err
+	}
+	return c.Done()
+}
+
+// ReadInto reads gcfg formatted data from reader and sets the values into the
+// corresponding fields in config.
+func ReadInto(config interface{}, reader io.Reader) error {
+	src, err := ioutil.ReadAll(reader)
+	if err != nil {
+		return err
+	}
+	fset := token.NewFileSet()
+	file := fset.AddFile("", fset.Base(), len(src))
+	return readInto(config, fset, file, src)
+}
+
+// ReadStringInto reads gcfg formatted data from str and sets the values into
+// the corresponding fields in config.
+func ReadStringInto(config interface{}, str string) error {
+	r := strings.NewReader(str)
+	return ReadInto(config, r)
+}
+
+// ReadFileInto reads gcfg formatted data from the file filename and sets the
+// values into the corresponding fields in config.
+//
+// For compatibility with files created on Windows, the ReadFileInto skips a
+// single leading UTF8 BOM sequence if it exists.
+func ReadFileInto(config interface{}, filename string) error {
+	f, err := os.Open(filename)
+	if err != nil {
+		return err
+	}
+	defer f.Close()
+	src, err := ioutil.ReadAll(f)
+	if err != nil {
+		return err
+	}
+
+	// Skips a single leading UTF8 BOM sequence if it exists.
+	src = skipLeadingUtf8Bom(src)
+
+	fset := token.NewFileSet()
+	file := fset.AddFile(filename, fset.Base(), len(src))
+	return readInto(config, fset, file, src)
+}
+
+func skipLeadingUtf8Bom(src []byte) []byte {
+	lengthUtf8Bom := len(utf8Bom)
+
+	if len(src) >= lengthUtf8Bom {
+		if bytes.Equal(src[:lengthUtf8Bom], utf8Bom) {
+			return src[lengthUtf8Bom:]
+		}
+	}
+	return src
+}
diff --git a/vendor/gopkg.in/gcfg.v1/read_test.go b/vendor/gopkg.in/gcfg.v1/read_test.go
new file mode 100644
index 0000000..6d3eecc
--- /dev/null
+++ b/vendor/gopkg.in/gcfg.v1/read_test.go
@@ -0,0 +1,443 @@
+package gcfg
+
+import (
+	"bytes"
+	"encoding"
+	"fmt"
+	"math/big"
+	"os"
+	"reflect"
+	"testing"
+)
+
+const (
+	// 64 spaces
+	sp64 = "                                                                "
+	// 512 spaces
+	sp512 = sp64 + sp64 + sp64 + sp64 + sp64 + sp64 + sp64 + sp64
+	// 4096 spaces
+	sp4096 = sp512 + sp512 + sp512 + sp512 + sp512 + sp512 + sp512 + sp512
+)
+
+type cBasic struct {
+	Section           cBasicS1
+	Hyphen_In_Section cBasicS2
+	unexported        cBasicS1
+	Exported          cBasicS3
+	TagName           cBasicS1 `gcfg:"tag-name"`
+}
+type cBasicS1 struct {
+	Name  string
+	Int   int
+	PName *string
+}
+type cBasicS2 struct {
+	Hyphen_In_Name string
+}
+type cBasicS3 struct {
+	unexported string
+}
+
+type nonMulti []string
+
+type unmarshalable string
+
+func (u *unmarshalable) UnmarshalText(text []byte) error {
+	s := string(text)
+	if s == "error" {
+		return fmt.Errorf("%s", s)
+	}
+	*u = unmarshalable(s)
+	return nil
+}
+
+var _ encoding.TextUnmarshaler = new(unmarshalable)
+
+type cUni struct {
+	X甲       cUniS1
+	XSection cUniS2
+}
+type cUniS1 struct {
+	X乙 string
+}
+type cUniS2 struct {
+	XName string
+}
+
+type cMulti struct {
+	M1 cMultiS1
+	M2 cMultiS2
+	M3 cMultiS3
+}
+type cMultiS1 struct{ Multi []string }
+type cMultiS2 struct{ NonMulti nonMulti }
+type cMultiS3 struct{ PMulti *[]string }
+
+type cSubs struct{ Sub map[string]*cSubsS1 }
+type cSubsS1 struct{ Name string }
+
+type cBool struct{ Section cBoolS1 }
+type cBoolS1 struct{ Bool bool }
+
+type cTxUnm struct{ Section cTxUnmS1 }
+type cTxUnmS1 struct{ Name unmarshalable }
+
+type cNum struct {
+	N1 cNumS1
+	N2 cNumS2
+	N3 cNumS3
+}
+type cNumS1 struct {
+	Int    int
+	IntDHO int `gcfg:",int=dho"`
+	Big    *big.Int
+}
+type cNumS2 struct {
+	MultiInt []int
+	MultiBig []*big.Int
+}
+type cNumS3 struct{ FileMode os.FileMode }
+type readtest struct {
+	gcfg string
+	exp  interface{}
+	ok   bool
+}
+
+func newString(s string) *string           { return &s }
+func newStringSlice(s ...string) *[]string { return &s }
+
+var readtests = []struct {
+	group string
+	tests []readtest
+}{{"scanning", []readtest{
+	{"[section]\nname=value", &cBasic{Section: cBasicS1{Name: "value"}}, true},
+	// hyphen in name
+	{"[hyphen-in-section]\nhyphen-in-name=value", &cBasic{Hyphen_In_Section: cBasicS2{Hyphen_In_Name: "value"}}, true},
+	// quoted string value
+	{"[section]\nname=\"\"", &cBasic{Section: cBasicS1{Name: ""}}, true},
+	{"[section]\nname=\" \"", &cBasic{Section: cBasicS1{Name: " "}}, true},
+	{"[section]\nname=\"value\"", &cBasic{Section: cBasicS1{Name: "value"}}, true},
+	{"[section]\nname=\" value \"", &cBasic{Section: cBasicS1{Name: " value "}}, true},
+	{"\n[section]\nname=\"va ; lue\"", &cBasic{Section: cBasicS1{Name: "va ; lue"}}, true},
+	{"[section]\nname=\"val\" \"ue\"", &cBasic{Section: cBasicS1{Name: "val ue"}}, true},
+	{"[section]\nname=\"value", &cBasic{}, false},
+	// escape sequences
+	{"[section]\nname=\"va\\\\lue\"", &cBasic{Section: cBasicS1{Name: "va\\lue"}}, true},
+	{"[section]\nname=\"va\\\"lue\"", &cBasic{Section: cBasicS1{Name: "va\"lue"}}, true},
+	{"[section]\nname=\"va\\nlue\"", &cBasic{Section: cBasicS1{Name: "va\nlue"}}, true},
+	{"[section]\nname=\"va\\tlue\"", &cBasic{Section: cBasicS1{Name: "va\tlue"}}, true},
+	{"[section]\nname=\\\"value\\\"", &cBasic{Section: cBasicS1{Name: `"value"`}}, true},
+	{"\n[section]\nname=\\", &cBasic{}, false},
+	{"\n[section]\nname=\\a", &cBasic{}, false},
+	{"\n[section]\nname=\"val\\a\"", &cBasic{}, false},
+	{"\n[section]\nname=val\\", &cBasic{}, false},
+	{"\n[sub \"A\\\n\"]\nname=value", &cSubs{}, false},
+	{"\n[sub \"A\\\t\"]\nname=value", &cSubs{}, false},
+	// broken line
+	{"[section]\nname=value \\\n value", &cBasic{Section: cBasicS1{Name: "value  value"}}, true},
+	{"[section]\nname=\"value \\\n value\"", &cBasic{}, false},
+}}, {"scanning:whitespace", []readtest{
+	{" \n[section]\nname=value", &cBasic{Section: cBasicS1{Name: "value"}}, true},
+	{" [section]\nname=value", &cBasic{Section: cBasicS1{Name: "value"}}, true},
+	{"\t[section]\nname=value", &cBasic{Section: cBasicS1{Name: "value"}}, true},
+	{"[ section]\nname=value", &cBasic{Section: cBasicS1{Name: "value"}}, true},
+	{"[section ]\nname=value", &cBasic{Section: cBasicS1{Name: "value"}}, true},
+	{"[section]\n name=value", &cBasic{Section: cBasicS1{Name: "value"}}, true},
+	{"[section]\nname =value", &cBasic{Section: cBasicS1{Name: "value"}}, true},
+	{"[section]\nname= value", &cBasic{Section: cBasicS1{Name: "value"}}, true},
+	{"[section]\nname=value ", &cBasic{Section: cBasicS1{Name: "value"}}, true},
+	{"[section]\r\nname=value", &cBasic{Section: cBasicS1{Name: "value"}}, true},
+	{"[section]\r\nname=value\r\n", &cBasic{Section: cBasicS1{Name: "value"}}, true},
+	{";cmnt\r\n[section]\r\nname=value\r\n", &cBasic{Section: cBasicS1{Name: "value"}}, true},
+	// long lines
+	{sp4096 + "[section]\nname=value\n", &cBasic{Section: cBasicS1{Name: "value"}}, true},
+	{"[" + sp4096 + "section]\nname=value\n", &cBasic{Section: cBasicS1{Name: "value"}}, true},
+	{"[section" + sp4096 + "]\nname=value\n", &cBasic{Section: cBasicS1{Name: "value"}}, true},
+	{"[section]" + sp4096 + "\nname=value\n", &cBasic{Section: cBasicS1{Name: "value"}}, true},
+	{"[section]\n" + sp4096 + "name=value\n", &cBasic{Section: cBasicS1{Name: "value"}}, true},
+	{"[section]\nname" + sp4096 + "=value\n", &cBasic{Section: cBasicS1{Name: "value"}}, true},
+	{"[section]\nname=" + sp4096 + "value\n", &cBasic{Section: cBasicS1{Name: "value"}}, true},
+	{"[section]\nname=value\n" + sp4096, &cBasic{Section: cBasicS1{Name: "value"}}, true},
+}}, {"scanning:comments", []readtest{
+	{"; cmnt\n[section]\nname=value", &cBasic{Section: cBasicS1{Name: "value"}}, true},
+	{"# cmnt\n[section]\nname=value", &cBasic{Section: cBasicS1{Name: "value"}}, true},
+	{" ; cmnt\n[section]\nname=value", &cBasic{Section: cBasicS1{Name: "value"}}, true},
+	{"\t; cmnt\n[section]\nname=value", &cBasic{Section: cBasicS1{Name: "value"}}, true},
+	{"\n[section]; cmnt\nname=value", &cBasic{Section: cBasicS1{Name: "value"}}, true},
+	{"\n[section] ; cmnt\nname=value", &cBasic{Section: cBasicS1{Name: "value"}}, true},
+	{"\n[section]\nname=value; cmnt", &cBasic{Section: cBasicS1{Name: "value"}}, true},
+	{"\n[section]\nname=value ; cmnt", &cBasic{Section: cBasicS1{Name: "value"}}, true},
+	{"\n[section]\nname=\"value\" ; cmnt", &cBasic{Section: cBasicS1{Name: "value"}}, true},
+	{"\n[section]\nname=value ; \"cmnt", &cBasic{Section: cBasicS1{Name: "value"}}, true},
+	{"\n[section]\nname=\"va ; lue\" ; cmnt", &cBasic{Section: cBasicS1{Name: "va ; lue"}}, true},
+	{"\n[section]\nname=; cmnt", &cBasic{Section: cBasicS1{Name: ""}}, true},
+}}, {"scanning:subsections", []readtest{
+	{"\n[sub \"A\"]\nname=value", &cSubs{map[string]*cSubsS1{"A": {"value"}}}, true},
+	{"\n[sub \"b\"]\nname=value", &cSubs{map[string]*cSubsS1{"b": {"value"}}}, true},
+	{"\n[sub \"A\\\\\"]\nname=value", &cSubs{map[string]*cSubsS1{"A\\": {"value"}}}, true},
+	{"\n[sub \"A\\\"\"]\nname=value", &cSubs{map[string]*cSubsS1{"A\"": {"value"}}}, true},
+}}, {"syntax", []readtest{
+	// invalid line
+	{"\n[section]\n=", &cBasic{}, false},
+	// no section
+	{"name=value", &cBasic{}, false},
+	// empty section
+	{"\n[]\nname=value", &cBasic{}, false},
+	// empty subsection
+	{"\n[sub \"\"]\nname=value", &cSubs{}, false},
+}}, {"setting", []readtest{
+	{"[section]\nname=value", &cBasic{Section: cBasicS1{Name: "value"}}, true},
+	// pointer
+	{"[section]", &cBasic{Section: cBasicS1{PName: nil}}, true},
+	{"[section]\npname=value", &cBasic{Section: cBasicS1{PName: newString("value")}}, true},
+	{"[m3]", &cMulti{M3: cMultiS3{PMulti: nil}}, true},
+	{"[m3]\npmulti", &cMulti{M3: cMultiS3{PMulti: newStringSlice()}}, true},
+	{"[m3]\npmulti=value", &cMulti{M3: cMultiS3{PMulti: newStringSlice("value")}}, true},
+	{"[m3]\npmulti=value1\npmulti=value2", &cMulti{M3: cMultiS3{PMulti: newStringSlice("value1", "value2")}}, true},
+	// section name not matched
+	{"\n[nonexistent]\nname=value", &cBasic{}, false},
+	// subsection name not matched
+	{"\n[section \"nonexistent\"]\nname=value", &cBasic{}, false},
+	// variable name not matched
+	{"\n[section]\nnonexistent=value", &cBasic{}, false},
+	// hyphen in name
+	{"[hyphen-in-section]\nhyphen-in-name=value", &cBasic{Hyphen_In_Section: cBasicS2{Hyphen_In_Name: "value"}}, true},
+	// ignore unexported fields
+	{"[unexported]\nname=value", &cBasic{}, false},
+	{"[exported]\nunexported=value", &cBasic{}, false},
+	// 'X' prefix for non-upper/lower-case letters
+	{"[甲]\n乙=丙", &cUni{X甲: cUniS1{X乙: "丙"}}, true},
+	//{"[section]\nxname=value", &cBasic{XSection: cBasicS4{XName: "value"}}, false},
+	//{"[xsection]\nname=value", &cBasic{XSection: cBasicS4{XName: "value"}}, false},
+	// name specified as struct tag
+	{"[tag-name]\nname=value", &cBasic{TagName: cBasicS1{Name: "value"}}, true},
+	// empty subsections
+	{"\n[sub \"A\"]\n[sub \"B\"]", &cSubs{map[string]*cSubsS1{"A": {}, "B": {}}}, true},
+}}, {"multivalue", []readtest{
+	// unnamed slice type: treat as multi-value
+	{"\n[m1]", &cMulti{M1: cMultiS1{}}, true},
+	{"\n[m1]\nmulti=value", &cMulti{M1: cMultiS1{[]string{"value"}}}, true},
+	{"\n[m1]\nmulti=value1\nmulti=value2", &cMulti{M1: cMultiS1{[]string{"value1", "value2"}}}, true},
+	// "blank" empties multi-valued slice -- here same result as above
+	{"\n[m1]\nmulti\nmulti=value1\nmulti=value2", &cMulti{M1: cMultiS1{[]string{"value1", "value2"}}}, true},
+	// named slice type: do not treat as multi-value
+	{"\n[m2]", &cMulti{}, true},
+	{"\n[m2]\nmulti=value", &cMulti{}, false},
+	{"\n[m2]\nmulti=value1\nmulti=value2", &cMulti{}, false},
+}}, {"type:string", []readtest{
+	{"[section]\nname=value", &cBasic{Section: cBasicS1{Name: "value"}}, true},
+	{"[section]\nname=", &cBasic{Section: cBasicS1{Name: ""}}, true},
+}}, {"type:bool", []readtest{
+	// explicit values
+	{"[section]\nbool=true", &cBool{cBoolS1{true}}, true},
+	{"[section]\nbool=yes", &cBool{cBoolS1{true}}, true},
+	{"[section]\nbool=on", &cBool{cBoolS1{true}}, true},
+	{"[section]\nbool=1", &cBool{cBoolS1{true}}, true},
+	{"[section]\nbool=tRuE", &cBool{cBoolS1{true}}, true},
+	{"[section]\nbool=false", &cBool{cBoolS1{false}}, true},
+	{"[section]\nbool=no", &cBool{cBoolS1{false}}, true},
+	{"[section]\nbool=off", &cBool{cBoolS1{false}}, true},
+	{"[section]\nbool=0", &cBool{cBoolS1{false}}, true},
+	{"[section]\nbool=NO", &cBool{cBoolS1{false}}, true},
+	// "blank" value handled as true
+	{"[section]\nbool", &cBool{cBoolS1{true}}, true},
+	// bool parse errors
+	{"[section]\nbool=maybe", &cBool{}, false},
+	{"[section]\nbool=t", &cBool{}, false},
+	{"[section]\nbool=truer", &cBool{}, false},
+	{"[section]\nbool=2", &cBool{}, false},
+	{"[section]\nbool=-1", &cBool{}, false},
+}}, {"type:numeric", []readtest{
+	{"[section]\nint=0", &cBasic{Section: cBasicS1{Int: 0}}, true},
+	{"[section]\nint=1", &cBasic{Section: cBasicS1{Int: 1}}, true},
+	{"[section]\nint=-1", &cBasic{Section: cBasicS1{Int: -1}}, true},
+	{"[section]\nint=0.2", &cBasic{}, false},
+	{"[section]\nint=1e3", &cBasic{}, false},
+	// primitive [u]int(|8|16|32|64) and big.Int is parsed as dec or hex (not octal)
+	{"[n1]\nint=010", &cNum{N1: cNumS1{Int: 10}}, true},
+	{"[n1]\nint=0x10", &cNum{N1: cNumS1{Int: 0x10}}, true},
+	{"[n1]\nbig=1", &cNum{N1: cNumS1{Big: big.NewInt(1)}}, true},
+	{"[n1]\nbig=0x10", &cNum{N1: cNumS1{Big: big.NewInt(0x10)}}, true},
+	{"[n1]\nbig=010", &cNum{N1: cNumS1{Big: big.NewInt(10)}}, true},
+	{"[n2]\nmultiint=010", &cNum{N2: cNumS2{MultiInt: []int{10}}}, true},
+	{"[n2]\nmultibig=010", &cNum{N2: cNumS2{MultiBig: []*big.Int{big.NewInt(10)}}}, true},
+	// set parse mode for int types via struct tag
+	{"[n1]\nintdho=010", &cNum{N1: cNumS1{IntDHO: 010}}, true},
+	// octal allowed for named type
+	{"[n3]\nfilemode=0777", &cNum{N3: cNumS3{FileMode: 0777}}, true},
+}}, {"type:textUnmarshaler", []readtest{
+	{"[section]\nname=value", &cTxUnm{Section: cTxUnmS1{Name: "value"}}, true},
+	{"[section]\nname=error", &cTxUnm{}, false},
+}},
+}
+
+func TestReadStringInto(t *testing.T) {
+	for _, tg := range readtests {
+		for i, tt := range tg.tests {
+			id := fmt.Sprintf("%s:%d", tg.group, i)
+			testRead(t, id, tt)
+		}
+	}
+}
+
+func TestReadStringIntoMultiBlankPreset(t *testing.T) {
+	tt := readtest{"\n[m1]\nmulti\nmulti=value1\nmulti=value2", &cMulti{M1: cMultiS1{[]string{"value1", "value2"}}}, true}
+	cfg := &cMulti{M1: cMultiS1{[]string{"preset1", "preset2"}}}
+	testReadInto(t, "multi:blank", tt, cfg)
+}
+
+func testRead(t *testing.T, id string, tt readtest) {
+	// get the type of the expected result
+	restyp := reflect.TypeOf(tt.exp).Elem()
+	// create a new instance to hold the actual result
+	res := reflect.New(restyp).Interface()
+	testReadInto(t, id, tt, res)
+}
+
+func testReadInto(t *testing.T, id string, tt readtest, res interface{}) {
+	err := ReadStringInto(res, tt.gcfg)
+	if tt.ok {
+		if err != nil {
+			t.Errorf("%s fail: got error %v, wanted ok", id, err)
+			return
+		} else if !reflect.DeepEqual(res, tt.exp) {
+			t.Errorf("%s fail: got value %#v, wanted value %#v", id, res, tt.exp)
+			return
+		}
+		if !testing.Short() {
+			t.Logf("%s pass: got value %#v", id, res)
+		}
+	} else { // !tt.ok
+		if err == nil {
+			t.Errorf("%s fail: got value %#v, wanted error", id, res)
+			return
+		}
+		if !testing.Short() {
+			t.Logf("%s pass: got error %v", id, err)
+		}
+	}
+}
+
+func TestReadFileInto(t *testing.T) {
+	res := &struct{ Section struct{ Name string } }{}
+	err := ReadFileInto(res, "testdata/gcfg_test.gcfg")
+	if err != nil {
+		t.Error(err)
+	}
+	if "value" != res.Section.Name {
+		t.Errorf("got %q, wanted %q", res.Section.Name, "value")
+	}
+}
+
+func TestReadFileIntoUnicode(t *testing.T) {
+	res := &struct{ X甲 struct{ X乙 string } }{}
+	err := ReadFileInto(res, "testdata/gcfg_unicode_test.gcfg")
+	if err != nil {
+		t.Error(err)
+	}
+	if "丙" != res.X甲.X乙 {
+		t.Errorf("got %q, wanted %q", res.X甲.X乙, "丙")
+	}
+}
+
+func TestReadFileIntoNotepad(t *testing.T) {
+	res := &struct{ X甲 struct{ X乙 string } }{}
+	err := ReadFileInto(res, "testdata/notepad.ini")
+	if err != nil {
+		t.Error(err)
+	}
+	if "丁" != res.X甲.X乙 {
+		t.Errorf("got %q, wanted %q", res.X甲.X乙, "丁")
+	}
+}
+
+func TestReadStringIntoSubsectDefaults(t *testing.T) {
+	type subsect struct {
+		Color       string
+		Orientation string
+	}
+	res := &struct {
+		Default_Profile subsect
+		Profile         map[string]*subsect
+	}{Default_Profile: subsect{Color: "green"}}
+	cfg := `
+	[profile "one"]
+	orientation = left`
+	err := ReadStringInto(res, cfg)
+	if err != nil {
+		t.Error(err)
+	}
+	if res.Profile["one"].Color != "green" {
+		t.Errorf("got %q; want %q", res.Profile["one"].Color, "green")
+	}
+}
+
+func TestReadStringIntoExtraData(t *testing.T) {
+	res := &struct {
+		Section struct {
+			Name string
+		}
+	}{}
+	cfg := `
+	[section]
+	name = value
+	name2 = value2`
+	err := FatalOnly(ReadStringInto(res, cfg))
+	if err != nil {
+		t.Error(err)
+	}
+	if res.Section.Name != "value" {
+		t.Errorf("res.Section.Name=%q; want %q", res.Section.Name, "value")
+	}
+}
+
+var panictests = []struct {
+	id     string
+	config interface{}
+	gcfg   string
+}{
+	{"top", struct{}{}, "[section]\nname=value"},
+	{"section", &struct{ Section string }{}, "[section]\nname=value"},
+	{"subsection", &struct{ Section map[string]string }{}, "[section \"subsection\"]\nname=value"},
+}
+
+func testPanic(t *testing.T, id string, config interface{}, gcfg string) {
+	defer func() {
+		if r := recover(); r != nil {
+			t.Logf("%s pass: got panic %v", id, r)
+		}
+	}()
+	ReadStringInto(config, gcfg)
+	t.Errorf("%s fail: want panic", id)
+}
+
+func TestPanics(t *testing.T) {
+	for _, tt := range panictests {
+		testPanic(t, tt.id, tt.config, tt.gcfg)
+	}
+}
+
+var utf8bomtests = []struct {
+	id  string
+	in  []byte
+	out []byte
+}{
+	{"0 bytes input", []byte{}, []byte{}},
+	{"3 bytes input (BOM only)", []byte("\ufeff"), []byte{}},
+	{"3 bytes input (comment only, without BOM)", []byte(";c\n"), []byte(";c\n")},
+	{"normal input with BOM", []byte("\ufeff[section]\nname=value"), []byte("[section]\nname=value")},
+	{"normal input without BOM", []byte("[section]\nname=value"), []byte("[section]\nname=value")},
+}
+
+func testUtf8Bom(t *testing.T, id string, in, out []byte) {
+	got := skipLeadingUtf8Bom([]byte(in))
+	if !bytes.Equal(got, out) {
+		t.Errorf("%s.", id)
+	}
+}
+
+func TestUtf8Boms(t *testing.T) {
+	for _, tt := range utf8bomtests {
+		testUtf8Bom(t, tt.id, tt.in, tt.out)
+	}
+}
diff --git a/vendor/gopkg.in/gcfg.v1/scanner/errors.go b/vendor/gopkg.in/gcfg.v1/scanner/errors.go
new file mode 100644
index 0000000..1a3c0f6
--- /dev/null
+++ b/vendor/gopkg.in/gcfg.v1/scanner/errors.go
@@ -0,0 +1,121 @@
+// Copyright 2009 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package scanner
+
+import (
+	"fmt"
+	"io"
+	"sort"
+)
+
+import (
+	"gopkg.in/gcfg.v1/token"
+)
+
+// In an ErrorList, an error is represented by an *Error.
+// The position Pos, if valid, points to the beginning of
+// the offending token, and the error condition is described
+// by Msg.
+//
+type Error struct {
+	Pos token.Position
+	Msg string
+}
+
+// Error implements the error interface.
+func (e Error) Error() string {
+	if e.Pos.Filename != "" || e.Pos.IsValid() {
+		// don't print "<unknown position>"
+		// TODO(gri) reconsider the semantics of Position.IsValid
+		return e.Pos.String() + ": " + e.Msg
+	}
+	return e.Msg
+}
+
+// ErrorList is a list of *Errors.
+// The zero value for an ErrorList is an empty ErrorList ready to use.
+//
+type ErrorList []*Error
+
+// Add adds an Error with given position and error message to an ErrorList.
+func (p *ErrorList) Add(pos token.Position, msg string) {
+	*p = append(*p, &Error{pos, msg})
+}
+
+// Reset resets an ErrorList to no errors.
+func (p *ErrorList) Reset() { *p = (*p)[0:0] }
+
+// ErrorList implements the sort Interface.
+func (p ErrorList) Len() int      { return len(p) }
+func (p ErrorList) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
+
+func (p ErrorList) Less(i, j int) bool {
+	e := &p[i].Pos
+	f := &p[j].Pos
+	if e.Filename < f.Filename {
+		return true
+	}
+	if e.Filename == f.Filename {
+		return e.Offset < f.Offset
+	}
+	return false
+}
+
+// Sort sorts an ErrorList. *Error entries are sorted by position,
+// other errors are sorted by error message, and before any *Error
+// entry.
+//
+func (p ErrorList) Sort() {
+	sort.Sort(p)
+}
+
+// RemoveMultiples sorts an ErrorList and removes all but the first error per line.
+func (p *ErrorList) RemoveMultiples() {
+	sort.Sort(p)
+	var last token.Position // initial last.Line is != any legal error line
+	i := 0
+	for _, e := range *p {
+		if e.Pos.Filename != last.Filename || e.Pos.Line != last.Line {
+			last = e.Pos
+			(*p)[i] = e
+			i++
+		}
+	}
+	(*p) = (*p)[0:i]
+}
+
+// An ErrorList implements the error interface.
+func (p ErrorList) Error() string {
+	switch len(p) {
+	case 0:
+		return "no errors"
+	case 1:
+		return p[0].Error()
+	}
+	return fmt.Sprintf("%s (and %d more errors)", p[0], len(p)-1)
+}
+
+// Err returns an error equivalent to this error list.
+// If the list is empty, Err returns nil.
+func (p ErrorList) Err() error {
+	if len(p) == 0 {
+		return nil
+	}
+	return p
+}
+
+// PrintError is a utility function that prints a list of errors to w,
+// one error per line, if the err parameter is an ErrorList. Otherwise
+// it prints the err string.
+//
+func PrintError(w io.Writer, err error) {
+	if list, ok := err.(ErrorList); ok {
+		for _, e := range list {
+			fmt.Fprintf(w, "%s\n", e)
+		}
+	} else if err != nil {
+		fmt.Fprintf(w, "%s\n", err)
+	}
+}
diff --git a/vendor/gopkg.in/gcfg.v1/scanner/example_test.go b/vendor/gopkg.in/gcfg.v1/scanner/example_test.go
new file mode 100644
index 0000000..ce08e9c
--- /dev/null
+++ b/vendor/gopkg.in/gcfg.v1/scanner/example_test.go
@@ -0,0 +1,46 @@
+// Copyright 2012 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package scanner_test
+
+import (
+	"fmt"
+)
+
+import (
+	"gopkg.in/gcfg.v1/scanner"
+	"gopkg.in/gcfg.v1/token"
+)
+
+func ExampleScanner_Scan() {
+	// src is the input that we want to tokenize.
+	src := []byte(`[profile "A"]
+color = blue ; Comment`)
+
+	// Initialize the scanner.
+	var s scanner.Scanner
+	fset := token.NewFileSet()                      // positions are relative to fset
+	file := fset.AddFile("", fset.Base(), len(src)) // register input "file"
+	s.Init(file, src, nil /* no error handler */, scanner.ScanComments)
+
+	// Repeated calls to Scan yield the token sequence found in the input.
+	for {
+		pos, tok, lit := s.Scan()
+		if tok == token.EOF {
+			break
+		}
+		fmt.Printf("%s\t%q\t%q\n", fset.Position(pos), tok, lit)
+	}
+
+	// output:
+	// 1:1	"["	""
+	// 1:2	"IDENT"	"profile"
+	// 1:10	"STRING"	"\"A\""
+	// 1:13	"]"	""
+	// 1:14	"\n"	""
+	// 2:1	"IDENT"	"color"
+	// 2:7	"="	""
+	// 2:9	"STRING"	"blue"
+	// 2:14	"COMMENT"	"; Comment"
+}
diff --git a/vendor/gopkg.in/gcfg.v1/scanner/scanner.go b/vendor/gopkg.in/gcfg.v1/scanner/scanner.go
new file mode 100644
index 0000000..6d0eee9
--- /dev/null
+++ b/vendor/gopkg.in/gcfg.v1/scanner/scanner.go
@@ -0,0 +1,342 @@
+// Copyright 2009 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package scanner implements a scanner for gcfg configuration text.
+// It takes a []byte as source which can then be tokenized
+// through repeated calls to the Scan method.
+//
+// Note that the API for the scanner package may change to accommodate new
+// features or implementation changes in gcfg.
+//
+package scanner
+
+import (
+	"fmt"
+	"path/filepath"
+	"unicode"
+	"unicode/utf8"
+)
+
+import (
+	"gopkg.in/gcfg.v1/token"
+)
+
+// An ErrorHandler may be provided to Scanner.Init. If a syntax error is
+// encountered and a handler was installed, the handler is called with a
+// position and an error message. The position points to the beginning of
+// the offending token.
+//
+type ErrorHandler func(pos token.Position, msg string)
+
+// A Scanner holds the scanner's internal state while processing
+// a given text.  It can be allocated as part of another data
+// structure but must be initialized via Init before use.
+//
+type Scanner struct {
+	// immutable state
+	file *token.File  // source file handle
+	dir  string       // directory portion of file.Name()
+	src  []byte       // source
+	err  ErrorHandler // error reporting; or nil
+	mode Mode         // scanning mode
+
+	// scanning state
+	ch         rune // current character
+	offset     int  // character offset
+	rdOffset   int  // reading offset (position after current character)
+	lineOffset int  // current line offset
+	nextVal    bool // next token is expected to be a value
+
+	// public state - ok to modify
+	ErrorCount int // number of errors encountered
+}
+
+// Read the next Unicode char into s.ch.
+// s.ch < 0 means end-of-file.
+//
+func (s *Scanner) next() {
+	if s.rdOffset < len(s.src) {
+		s.offset = s.rdOffset
+		if s.ch == '\n' {
+			s.lineOffset = s.offset
+			s.file.AddLine(s.offset)
+		}
+		r, w := rune(s.src[s.rdOffset]), 1
+		switch {
+		case r == 0:
+			s.error(s.offset, "illegal character NUL")
+		case r >= 0x80:
+			// not ASCII
+			r, w = utf8.DecodeRune(s.src[s.rdOffset:])
+			if r == utf8.RuneError && w == 1 {
+				s.error(s.offset, "illegal UTF-8 encoding")
+			}
+		}
+		s.rdOffset += w
+		s.ch = r
+	} else {
+		s.offset = len(s.src)
+		if s.ch == '\n' {
+			s.lineOffset = s.offset
+			s.file.AddLine(s.offset)
+		}
+		s.ch = -1 // eof
+	}
+}
+
+// A mode value is a set of flags (or 0).
+// They control scanner behavior.
+//
+type Mode uint
+
+const (
+	ScanComments Mode = 1 << iota // return comments as COMMENT tokens
+)
+
+// Init prepares the scanner s to tokenize the text src by setting the
+// scanner at the beginning of src. The scanner uses the file set file
+// for position information and it adds line information for each line.
+// It is ok to re-use the same file when re-scanning the same file as
+// line information which is already present is ignored. Init causes a
+// panic if the file size does not match the src size.
+//
+// Calls to Scan will invoke the error handler err if they encounter a
+// syntax error and err is not nil. Also, for each error encountered,
+// the Scanner field ErrorCount is incremented by one. The mode parameter
+// determines how comments are handled.
+//
+// Note that Init may call err if there is an error in the first character
+// of the file.
+//
+func (s *Scanner) Init(file *token.File, src []byte, err ErrorHandler, mode Mode) {
+	// Explicitly initialize all fields since a scanner may be reused.
+	if file.Size() != len(src) {
+		panic(fmt.Sprintf("file size (%d) does not match src len (%d)", file.Size(), len(src)))
+	}
+	s.file = file
+	s.dir, _ = filepath.Split(file.Name())
+	s.src = src
+	s.err = err
+	s.mode = mode
+
+	s.ch = ' '
+	s.offset = 0
+	s.rdOffset = 0
+	s.lineOffset = 0
+	s.ErrorCount = 0
+	s.nextVal = false
+
+	s.next()
+}
+
+func (s *Scanner) error(offs int, msg string) {
+	if s.err != nil {
+		s.err(s.file.Position(s.file.Pos(offs)), msg)
+	}
+	s.ErrorCount++
+}
+
+func (s *Scanner) scanComment() string {
+	// initial [;#] already consumed
+	offs := s.offset - 1 // position of initial [;#]
+
+	for s.ch != '\n' && s.ch >= 0 {
+		s.next()
+	}
+	return string(s.src[offs:s.offset])
+}
+
+func isLetter(ch rune) bool {
+	return 'a' <= ch && ch <= 'z' || 'A' <= ch && ch <= 'Z' || ch >= 0x80 && unicode.IsLetter(ch)
+}
+
+func isDigit(ch rune) bool {
+	return '0' <= ch && ch <= '9' || ch >= 0x80 && unicode.IsDigit(ch)
+}
+
+func (s *Scanner) scanIdentifier() string {
+	offs := s.offset
+	for isLetter(s.ch) || isDigit(s.ch) || s.ch == '-' {
+		s.next()
+	}
+	return string(s.src[offs:s.offset])
+}
+
+func (s *Scanner) scanEscape(val bool) {
+	offs := s.offset
+	ch := s.ch
+	s.next() // always make progress
+	switch ch {
+	case '\\', '"':
+		// ok
+	case 'n', 't':
+		if val {
+			break // ok
+		}
+		fallthrough
+	default:
+		s.error(offs, "unknown escape sequence")
+	}
+}
+
+func (s *Scanner) scanString() string {
+	// '"' opening already consumed
+	offs := s.offset - 1
+
+	for s.ch != '"' {
+		ch := s.ch
+		s.next()
+		if ch == '\n' || ch < 0 {
+			s.error(offs, "string not terminated")
+			break
+		}
+		if ch == '\\' {
+			s.scanEscape(false)
+		}
+	}
+
+	s.next()
+
+	return string(s.src[offs:s.offset])
+}
+
+func stripCR(b []byte) []byte {
+	c := make([]byte, len(b))
+	i := 0
+	for _, ch := range b {
+		if ch != '\r' {
+			c[i] = ch
+			i++
+		}
+	}
+	return c[:i]
+}
+
+func (s *Scanner) scanValString() string {
+	offs := s.offset
+
+	hasCR := false
+	end := offs
+	inQuote := false
+loop:
+	for inQuote || s.ch >= 0 && s.ch != '\n' && s.ch != ';' && s.ch != '#' {
+		ch := s.ch
+		s.next()
+		switch {
+		case inQuote && ch == '\\':
+			s.scanEscape(true)
+		case !inQuote && ch == '\\':
+			if s.ch == '\r' {
+				hasCR = true
+				s.next()
+			}
+			if s.ch != '\n' && s.ch != '"' {
+				s.error(offs, "unquoted '\\' must be followed by new line or double quote")
+				break loop
+			}
+			s.next()
+		case ch == '"':
+			inQuote = !inQuote
+		case ch == '\r':
+			hasCR = true
+		case ch < 0 || inQuote && ch == '\n':
+			s.error(offs, "string not terminated")
+			break loop
+		}
+		if inQuote || !isWhiteSpace(ch) {
+			end = s.offset
+		}
+	}
+
+	lit := s.src[offs:end]
+	if hasCR {
+		lit = stripCR(lit)
+	}
+
+	return string(lit)
+}
+
+func isWhiteSpace(ch rune) bool {
+	return ch == ' ' || ch == '\t' || ch == '\r'
+}
+
+func (s *Scanner) skipWhitespace() {
+	for isWhiteSpace(s.ch) {
+		s.next()
+	}
+}
+
+// Scan scans the next token and returns the token position, the token,
+// and its literal string if applicable. The source end is indicated by
+// token.EOF.
+//
+// If the returned token is a literal (token.IDENT, token.STRING) or
+// token.COMMENT, the literal string has the corresponding value.
+//
+// If the returned token is token.ILLEGAL, the literal string is the
+// offending character.
+//
+// In all other cases, Scan returns an empty literal string.
+//
+// For more tolerant parsing, Scan will return a valid token if
+// possible even if a syntax error was encountered. Thus, even
+// if the resulting token sequence contains no illegal tokens,
+// a client may not assume that no error occurred. Instead it
+// must check the scanner's ErrorCount or the number of calls
+// of the error handler, if there was one installed.
+//
+// Scan adds line information to the file added to the file
+// set with Init. Token positions are relative to that file
+// and thus relative to the file set.
+//
+func (s *Scanner) Scan() (pos token.Pos, tok token.Token, lit string) {
+scanAgain:
+	s.skipWhitespace()
+
+	// current token start
+	pos = s.file.Pos(s.offset)
+
+	// determine token value
+	switch ch := s.ch; {
+	case s.nextVal:
+		lit = s.scanValString()
+		tok = token.STRING
+		s.nextVal = false
+	case isLetter(ch):
+		lit = s.scanIdentifier()
+		tok = token.IDENT
+	default:
+		s.next() // always make progress
+		switch ch {
+		case -1:
+			tok = token.EOF
+		case '\n':
+			tok = token.EOL
+		case '"':
+			tok = token.STRING
+			lit = s.scanString()
+		case '[':
+			tok = token.LBRACK
+		case ']':
+			tok = token.RBRACK
+		case ';', '#':
+			// comment
+			lit = s.scanComment()
+			if s.mode&ScanComments == 0 {
+				// skip comment
+				goto scanAgain
+			}
+			tok = token.COMMENT
+		case '=':
+			tok = token.ASSIGN
+			s.nextVal = true
+		default:
+			s.error(s.file.Offset(pos), fmt.Sprintf("illegal character %#U", ch))
+			tok = token.ILLEGAL
+			lit = string(ch)
+		}
+	}
+
+	return
+}
diff --git a/vendor/gopkg.in/gcfg.v1/scanner/scanner_test.go b/vendor/gopkg.in/gcfg.v1/scanner/scanner_test.go
new file mode 100644
index 0000000..53501f3
--- /dev/null
+++ b/vendor/gopkg.in/gcfg.v1/scanner/scanner_test.go
@@ -0,0 +1,418 @@
+// Copyright 2009 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package scanner
+
+import (
+	"os"
+	"strings"
+	"testing"
+)
+
+import (
+	"gopkg.in/gcfg.v1/token"
+)
+
+var fset = token.NewFileSet()
+
+const /* class */ (
+	special = iota
+	literal
+	operator
+)
+
+func tokenclass(tok token.Token) int {
+	switch {
+	case tok.IsLiteral():
+		return literal
+	case tok.IsOperator():
+		return operator
+	}
+	return special
+}
+
+type elt struct {
+	tok   token.Token
+	lit   string
+	class int
+	pre   string
+	suf   string
+}
+
+var tokens = [...]elt{
+	// Special tokens
+	{token.COMMENT, "; a comment", special, "", "\n"},
+	{token.COMMENT, "# a comment", special, "", "\n"},
+
+	// Operators and delimiters
+	{token.ASSIGN, "=", operator, "", "value"},
+	{token.LBRACK, "[", operator, "", ""},
+	{token.RBRACK, "]", operator, "", ""},
+	{token.EOL, "\n", operator, "", ""},
+
+	// Identifiers
+	{token.IDENT, "foobar", literal, "", ""},
+	{token.IDENT, "a۰۱۸", literal, "", ""},
+	{token.IDENT, "foo६४", literal, "", ""},
+	{token.IDENT, "bar9876", literal, "", ""},
+	{token.IDENT, "foo-bar", literal, "", ""},
+	{token.IDENT, "foo", literal, ";\n", ""},
+	// String literals (subsection names)
+	{token.STRING, `"foobar"`, literal, "", ""},
+	{token.STRING, `"\""`, literal, "", ""},
+	// String literals (values)
+	{token.STRING, `"\n"`, literal, "=", ""},
+	{token.STRING, `"foobar"`, literal, "=", ""},
+	{token.STRING, `"foo\nbar"`, literal, "=", ""},
+	{token.STRING, `"foo\"bar"`, literal, "=", ""},
+	{token.STRING, `"foo\\bar"`, literal, "=", ""},
+	{token.STRING, `"foobar"`, literal, "=", ""},
+	{token.STRING, `"foobar"`, literal, "= ", ""},
+	{token.STRING, `"foobar"`, literal, "=", "\n"},
+	{token.STRING, `"foobar"`, literal, "=", ";"},
+	{token.STRING, `"foobar"`, literal, "=", " ;"},
+	{token.STRING, `"foobar"`, literal, "=", "#"},
+	{token.STRING, `"foobar"`, literal, "=", " #"},
+	{token.STRING, "foobar", literal, "=", ""},
+	{token.STRING, "foobar", literal, "= ", ""},
+	{token.STRING, "foobar", literal, "=", " "},
+	{token.STRING, `"foo" "bar"`, literal, "=", " "},
+	{token.STRING, "foo\\\nbar", literal, "=", ""},
+	{token.STRING, "foo\\\r\nbar", literal, "=", ""},
+	{token.STRING, `\"foobar\"`, literal, "=", ""},
+}
+
+const whitespace = "  \t  \n\n\n" // to separate tokens
+
+var source = func() []byte {
+	var src []byte
+	for _, t := range tokens {
+		src = append(src, t.pre...)
+		src = append(src, t.lit...)
+		src = append(src, t.suf...)
+		src = append(src, whitespace...)
+	}
+	return src
+}()
+
+func newlineCount(s string) int {
+	n := 0
+	for i := 0; i < len(s); i++ {
+		if s[i] == '\n' {
+			n++
+		}
+	}
+	return n
+}
+
+func checkPos(t *testing.T, lit string, p token.Pos, expected token.Position) {
+	pos := fset.Position(p)
+	if pos.Filename != expected.Filename {
+		t.Errorf("bad filename for %q: got %s, expected %s", lit, pos.Filename, expected.Filename)
+	}
+	if pos.Offset != expected.Offset {
+		t.Errorf("bad position for %q: got %d, expected %d", lit, pos.Offset, expected.Offset)
+	}
+	if pos.Line != expected.Line {
+		t.Errorf("bad line for %q: got %d, expected %d", lit, pos.Line, expected.Line)
+	}
+	if pos.Column != expected.Column {
+		t.Errorf("bad column for %q: got %d, expected %d", lit, pos.Column, expected.Column)
+	}
+}
+
+// Verify that calling Scan() provides the correct results.
+func TestScan(t *testing.T) {
+	// make source
+	src_linecount := newlineCount(string(source))
+	whitespace_linecount := newlineCount(whitespace)
+
+	index := 0
+
+	// error handler
+	eh := func(_ token.Position, msg string) {
+		t.Errorf("%d: error handler called (msg = %s)", index, msg)
+	}
+
+	// verify scan
+	var s Scanner
+	s.Init(fset.AddFile("", fset.Base(), len(source)), source, eh, ScanComments)
+	// epos is the expected position
+	epos := token.Position{
+		Filename: "",
+		Offset:   0,
+		Line:     1,
+		Column:   1,
+	}
+	for {
+		pos, tok, lit := s.Scan()
+		if lit == "" {
+			// no literal value for non-literal tokens
+			lit = tok.String()
+		}
+		e := elt{token.EOF, "", special, "", ""}
+		if index < len(tokens) {
+			e = tokens[index]
+		}
+		if tok == token.EOF {
+			lit = "<EOF>"
+			epos.Line = src_linecount
+			epos.Column = 2
+		}
+		if e.pre != "" && strings.ContainsRune("=;#", rune(e.pre[0])) {
+			epos.Column = 1
+			checkPos(t, lit, pos, epos)
+			var etok token.Token
+			if e.pre[0] == '=' {
+				etok = token.ASSIGN
+			} else {
+				etok = token.COMMENT
+			}
+			if tok != etok {
+				t.Errorf("bad token for %q: got %q, expected %q", lit, tok, etok)
+			}
+			pos, tok, lit = s.Scan()
+		}
+		epos.Offset += len(e.pre)
+		if tok != token.EOF {
+			epos.Column = 1 + len(e.pre)
+		}
+		if e.pre != "" && e.pre[len(e.pre)-1] == '\n' {
+			epos.Offset--
+			epos.Column--
+			checkPos(t, lit, pos, epos)
+			if tok != token.EOL {
+				t.Errorf("bad token for %q: got %q, expected %q", lit, tok, token.EOL)
+			}
+			epos.Line++
+			epos.Offset++
+			epos.Column = 1
+			pos, tok, lit = s.Scan()
+		}
+		checkPos(t, lit, pos, epos)
+		if tok != e.tok {
+			t.Errorf("bad token for %q: got %q, expected %q", lit, tok, e.tok)
+		}
+		if e.tok.IsLiteral() {
+			// no CRs in value string literals
+			elit := e.lit
+			if strings.ContainsRune(e.pre, '=') {
+				elit = string(stripCR([]byte(elit)))
+				epos.Offset += len(e.lit) - len(lit) // correct position
+			}
+			if lit != elit {
+				t.Errorf("bad literal for %q: got %q, expected %q", lit, lit, elit)
+			}
+		}
+		if tokenclass(tok) != e.class {
+			t.Errorf("bad class for %q: got %d, expected %d", lit, tokenclass(tok), e.class)
+		}
+		epos.Offset += len(lit) + len(e.suf) + len(whitespace)
+		epos.Line += newlineCount(lit) + newlineCount(e.suf) + whitespace_linecount
+		index++
+		if tok == token.EOF {
+			break
+		}
+		if e.suf == "value" {
+			pos, tok, lit = s.Scan()
+			if tok != token.STRING {
+				t.Errorf("bad token for %q: got %q, expected %q", lit, tok, token.STRING)
+			}
+		} else if strings.ContainsRune(e.suf, ';') || strings.ContainsRune(e.suf, '#') {
+			pos, tok, lit = s.Scan()
+			if tok != token.COMMENT {
+				t.Errorf("bad token for %q: got %q, expected %q", lit, tok, token.COMMENT)
+			}
+		}
+		// skip EOLs
+		for i := 0; i < whitespace_linecount+newlineCount(e.suf); i++ {
+			pos, tok, lit = s.Scan()
+			if tok != token.EOL {
+				t.Errorf("bad token for %q: got %q, expected %q", lit, tok, token.EOL)
+			}
+		}
+	}
+	if s.ErrorCount != 0 {
+		t.Errorf("found %d errors", s.ErrorCount)
+	}
+}
+
+func TestScanValStringEOF(t *testing.T) {
+	var s Scanner
+	src := "= value"
+	f := fset.AddFile("src", fset.Base(), len(src))
+	s.Init(f, []byte(src), nil, 0)
+	s.Scan()              // =
+	s.Scan()              // value
+	_, tok, _ := s.Scan() // EOF
+	if tok != token.EOF {
+		t.Errorf("bad token: got %s, expected %s", tok, token.EOF)
+	}
+	if s.ErrorCount > 0 {
+		t.Error("scanning error")
+	}
+}
+
+// Verify that initializing the same scanner more then once works correctly.
+func TestInit(t *testing.T) {
+	var s Scanner
+
+	// 1st init
+	src1 := "\nname = value"
+	f1 := fset.AddFile("src1", fset.Base(), len(src1))
+	s.Init(f1, []byte(src1), nil, 0)
+	if f1.Size() != len(src1) {
+		t.Errorf("bad file size: got %d, expected %d", f1.Size(), len(src1))
+	}
+	s.Scan()              // \n
+	s.Scan()              // name
+	_, tok, _ := s.Scan() // =
+	if tok != token.ASSIGN {
+		t.Errorf("bad token: got %s, expected %s", tok, token.ASSIGN)
+	}
+
+	// 2nd init
+	src2 := "[section]"
+	f2 := fset.AddFile("src2", fset.Base(), len(src2))
+	s.Init(f2, []byte(src2), nil, 0)
+	if f2.Size() != len(src2) {
+		t.Errorf("bad file size: got %d, expected %d", f2.Size(), len(src2))
+	}
+	_, tok, _ = s.Scan() // [
+	if tok != token.LBRACK {
+		t.Errorf("bad token: got %s, expected %s", tok, token.LBRACK)
+	}
+
+	if s.ErrorCount != 0 {
+		t.Errorf("found %d errors", s.ErrorCount)
+	}
+}
+
+func TestStdErrorHandler(t *testing.T) {
+	const src = "@\n" + // illegal character, cause an error
+		"@ @\n" // two errors on the same line
+
+	var list ErrorList
+	eh := func(pos token.Position, msg string) { list.Add(pos, msg) }
+
+	var s Scanner
+	s.Init(fset.AddFile("File1", fset.Base(), len(src)), []byte(src), eh, 0)
+	for {
+		if _, tok, _ := s.Scan(); tok == token.EOF {
+			break
+		}
+	}
+
+	if len(list) != s.ErrorCount {
+		t.Errorf("found %d errors, expected %d", len(list), s.ErrorCount)
+	}
+
+	if len(list) != 3 {
+		t.Errorf("found %d raw errors, expected 3", len(list))
+		PrintError(os.Stderr, list)
+	}
+
+	list.Sort()
+	if len(list) != 3 {
+		t.Errorf("found %d sorted errors, expected 3", len(list))
+		PrintError(os.Stderr, list)
+	}
+
+	list.RemoveMultiples()
+	if len(list) != 2 {
+		t.Errorf("found %d one-per-line errors, expected 2", len(list))
+		PrintError(os.Stderr, list)
+	}
+}
+
+type errorCollector struct {
+	cnt int            // number of errors encountered
+	msg string         // last error message encountered
+	pos token.Position // last error position encountered
+}
+
+func checkError(t *testing.T, src string, tok token.Token, pos int, err string) {
+	var s Scanner
+	var h errorCollector
+	eh := func(pos token.Position, msg string) {
+		h.cnt++
+		h.msg = msg
+		h.pos = pos
+	}
+	s.Init(fset.AddFile("", fset.Base(), len(src)), []byte(src), eh, ScanComments)
+	if src[0] == '=' {
+		_, _, _ = s.Scan()
+	}
+	_, tok0, _ := s.Scan()
+	_, tok1, _ := s.Scan()
+	if tok0 != tok {
+		t.Errorf("%q: got %s, expected %s", src, tok0, tok)
+	}
+	if tok1 != token.EOF {
+		t.Errorf("%q: got %s, expected EOF", src, tok1)
+	}
+	cnt := 0
+	if err != "" {
+		cnt = 1
+	}
+	if h.cnt != cnt {
+		t.Errorf("%q: got cnt %d, expected %d", src, h.cnt, cnt)
+	}
+	if h.msg != err {
+		t.Errorf("%q: got msg %q, expected %q", src, h.msg, err)
+	}
+	if h.pos.Offset != pos {
+		t.Errorf("%q: got offset %d, expected %d", src, h.pos.Offset, pos)
+	}
+}
+
+var errors = []struct {
+	src string
+	tok token.Token
+	pos int
+	err string
+}{
+	{"\a", token.ILLEGAL, 0, "illegal character U+0007"},
+	{"/", token.ILLEGAL, 0, "illegal character U+002F '/'"},
+	{"_", token.ILLEGAL, 0, "illegal character U+005F '_'"},
+	{`…`, token.ILLEGAL, 0, "illegal character U+2026 '…'"},
+	{`""`, token.STRING, 0, ""},
+	{`"`, token.STRING, 0, "string not terminated"},
+	{"\"\n", token.STRING, 0, "string not terminated"},
+	{`="`, token.STRING, 1, "string not terminated"},
+	{"=\"\n", token.STRING, 1, "string not terminated"},
+	{"=\\", token.STRING, 1, "unquoted '\\' must be followed by new line or double quote"},
+	{"=\\\r", token.STRING, 1, "unquoted '\\' must be followed by new line or double quote"},
+	{`"\z"`, token.STRING, 2, "unknown escape sequence"},
+	{`"\a"`, token.STRING, 2, "unknown escape sequence"},
+	{`"\b"`, token.STRING, 2, "unknown escape sequence"},
+	{`"\f"`, token.STRING, 2, "unknown escape sequence"},
+	{`"\r"`, token.STRING, 2, "unknown escape sequence"},
+	{`"\t"`, token.STRING, 2, "unknown escape sequence"},
+	{`"\v"`, token.STRING, 2, "unknown escape sequence"},
+	{`"\0"`, token.STRING, 2, "unknown escape sequence"},
+}
+
+func TestScanErrors(t *testing.T) {
+	for _, e := range errors {
+		checkError(t, e.src, e.tok, e.pos, e.err)
+	}
+}
+
+func BenchmarkScan(b *testing.B) {
+	b.StopTimer()
+	fset := token.NewFileSet()
+	file := fset.AddFile("", fset.Base(), len(source))
+	var s Scanner
+	b.StartTimer()
+	for i := b.N - 1; i >= 0; i-- {
+		s.Init(file, source, nil, ScanComments)
+		for {
+			_, tok, _ := s.Scan()
+			if tok == token.EOF {
+				break
+			}
+		}
+	}
+}
diff --git a/vendor/gopkg.in/gcfg.v1/set.go b/vendor/gopkg.in/gcfg.v1/set.go
new file mode 100644
index 0000000..73aee50
--- /dev/null
+++ b/vendor/gopkg.in/gcfg.v1/set.go
@@ -0,0 +1,329 @@
+package gcfg
+
+import (
+	"bytes"
+	"encoding"
+	"encoding/gob"
+	"fmt"
+	"math/big"
+	"reflect"
+	"strings"
+	"unicode"
+	"unicode/utf8"
+
+	"gopkg.in/gcfg.v1/types"
+	"gopkg.in/warnings.v0"
+)
+
+type tag struct {
+	ident   string
+	intMode string
+}
+
+func newTag(ts string) tag {
+	t := tag{}
+	s := strings.Split(ts, ",")
+	t.ident = s[0]
+	for _, tse := range s[1:] {
+		if strings.HasPrefix(tse, "int=") {
+			t.intMode = tse[len("int="):]
+		}
+	}
+	return t
+}
+
+func fieldFold(v reflect.Value, name string) (reflect.Value, tag) {
+	var n string
+	r0, _ := utf8.DecodeRuneInString(name)
+	if unicode.IsLetter(r0) && !unicode.IsLower(r0) && !unicode.IsUpper(r0) {
+		n = "X"
+	}
+	n += strings.Replace(name, "-", "_", -1)
+	f, ok := v.Type().FieldByNameFunc(func(fieldName string) bool {
+		if !v.FieldByName(fieldName).CanSet() {
+			return false
+		}
+		f, _ := v.Type().FieldByName(fieldName)
+		t := newTag(f.Tag.Get("gcfg"))
+		if t.ident != "" {
+			return strings.EqualFold(t.ident, name)
+		}
+		return strings.EqualFold(n, fieldName)
+	})
+	if !ok {
+		return reflect.Value{}, tag{}
+	}
+	return v.FieldByName(f.Name), newTag(f.Tag.Get("gcfg"))
+}
+
+type setter func(destp interface{}, blank bool, val string, t tag) error
+
+var errUnsupportedType = fmt.Errorf("unsupported type")
+var errBlankUnsupported = fmt.Errorf("blank value not supported for type")
+
+var setters = []setter{
+	typeSetter, textUnmarshalerSetter, kindSetter, scanSetter,
+}
+
+func textUnmarshalerSetter(d interface{}, blank bool, val string, t tag) error {
+	dtu, ok := d.(encoding.TextUnmarshaler)
+	if !ok {
+		return errUnsupportedType
+	}
+	if blank {
+		return errBlankUnsupported
+	}
+	return dtu.UnmarshalText([]byte(val))
+}
+
+func boolSetter(d interface{}, blank bool, val string, t tag) error {
+	if blank {
+		reflect.ValueOf(d).Elem().Set(reflect.ValueOf(true))
+		return nil
+	}
+	b, err := types.ParseBool(val)
+	if err == nil {
+		reflect.ValueOf(d).Elem().Set(reflect.ValueOf(b))
+	}
+	return err
+}
+
+func intMode(mode string) types.IntMode {
+	var m types.IntMode
+	if strings.ContainsAny(mode, "dD") {
+		m |= types.Dec
+	}
+	if strings.ContainsAny(mode, "hH") {
+		m |= types.Hex
+	}
+	if strings.ContainsAny(mode, "oO") {
+		m |= types.Oct
+	}
+	return m
+}
+
+var typeModes = map[reflect.Type]types.IntMode{
+	reflect.TypeOf(int(0)):    types.Dec | types.Hex,
+	reflect.TypeOf(int8(0)):   types.Dec | types.Hex,
+	reflect.TypeOf(int16(0)):  types.Dec | types.Hex,
+	reflect.TypeOf(int32(0)):  types.Dec | types.Hex,
+	reflect.TypeOf(int64(0)):  types.Dec | types.Hex,
+	reflect.TypeOf(uint(0)):   types.Dec | types.Hex,
+	reflect.TypeOf(uint8(0)):  types.Dec | types.Hex,
+	reflect.TypeOf(uint16(0)): types.Dec | types.Hex,
+	reflect.TypeOf(uint32(0)): types.Dec | types.Hex,
+	reflect.TypeOf(uint64(0)): types.Dec | types.Hex,
+	// use default mode (allow dec/hex/oct) for uintptr type
+	reflect.TypeOf(big.Int{}): types.Dec | types.Hex,
+}
+
+func intModeDefault(t reflect.Type) types.IntMode {
+	m, ok := typeModes[t]
+	if !ok {
+		m = types.Dec | types.Hex | types.Oct
+	}
+	return m
+}
+
+func intSetter(d interface{}, blank bool, val string, t tag) error {
+	if blank {
+		return errBlankUnsupported
+	}
+	mode := intMode(t.intMode)
+	if mode == 0 {
+		mode = intModeDefault(reflect.TypeOf(d).Elem())
+	}
+	return types.ParseInt(d, val, mode)
+}
+
+func stringSetter(d interface{}, blank bool, val string, t tag) error {
+	if blank {
+		return errBlankUnsupported
+	}
+	dsp, ok := d.(*string)
+	if !ok {
+		return errUnsupportedType
+	}
+	*dsp = val
+	return nil
+}
+
+var kindSetters = map[reflect.Kind]setter{
+	reflect.String:  stringSetter,
+	reflect.Bool:    boolSetter,
+	reflect.Int:     intSetter,
+	reflect.Int8:    intSetter,
+	reflect.Int16:   intSetter,
+	reflect.Int32:   intSetter,
+	reflect.Int64:   intSetter,
+	reflect.Uint:    intSetter,
+	reflect.Uint8:   intSetter,
+	reflect.Uint16:  intSetter,
+	reflect.Uint32:  intSetter,
+	reflect.Uint64:  intSetter,
+	reflect.Uintptr: intSetter,
+}
+
+var typeSetters = map[reflect.Type]setter{
+	reflect.TypeOf(big.Int{}): intSetter,
+}
+
+func typeSetter(d interface{}, blank bool, val string, tt tag) error {
+	t := reflect.ValueOf(d).Type().Elem()
+	setter, ok := typeSetters[t]
+	if !ok {
+		return errUnsupportedType
+	}
+	return setter(d, blank, val, tt)
+}
+
+func kindSetter(d interface{}, blank bool, val string, tt tag) error {
+	k := reflect.ValueOf(d).Type().Elem().Kind()
+	setter, ok := kindSetters[k]
+	if !ok {
+		return errUnsupportedType
+	}
+	return setter(d, blank, val, tt)
+}
+
+func scanSetter(d interface{}, blank bool, val string, tt tag) error {
+	if blank {
+		return errBlankUnsupported
+	}
+	return types.ScanFully(d, val, 'v')
+}
+
+func newValue(c *warnings.Collector, sect string, vCfg reflect.Value,
+	vType reflect.Type) (reflect.Value, error) {
+	//
+	pv := reflect.New(vType)
+	dfltName := "default-" + sect
+	dfltField, _ := fieldFold(vCfg, dfltName)
+	var err error
+	if dfltField.IsValid() {
+		b := bytes.NewBuffer(nil)
+		ge := gob.NewEncoder(b)
+		if err = c.Collect(ge.EncodeValue(dfltField)); err != nil {
+			return pv, err
+		}
+		gd := gob.NewDecoder(bytes.NewReader(b.Bytes()))
+		if err = c.Collect(gd.DecodeValue(pv.Elem())); err != nil {
+			return pv, err
+		}
+	}
+	return pv, nil
+}
+
+func set(c *warnings.Collector, cfg interface{}, sect, sub, name string,
+	blank bool, value string, subsectPass bool) error {
+	//
+	vPCfg := reflect.ValueOf(cfg)
+	if vPCfg.Kind() != reflect.Ptr || vPCfg.Elem().Kind() != reflect.Struct {
+		panic(fmt.Errorf("config must be a pointer to a struct"))
+	}
+	vCfg := vPCfg.Elem()
+	vSect, _ := fieldFold(vCfg, sect)
+	l := loc{section: sect}
+	if !vSect.IsValid() {
+		err := extraData{loc: l}
+		return c.Collect(err)
+	}
+	isSubsect := vSect.Kind() == reflect.Map
+	if subsectPass != isSubsect {
+		return nil
+	}
+	if isSubsect {
+		l.subsection = &sub
+		vst := vSect.Type()
+		if vst.Key().Kind() != reflect.String ||
+			vst.Elem().Kind() != reflect.Ptr ||
+			vst.Elem().Elem().Kind() != reflect.Struct {
+			panic(fmt.Errorf("map field for section must have string keys and "+
+				" pointer-to-struct values: section %q", sect))
+		}
+		if vSect.IsNil() {
+			vSect.Set(reflect.MakeMap(vst))
+		}
+		k := reflect.ValueOf(sub)
+		pv := vSect.MapIndex(k)
+		if !pv.IsValid() {
+			vType := vSect.Type().Elem().Elem()
+			var err error
+			if pv, err = newValue(c, sect, vCfg, vType); err != nil {
+				return err
+			}
+			vSect.SetMapIndex(k, pv)
+		}
+		vSect = pv.Elem()
+	} else if vSect.Kind() != reflect.Struct {
+		panic(fmt.Errorf("field for section must be a map or a struct: "+
+			"section %q", sect))
+	} else if sub != "" {
+		return c.Collect(extraData{loc: l})
+	}
+	// Empty name is a special value, meaning that only the
+	// section/subsection object is to be created, with no values set.
+	if name == "" {
+		return nil
+	}
+	vVar, t := fieldFold(vSect, name)
+	l.variable = &name
+	if !vVar.IsValid() {
+		return c.Collect(extraData{loc: l})
+	}
+	// vVal is either single-valued var, or newly allocated value within multi-valued var
+	var vVal reflect.Value
+	// multi-value if unnamed slice type
+	isMulti := vVar.Type().Name() == "" && vVar.Kind() == reflect.Slice ||
+		vVar.Type().Name() == "" && vVar.Kind() == reflect.Ptr && vVar.Type().Elem().Name() == "" && vVar.Type().Elem().Kind() == reflect.Slice
+	if isMulti && vVar.Kind() == reflect.Ptr {
+		if vVar.IsNil() {
+			vVar.Set(reflect.New(vVar.Type().Elem()))
+		}
+		vVar = vVar.Elem()
+	}
+	if isMulti && blank {
+		vVar.Set(reflect.Zero(vVar.Type()))
+		return nil
+	}
+	if isMulti {
+		vVal = reflect.New(vVar.Type().Elem()).Elem()
+	} else {
+		vVal = vVar
+	}
+	isDeref := vVal.Type().Name() == "" && vVal.Type().Kind() == reflect.Ptr
+	isNew := isDeref && vVal.IsNil()
+	// vAddr is address of value to set (dereferenced & allocated as needed)
+	var vAddr reflect.Value
+	switch {
+	case isNew:
+		vAddr = reflect.New(vVal.Type().Elem())
+	case isDeref && !isNew:
+		vAddr = vVal
+	default:
+		vAddr = vVal.Addr()
+	}
+	vAddrI := vAddr.Interface()
+	err, ok := error(nil), false
+	for _, s := range setters {
+		err = s(vAddrI, blank, value, t)
+		if err == nil {
+			ok = true
+			break
+		}
+		if err != errUnsupportedType {
+			return locErr{msg: err.Error(), loc: l}
+		}
+	}
+	if !ok {
+		// in case all setters returned errUnsupportedType
+		return locErr{msg: err.Error(), loc: l}
+	}
+	if isNew { // set reference if it was dereferenced and newly allocated
+		vVal.Set(vAddr)
+	}
+	if isMulti { // append if multi-valued
+		vVar.Set(reflect.Append(vVar, vVal))
+	}
+	return nil
+}
diff --git a/vendor/gopkg.in/gcfg.v1/testdata/gcfg_test.gcfg b/vendor/gopkg.in/gcfg.v1/testdata/gcfg_test.gcfg
new file mode 100644
index 0000000..cddff29
--- /dev/null
+++ b/vendor/gopkg.in/gcfg.v1/testdata/gcfg_test.gcfg
@@ -0,0 +1,3 @@
+; Comment line
+[section]
+name=value # comment
diff --git a/vendor/gopkg.in/gcfg.v1/testdata/gcfg_unicode_test.gcfg b/vendor/gopkg.in/gcfg.v1/testdata/gcfg_unicode_test.gcfg
new file mode 100644
index 0000000..3762a20
--- /dev/null
+++ b/vendor/gopkg.in/gcfg.v1/testdata/gcfg_unicode_test.gcfg
@@ -0,0 +1,3 @@
+; Comment line
+[甲]
+乙=丙 # comment
diff --git a/vendor/gopkg.in/gcfg.v1/testdata/issue12.gcfg b/vendor/gopkg.in/gcfg.v1/testdata/issue12.gcfg
new file mode 100644
index 0000000..1fe48d9
--- /dev/null
+++ b/vendor/gopkg.in/gcfg.v1/testdata/issue12.gcfg
@@ -0,0 +1,2 @@
+[section]
+	name = \"value\"
diff --git a/vendor/gopkg.in/gcfg.v1/testdata/notepad.ini b/vendor/gopkg.in/gcfg.v1/testdata/notepad.ini
new file mode 100644
index 0000000..08673b8
--- /dev/null
+++ b/vendor/gopkg.in/gcfg.v1/testdata/notepad.ini
@@ -0,0 +1,3 @@
+; Comment line
+[甲]
+乙=丁 # Update 乙 to 丁 by notepad on windows
diff --git a/vendor/gopkg.in/gcfg.v1/token/position.go b/vendor/gopkg.in/gcfg.v1/token/position.go
new file mode 100644
index 0000000..fc45c1e
--- /dev/null
+++ b/vendor/gopkg.in/gcfg.v1/token/position.go
@@ -0,0 +1,435 @@
+// Copyright 2010 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// TODO(gri) consider making this a separate package outside the go directory.
+
+package token
+
+import (
+	"fmt"
+	"sort"
+	"sync"
+)
+
+// -----------------------------------------------------------------------------
+// Positions
+
+// Position describes an arbitrary source position
+// including the file, line, and column location.
+// A Position is valid if the line number is > 0.
+//
+type Position struct {
+	Filename string // filename, if any
+	Offset   int    // offset, starting at 0
+	Line     int    // line number, starting at 1
+	Column   int    // column number, starting at 1 (character count)
+}
+
+// IsValid returns true if the position is valid.
+func (pos *Position) IsValid() bool { return pos.Line > 0 }
+
+// String returns a string in one of several forms:
+//
+//	file:line:column    valid position with file name
+//	line:column         valid position without file name
+//	file                invalid position with file name
+//	-                   invalid position without file name
+//
+func (pos Position) String() string {
+	s := pos.Filename
+	if pos.IsValid() {
+		if s != "" {
+			s += ":"
+		}
+		s += fmt.Sprintf("%d:%d", pos.Line, pos.Column)
+	}
+	if s == "" {
+		s = "-"
+	}
+	return s
+}
+
+// Pos is a compact encoding of a source position within a file set.
+// It can be converted into a Position for a more convenient, but much
+// larger, representation.
+//
+// The Pos value for a given file is a number in the range [base, base+size],
+// where base and size are specified when adding the file to the file set via
+// AddFile.
+//
+// To create the Pos value for a specific source offset, first add
+// the respective file to the current file set (via FileSet.AddFile)
+// and then call File.Pos(offset) for that file. Given a Pos value p
+// for a specific file set fset, the corresponding Position value is
+// obtained by calling fset.Position(p).
+//
+// Pos values can be compared directly with the usual comparison operators:
+// If two Pos values p and q are in the same file, comparing p and q is
+// equivalent to comparing the respective source file offsets. If p and q
+// are in different files, p < q is true if the file implied by p was added
+// to the respective file set before the file implied by q.
+//
+type Pos int
+
+// The zero value for Pos is NoPos; there is no file and line information
+// associated with it, and NoPos().IsValid() is false. NoPos is always
+// smaller than any other Pos value. The corresponding Position value
+// for NoPos is the zero value for Position.
+//
+const NoPos Pos = 0
+
+// IsValid returns true if the position is valid.
+func (p Pos) IsValid() bool {
+	return p != NoPos
+}
+
+// -----------------------------------------------------------------------------
+// File
+
+// A File is a handle for a file belonging to a FileSet.
+// A File has a name, size, and line offset table.
+//
+type File struct {
+	set  *FileSet
+	name string // file name as provided to AddFile
+	base int    // Pos value range for this file is [base...base+size]
+	size int    // file size as provided to AddFile
+
+	// lines and infos are protected by set.mutex
+	lines []int
+	infos []lineInfo
+}
+
+// Name returns the file name of file f as registered with AddFile.
+func (f *File) Name() string {
+	return f.name
+}
+
+// Base returns the base offset of file f as registered with AddFile.
+func (f *File) Base() int {
+	return f.base
+}
+
+// Size returns the size of file f as registered with AddFile.
+func (f *File) Size() int {
+	return f.size
+}
+
+// LineCount returns the number of lines in file f.
+func (f *File) LineCount() int {
+	f.set.mutex.RLock()
+	n := len(f.lines)
+	f.set.mutex.RUnlock()
+	return n
+}
+
+// AddLine adds the line offset for a new line.
+// The line offset must be larger than the offset for the previous line
+// and smaller than the file size; otherwise the line offset is ignored.
+//
+func (f *File) AddLine(offset int) {
+	f.set.mutex.Lock()
+	if i := len(f.lines); (i == 0 || f.lines[i-1] < offset) && offset < f.size {
+		f.lines = append(f.lines, offset)
+	}
+	f.set.mutex.Unlock()
+}
+
+// SetLines sets the line offsets for a file and returns true if successful.
+// The line offsets are the offsets of the first character of each line;
+// for instance for the content "ab\nc\n" the line offsets are {0, 3}.
+// An empty file has an empty line offset table.
+// Each line offset must be larger than the offset for the previous line
+// and smaller than the file size; otherwise SetLines fails and returns
+// false.
+//
+func (f *File) SetLines(lines []int) bool {
+	// verify validity of lines table
+	size := f.size
+	for i, offset := range lines {
+		if i > 0 && offset <= lines[i-1] || size <= offset {
+			return false
+		}
+	}
+
+	// set lines table
+	f.set.mutex.Lock()
+	f.lines = lines
+	f.set.mutex.Unlock()
+	return true
+}
+
+// SetLinesForContent sets the line offsets for the given file content.
+func (f *File) SetLinesForContent(content []byte) {
+	var lines []int
+	line := 0
+	for offset, b := range content {
+		if line >= 0 {
+			lines = append(lines, line)
+		}
+		line = -1
+		if b == '\n' {
+			line = offset + 1
+		}
+	}
+
+	// set lines table
+	f.set.mutex.Lock()
+	f.lines = lines
+	f.set.mutex.Unlock()
+}
+
+// A lineInfo object describes alternative file and line number
+// information (such as provided via a //line comment in a .go
+// file) for a given file offset.
+type lineInfo struct {
+	// fields are exported to make them accessible to gob
+	Offset   int
+	Filename string
+	Line     int
+}
+
+// AddLineInfo adds alternative file and line number information for
+// a given file offset. The offset must be larger than the offset for
+// the previously added alternative line info and smaller than the
+// file size; otherwise the information is ignored.
+//
+// AddLineInfo is typically used to register alternative position
+// information for //line filename:line comments in source files.
+//
+func (f *File) AddLineInfo(offset int, filename string, line int) {
+	f.set.mutex.Lock()
+	if i := len(f.infos); i == 0 || f.infos[i-1].Offset < offset && offset < f.size {
+		f.infos = append(f.infos, lineInfo{offset, filename, line})
+	}
+	f.set.mutex.Unlock()
+}
+
+// Pos returns the Pos value for the given file offset;
+// the offset must be <= f.Size().
+// f.Pos(f.Offset(p)) == p.
+//
+func (f *File) Pos(offset int) Pos {
+	if offset > f.size {
+		panic("illegal file offset")
+	}
+	return Pos(f.base + offset)
+}
+
+// Offset returns the offset for the given file position p;
+// p must be a valid Pos value in that file.
+// f.Offset(f.Pos(offset)) == offset.
+//
+func (f *File) Offset(p Pos) int {
+	if int(p) < f.base || int(p) > f.base+f.size {
+		panic("illegal Pos value")
+	}
+	return int(p) - f.base
+}
+
+// Line returns the line number for the given file position p;
+// p must be a Pos value in that file or NoPos.
+//
+func (f *File) Line(p Pos) int {
+	// TODO(gri) this can be implemented much more efficiently
+	return f.Position(p).Line
+}
+
+func searchLineInfos(a []lineInfo, x int) int {
+	return sort.Search(len(a), func(i int) bool { return a[i].Offset > x }) - 1
+}
+
+// info returns the file name, line, and column number for a file offset.
+func (f *File) info(offset int) (filename string, line, column int) {
+	filename = f.name
+	if i := searchInts(f.lines, offset); i >= 0 {
+		line, column = i+1, offset-f.lines[i]+1
+	}
+	if len(f.infos) > 0 {
+		// almost no files have extra line infos
+		if i := searchLineInfos(f.infos, offset); i >= 0 {
+			alt := &f.infos[i]
+			filename = alt.Filename
+			if i := searchInts(f.lines, alt.Offset); i >= 0 {
+				line += alt.Line - i - 1
+			}
+		}
+	}
+	return
+}
+
+func (f *File) position(p Pos) (pos Position) {
+	offset := int(p) - f.base
+	pos.Offset = offset
+	pos.Filename, pos.Line, pos.Column = f.info(offset)
+	return
+}
+
+// Position returns the Position value for the given file position p;
+// p must be a Pos value in that file or NoPos.
+//
+func (f *File) Position(p Pos) (pos Position) {
+	if p != NoPos {
+		if int(p) < f.base || int(p) > f.base+f.size {
+			panic("illegal Pos value")
+		}
+		pos = f.position(p)
+	}
+	return
+}
+
+// -----------------------------------------------------------------------------
+// FileSet
+
+// A FileSet represents a set of source files.
+// Methods of file sets are synchronized; multiple goroutines
+// may invoke them concurrently.
+//
+type FileSet struct {
+	mutex sync.RWMutex // protects the file set
+	base  int          // base offset for the next file
+	files []*File      // list of files in the order added to the set
+	last  *File        // cache of last file looked up
+}
+
+// NewFileSet creates a new file set.
+func NewFileSet() *FileSet {
+	s := new(FileSet)
+	s.base = 1 // 0 == NoPos
+	return s
+}
+
+// Base returns the minimum base offset that must be provided to
+// AddFile when adding the next file.
+//
+func (s *FileSet) Base() int {
+	s.mutex.RLock()
+	b := s.base
+	s.mutex.RUnlock()
+	return b
+
+}
+
+// AddFile adds a new file with a given filename, base offset, and file size
+// to the file set s and returns the file. Multiple files may have the same
+// name. The base offset must not be smaller than the FileSet's Base(), and
+// size must not be negative.
+//
+// Adding the file will set the file set's Base() value to base + size + 1
+// as the minimum base value for the next file. The following relationship
+// exists between a Pos value p for a given file offset offs:
+//
+//	int(p) = base + offs
+//
+// with offs in the range [0, size] and thus p in the range [base, base+size].
+// For convenience, File.Pos may be used to create file-specific position
+// values from a file offset.
+//
+func (s *FileSet) AddFile(filename string, base, size int) *File {
+	s.mutex.Lock()
+	defer s.mutex.Unlock()
+	if base < s.base || size < 0 {
+		panic("illegal base or size")
+	}
+	// base >= s.base && size >= 0
+	f := &File{s, filename, base, size, []int{0}, nil}
+	base += size + 1 // +1 because EOF also has a position
+	if base < 0 {
+		panic("token.Pos offset overflow (> 2G of source code in file set)")
+	}
+	// add the file to the file set
+	s.base = base
+	s.files = append(s.files, f)
+	s.last = f
+	return f
+}
+
+// Iterate calls f for the files in the file set in the order they were added
+// until f returns false.
+//
+func (s *FileSet) Iterate(f func(*File) bool) {
+	for i := 0; ; i++ {
+		var file *File
+		s.mutex.RLock()
+		if i < len(s.files) {
+			file = s.files[i]
+		}
+		s.mutex.RUnlock()
+		if file == nil || !f(file) {
+			break
+		}
+	}
+}
+
+func searchFiles(a []*File, x int) int {
+	return sort.Search(len(a), func(i int) bool { return a[i].base > x }) - 1
+}
+
+func (s *FileSet) file(p Pos) *File {
+	// common case: p is in last file
+	if f := s.last; f != nil && f.base <= int(p) && int(p) <= f.base+f.size {
+		return f
+	}
+	// p is not in last file - search all files
+	if i := searchFiles(s.files, int(p)); i >= 0 {
+		f := s.files[i]
+		// f.base <= int(p) by definition of searchFiles
+		if int(p) <= f.base+f.size {
+			s.last = f
+			return f
+		}
+	}
+	return nil
+}
+
+// File returns the file that contains the position p.
+// If no such file is found (for instance for p == NoPos),
+// the result is nil.
+//
+func (s *FileSet) File(p Pos) (f *File) {
+	if p != NoPos {
+		s.mutex.RLock()
+		f = s.file(p)
+		s.mutex.RUnlock()
+	}
+	return
+}
+
+// Position converts a Pos in the fileset into a general Position.
+func (s *FileSet) Position(p Pos) (pos Position) {
+	if p != NoPos {
+		s.mutex.RLock()
+		if f := s.file(p); f != nil {
+			pos = f.position(p)
+		}
+		s.mutex.RUnlock()
+	}
+	return
+}
+
+// -----------------------------------------------------------------------------
+// Helper functions
+
+func searchInts(a []int, x int) int {
+	// This function body is a manually inlined version of:
+	//
+	//   return sort.Search(len(a), func(i int) bool { return a[i] > x }) - 1
+	//
+	// With better compiler optimizations, this may not be needed in the
+	// future, but at the moment this change improves the go/printer
+	// benchmark performance by ~30%. This has a direct impact on the
+	// speed of gofmt and thus seems worthwhile (2011-04-29).
+	// TODO(gri): Remove this when compilers have caught up.
+	i, j := 0, len(a)
+	for i < j {
+		h := i + (j-i)/2 // avoid overflow when computing h
+		// i ≤ h < j
+		if a[h] <= x {
+			i = h + 1
+		} else {
+			j = h
+		}
+	}
+	return i - 1
+}
diff --git a/vendor/gopkg.in/gcfg.v1/token/position_test.go b/vendor/gopkg.in/gcfg.v1/token/position_test.go
new file mode 100644
index 0000000..160107d
--- /dev/null
+++ b/vendor/gopkg.in/gcfg.v1/token/position_test.go
@@ -0,0 +1,181 @@
+// Copyright 2010 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package token
+
+import (
+	"fmt"
+	"testing"
+)
+
+func checkPos(t *testing.T, msg string, p, q Position) {
+	if p.Filename != q.Filename {
+		t.Errorf("%s: expected filename = %q; got %q", msg, q.Filename, p.Filename)
+	}
+	if p.Offset != q.Offset {
+		t.Errorf("%s: expected offset = %d; got %d", msg, q.Offset, p.Offset)
+	}
+	if p.Line != q.Line {
+		t.Errorf("%s: expected line = %d; got %d", msg, q.Line, p.Line)
+	}
+	if p.Column != q.Column {
+		t.Errorf("%s: expected column = %d; got %d", msg, q.Column, p.Column)
+	}
+}
+
+func TestNoPos(t *testing.T) {
+	if NoPos.IsValid() {
+		t.Errorf("NoPos should not be valid")
+	}
+	var fset *FileSet
+	checkPos(t, "nil NoPos", fset.Position(NoPos), Position{})
+	fset = NewFileSet()
+	checkPos(t, "fset NoPos", fset.Position(NoPos), Position{})
+}
+
+var tests = []struct {
+	filename string
+	source   []byte // may be nil
+	size     int
+	lines    []int
+}{
+	{"a", []byte{}, 0, []int{}},
+	{"b", []byte("01234"), 5, []int{0}},
+	{"c", []byte("\n\n\n\n\n\n\n\n\n"), 9, []int{0, 1, 2, 3, 4, 5, 6, 7, 8}},
+	{"d", nil, 100, []int{0, 5, 10, 20, 30, 70, 71, 72, 80, 85, 90, 99}},
+	{"e", nil, 777, []int{0, 80, 100, 120, 130, 180, 267, 455, 500, 567, 620}},
+	{"f", []byte("package p\n\nimport \"fmt\""), 23, []int{0, 10, 11}},
+	{"g", []byte("package p\n\nimport \"fmt\"\n"), 24, []int{0, 10, 11}},
+	{"h", []byte("package p\n\nimport \"fmt\"\n "), 25, []int{0, 10, 11, 24}},
+}
+
+func linecol(lines []int, offs int) (int, int) {
+	prevLineOffs := 0
+	for line, lineOffs := range lines {
+		if offs < lineOffs {
+			return line, offs - prevLineOffs + 1
+		}
+		prevLineOffs = lineOffs
+	}
+	return len(lines), offs - prevLineOffs + 1
+}
+
+func verifyPositions(t *testing.T, fset *FileSet, f *File, lines []int) {
+	for offs := 0; offs < f.Size(); offs++ {
+		p := f.Pos(offs)
+		offs2 := f.Offset(p)
+		if offs2 != offs {
+			t.Errorf("%s, Offset: expected offset %d; got %d", f.Name(), offs, offs2)
+		}
+		line, col := linecol(lines, offs)
+		msg := fmt.Sprintf("%s (offs = %d, p = %d)", f.Name(), offs, p)
+		checkPos(t, msg, f.Position(f.Pos(offs)), Position{f.Name(), offs, line, col})
+		checkPos(t, msg, fset.Position(p), Position{f.Name(), offs, line, col})
+	}
+}
+
+func makeTestSource(size int, lines []int) []byte {
+	src := make([]byte, size)
+	for _, offs := range lines {
+		if offs > 0 {
+			src[offs-1] = '\n'
+		}
+	}
+	return src
+}
+
+func TestPositions(t *testing.T) {
+	const delta = 7 // a non-zero base offset increment
+	fset := NewFileSet()
+	for _, test := range tests {
+		// verify consistency of test case
+		if test.source != nil && len(test.source) != test.size {
+			t.Errorf("%s: inconsistent test case: expected file size %d; got %d", test.filename, test.size, len(test.source))
+		}
+
+		// add file and verify name and size
+		f := fset.AddFile(test.filename, fset.Base()+delta, test.size)
+		if f.Name() != test.filename {
+			t.Errorf("expected filename %q; got %q", test.filename, f.Name())
+		}
+		if f.Size() != test.size {
+			t.Errorf("%s: expected file size %d; got %d", f.Name(), test.size, f.Size())
+		}
+		if fset.File(f.Pos(0)) != f {
+			t.Errorf("%s: f.Pos(0) was not found in f", f.Name())
+		}
+
+		// add lines individually and verify all positions
+		for i, offset := range test.lines {
+			f.AddLine(offset)
+			if f.LineCount() != i+1 {
+				t.Errorf("%s, AddLine: expected line count %d; got %d", f.Name(), i+1, f.LineCount())
+			}
+			// adding the same offset again should be ignored
+			f.AddLine(offset)
+			if f.LineCount() != i+1 {
+				t.Errorf("%s, AddLine: expected unchanged line count %d; got %d", f.Name(), i+1, f.LineCount())
+			}
+			verifyPositions(t, fset, f, test.lines[0:i+1])
+		}
+
+		// add lines with SetLines and verify all positions
+		if ok := f.SetLines(test.lines); !ok {
+			t.Errorf("%s: SetLines failed", f.Name())
+		}
+		if f.LineCount() != len(test.lines) {
+			t.Errorf("%s, SetLines: expected line count %d; got %d", f.Name(), len(test.lines), f.LineCount())
+		}
+		verifyPositions(t, fset, f, test.lines)
+
+		// add lines with SetLinesForContent and verify all positions
+		src := test.source
+		if src == nil {
+			// no test source available - create one from scratch
+			src = makeTestSource(test.size, test.lines)
+		}
+		f.SetLinesForContent(src)
+		if f.LineCount() != len(test.lines) {
+			t.Errorf("%s, SetLinesForContent: expected line count %d; got %d", f.Name(), len(test.lines), f.LineCount())
+		}
+		verifyPositions(t, fset, f, test.lines)
+	}
+}
+
+func TestLineInfo(t *testing.T) {
+	fset := NewFileSet()
+	f := fset.AddFile("foo", fset.Base(), 500)
+	lines := []int{0, 42, 77, 100, 210, 220, 277, 300, 333, 401}
+	// add lines individually and provide alternative line information
+	for _, offs := range lines {
+		f.AddLine(offs)
+		f.AddLineInfo(offs, "bar", 42)
+	}
+	// verify positions for all offsets
+	for offs := 0; offs <= f.Size(); offs++ {
+		p := f.Pos(offs)
+		_, col := linecol(lines, offs)
+		msg := fmt.Sprintf("%s (offs = %d, p = %d)", f.Name(), offs, p)
+		checkPos(t, msg, f.Position(f.Pos(offs)), Position{"bar", offs, 42, col})
+		checkPos(t, msg, fset.Position(p), Position{"bar", offs, 42, col})
+	}
+}
+
+func TestFiles(t *testing.T) {
+	fset := NewFileSet()
+	for i, test := range tests {
+		fset.AddFile(test.filename, fset.Base(), test.size)
+		j := 0
+		fset.Iterate(func(f *File) bool {
+			if f.Name() != tests[j].filename {
+				t.Errorf("expected filename = %s; got %s", tests[j].filename, f.Name())
+			}
+			j++
+			return true
+		})
+		if j != i+1 {
+			t.Errorf("expected %d files; got %d", i+1, j)
+		}
+	}
+}
diff --git a/vendor/gopkg.in/gcfg.v1/token/serialize.go b/vendor/gopkg.in/gcfg.v1/token/serialize.go
new file mode 100644
index 0000000..4adc8f9
--- /dev/null
+++ b/vendor/gopkg.in/gcfg.v1/token/serialize.go
@@ -0,0 +1,56 @@
+// Copyright 2011 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package token
+
+type serializedFile struct {
+	// fields correspond 1:1 to fields with same (lower-case) name in File
+	Name  string
+	Base  int
+	Size  int
+	Lines []int
+	Infos []lineInfo
+}
+
+type serializedFileSet struct {
+	Base  int
+	Files []serializedFile
+}
+
+// Read calls decode to deserialize a file set into s; s must not be nil.
+func (s *FileSet) Read(decode func(interface{}) error) error {
+	var ss serializedFileSet
+	if err := decode(&ss); err != nil {
+		return err
+	}
+
+	s.mutex.Lock()
+	s.base = ss.Base
+	files := make([]*File, len(ss.Files))
+	for i := 0; i < len(ss.Files); i++ {
+		f := &ss.Files[i]
+		files[i] = &File{s, f.Name, f.Base, f.Size, f.Lines, f.Infos}
+	}
+	s.files = files
+	s.last = nil
+	s.mutex.Unlock()
+
+	return nil
+}
+
+// Write calls encode to serialize the file set s.
+func (s *FileSet) Write(encode func(interface{}) error) error {
+	var ss serializedFileSet
+
+	s.mutex.Lock()
+	ss.Base = s.base
+	files := make([]serializedFile, len(s.files))
+	for i, f := range s.files {
+		files[i] = serializedFile{f.name, f.base, f.size, f.lines, f.infos}
+	}
+	ss.Files = files
+	s.mutex.Unlock()
+
+	return encode(ss)
+}
diff --git a/vendor/gopkg.in/gcfg.v1/token/serialize_test.go b/vendor/gopkg.in/gcfg.v1/token/serialize_test.go
new file mode 100644
index 0000000..4e925ad
--- /dev/null
+++ b/vendor/gopkg.in/gcfg.v1/token/serialize_test.go
@@ -0,0 +1,111 @@
+// Copyright 2011 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package token
+
+import (
+	"bytes"
+	"encoding/gob"
+	"fmt"
+	"testing"
+)
+
+// equal returns nil if p and q describe the same file set;
+// otherwise it returns an error describing the discrepancy.
+func equal(p, q *FileSet) error {
+	if p == q {
+		// avoid deadlock if p == q
+		return nil
+	}
+
+	// not strictly needed for the test
+	p.mutex.Lock()
+	q.mutex.Lock()
+	defer q.mutex.Unlock()
+	defer p.mutex.Unlock()
+
+	if p.base != q.base {
+		return fmt.Errorf("different bases: %d != %d", p.base, q.base)
+	}
+
+	if len(p.files) != len(q.files) {
+		return fmt.Errorf("different number of files: %d != %d", len(p.files), len(q.files))
+	}
+
+	for i, f := range p.files {
+		g := q.files[i]
+		if f.set != p {
+			return fmt.Errorf("wrong fileset for %q", f.name)
+		}
+		if g.set != q {
+			return fmt.Errorf("wrong fileset for %q", g.name)
+		}
+		if f.name != g.name {
+			return fmt.Errorf("different filenames: %q != %q", f.name, g.name)
+		}
+		if f.base != g.base {
+			return fmt.Errorf("different base for %q: %d != %d", f.name, f.base, g.base)
+		}
+		if f.size != g.size {
+			return fmt.Errorf("different size for %q: %d != %d", f.name, f.size, g.size)
+		}
+		for j, l := range f.lines {
+			m := g.lines[j]
+			if l != m {
+				return fmt.Errorf("different offsets for %q", f.name)
+			}
+		}
+		for j, l := range f.infos {
+			m := g.infos[j]
+			if l.Offset != m.Offset || l.Filename != m.Filename || l.Line != m.Line {
+				return fmt.Errorf("different infos for %q", f.name)
+			}
+		}
+	}
+
+	// we don't care about .last - it's just a cache
+	return nil
+}
+
+func checkSerialize(t *testing.T, p *FileSet) {
+	var buf bytes.Buffer
+	encode := func(x interface{}) error {
+		return gob.NewEncoder(&buf).Encode(x)
+	}
+	if err := p.Write(encode); err != nil {
+		t.Errorf("writing fileset failed: %s", err)
+		return
+	}
+	q := NewFileSet()
+	decode := func(x interface{}) error {
+		return gob.NewDecoder(&buf).Decode(x)
+	}
+	if err := q.Read(decode); err != nil {
+		t.Errorf("reading fileset failed: %s", err)
+		return
+	}
+	if err := equal(p, q); err != nil {
+		t.Errorf("filesets not identical: %s", err)
+	}
+}
+
+func TestSerialization(t *testing.T) {
+	p := NewFileSet()
+	checkSerialize(t, p)
+	// add some files
+	for i := 0; i < 10; i++ {
+		f := p.AddFile(fmt.Sprintf("file%d", i), p.Base()+i, i*100)
+		checkSerialize(t, p)
+		// add some lines and alternative file infos
+		line := 1000
+		for offs := 0; offs < f.Size(); offs += 40 + i {
+			f.AddLine(offs)
+			if offs%7 == 0 {
+				f.AddLineInfo(offs, fmt.Sprintf("file%d", offs), line)
+				line += 33
+			}
+		}
+		checkSerialize(t, p)
+	}
+}
diff --git a/vendor/gopkg.in/gcfg.v1/token/token.go b/vendor/gopkg.in/gcfg.v1/token/token.go
new file mode 100644
index 0000000..b3c7c83
--- /dev/null
+++ b/vendor/gopkg.in/gcfg.v1/token/token.go
@@ -0,0 +1,83 @@
+// Copyright 2009 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package token defines constants representing the lexical tokens of the gcfg
+// configuration syntax and basic operations on tokens (printing, predicates).
+//
+// Note that the API for the token package may change to accommodate new
+// features or implementation changes in gcfg.
+//
+package token
+
+import "strconv"
+
+// Token is the set of lexical tokens of the gcfg configuration syntax.
+type Token int
+
+// The list of tokens.
+const (
+	// Special tokens
+	ILLEGAL Token = iota
+	EOF
+	COMMENT
+
+	literal_beg
+	// Identifiers and basic type literals
+	// (these tokens stand for classes of literals)
+	IDENT  // section-name, variable-name
+	STRING // "subsection-name", variable value
+	literal_end
+
+	operator_beg
+	// Operators and delimiters
+	ASSIGN // =
+	LBRACK // [
+	RBRACK // ]
+	EOL    // \n
+	operator_end
+)
+
+var tokens = [...]string{
+	ILLEGAL: "ILLEGAL",
+
+	EOF:     "EOF",
+	COMMENT: "COMMENT",
+
+	IDENT:  "IDENT",
+	STRING: "STRING",
+
+	ASSIGN: "=",
+	LBRACK: "[",
+	RBRACK: "]",
+	EOL:    "\n",
+}
+
+// String returns the string corresponding to the token tok.
+// For operators and delimiters, the string is the actual token character
+// sequence (e.g., for the token ASSIGN, the string is "="). For all other
+// tokens the string corresponds to the token constant name (e.g. for the
+// token IDENT, the string is "IDENT").
+//
+func (tok Token) String() string {
+	s := ""
+	if 0 <= tok && tok < Token(len(tokens)) {
+		s = tokens[tok]
+	}
+	if s == "" {
+		s = "token(" + strconv.Itoa(int(tok)) + ")"
+	}
+	return s
+}
+
+// Predicates
+
+// IsLiteral returns true for tokens corresponding to identifiers
+// and basic type literals; it returns false otherwise.
+//
+func (tok Token) IsLiteral() bool { return literal_beg < tok && tok < literal_end }
+
+// IsOperator returns true for tokens corresponding to operators and
+// delimiters; it returns false otherwise.
+//
+func (tok Token) IsOperator() bool { return operator_beg < tok && tok < operator_end }
diff --git a/vendor/gopkg.in/gcfg.v1/types/bool.go b/vendor/gopkg.in/gcfg.v1/types/bool.go
new file mode 100644
index 0000000..8dcae0d
--- /dev/null
+++ b/vendor/gopkg.in/gcfg.v1/types/bool.go
@@ -0,0 +1,23 @@
+package types
+
+// BoolValues defines the name and value mappings for ParseBool.
+var BoolValues = map[string]interface{}{
+	"true": true, "yes": true, "on": true, "1": true,
+	"false": false, "no": false, "off": false, "0": false,
+}
+
+var boolParser = func() *EnumParser {
+	ep := &EnumParser{}
+	ep.AddVals(BoolValues)
+	return ep
+}()
+
+// ParseBool parses bool values according to the definitions in BoolValues.
+// Parsing is case-insensitive.
+func ParseBool(s string) (bool, error) {
+	v, err := boolParser.Parse(s)
+	if err != nil {
+		return false, err
+	}
+	return v.(bool), nil
+}
diff --git a/vendor/gopkg.in/gcfg.v1/types/doc.go b/vendor/gopkg.in/gcfg.v1/types/doc.go
new file mode 100644
index 0000000..9f9c345
--- /dev/null
+++ b/vendor/gopkg.in/gcfg.v1/types/doc.go
@@ -0,0 +1,4 @@
+// Package types defines helpers for type conversions.
+//
+// The API for this package is not finalized yet.
+package types
diff --git a/vendor/gopkg.in/gcfg.v1/types/enum.go b/vendor/gopkg.in/gcfg.v1/types/enum.go
new file mode 100644
index 0000000..1a0c7ef
--- /dev/null
+++ b/vendor/gopkg.in/gcfg.v1/types/enum.go
@@ -0,0 +1,44 @@
+package types
+
+import (
+	"fmt"
+	"reflect"
+	"strings"
+)
+
+// EnumParser parses "enum" values; i.e. a predefined set of strings to
+// predefined values.
+type EnumParser struct {
+	Type      string // type name; if not set, use type of first value added
+	CaseMatch bool   // if true, matching of strings is case-sensitive
+	// PrefixMatch bool
+	vals map[string]interface{}
+}
+
+// AddVals adds strings and values to an EnumParser.
+func (ep *EnumParser) AddVals(vals map[string]interface{}) {
+	if ep.vals == nil {
+		ep.vals = make(map[string]interface{})
+	}
+	for k, v := range vals {
+		if ep.Type == "" {
+			ep.Type = reflect.TypeOf(v).Name()
+		}
+		if !ep.CaseMatch {
+			k = strings.ToLower(k)
+		}
+		ep.vals[k] = v
+	}
+}
+
+// Parse parses the string and returns the value or an error.
+func (ep EnumParser) Parse(s string) (interface{}, error) {
+	if !ep.CaseMatch {
+		s = strings.ToLower(s)
+	}
+	v, ok := ep.vals[s]
+	if !ok {
+		return false, fmt.Errorf("failed to parse %s %#q", ep.Type, s)
+	}
+	return v, nil
+}
diff --git a/vendor/gopkg.in/gcfg.v1/types/enum_test.go b/vendor/gopkg.in/gcfg.v1/types/enum_test.go
new file mode 100644
index 0000000..4bf135e
--- /dev/null
+++ b/vendor/gopkg.in/gcfg.v1/types/enum_test.go
@@ -0,0 +1,29 @@
+package types
+
+import (
+	"testing"
+)
+
+func TestEnumParserBool(t *testing.T) {
+	for _, tt := range []struct {
+		val string
+		res bool
+		ok  bool
+	}{
+		{val: "tRuE", res: true, ok: true},
+		{val: "False", res: false, ok: true},
+		{val: "t", ok: false},
+	} {
+		b, err := ParseBool(tt.val)
+		switch {
+		case tt.ok && err != nil:
+			t.Errorf("%q: got error %v, want %v", tt.val, err, tt.res)
+		case !tt.ok && err == nil:
+			t.Errorf("%q: got %v, want error", tt.val, b)
+		case tt.ok && b != tt.res:
+			t.Errorf("%q: got %v, want %v", tt.val, b, tt.res)
+		default:
+			t.Logf("%q: got %v, %v", tt.val, b, err)
+		}
+	}
+}
diff --git a/vendor/gopkg.in/gcfg.v1/types/int.go b/vendor/gopkg.in/gcfg.v1/types/int.go
new file mode 100644
index 0000000..af7e75c
--- /dev/null
+++ b/vendor/gopkg.in/gcfg.v1/types/int.go
@@ -0,0 +1,86 @@
+package types
+
+import (
+	"fmt"
+	"strings"
+)
+
+// An IntMode is a mode for parsing integer values, representing a set of
+// accepted bases.
+type IntMode uint8
+
+// IntMode values for ParseInt; can be combined using binary or.
+const (
+	Dec IntMode = 1 << iota
+	Hex
+	Oct
+)
+
+// String returns a string representation of IntMode; e.g. `IntMode(Dec|Hex)`.
+func (m IntMode) String() string {
+	var modes []string
+	if m&Dec != 0 {
+		modes = append(modes, "Dec")
+	}
+	if m&Hex != 0 {
+		modes = append(modes, "Hex")
+	}
+	if m&Oct != 0 {
+		modes = append(modes, "Oct")
+	}
+	return "IntMode(" + strings.Join(modes, "|") + ")"
+}
+
+var errIntAmbig = fmt.Errorf("ambiguous integer value; must include '0' prefix")
+
+func prefix0(val string) bool {
+	return strings.HasPrefix(val, "0") || strings.HasPrefix(val, "-0")
+}
+
+func prefix0x(val string) bool {
+	return strings.HasPrefix(val, "0x") || strings.HasPrefix(val, "-0x")
+}
+
+// ParseInt parses val using mode into intptr, which must be a pointer to an
+// integer kind type. Non-decimal value require prefix `0` or `0x` in the cases
+// when mode permits ambiguity of base; otherwise the prefix can be omitted.
+func ParseInt(intptr interface{}, val string, mode IntMode) error {
+	val = strings.TrimSpace(val)
+	verb := byte(0)
+	switch mode {
+	case Dec:
+		verb = 'd'
+	case Dec + Hex:
+		if prefix0x(val) {
+			verb = 'v'
+		} else {
+			verb = 'd'
+		}
+	case Dec + Oct:
+		if prefix0(val) && !prefix0x(val) {
+			verb = 'v'
+		} else {
+			verb = 'd'
+		}
+	case Dec + Hex + Oct:
+		verb = 'v'
+	case Hex:
+		if prefix0x(val) {
+			verb = 'v'
+		} else {
+			verb = 'x'
+		}
+	case Oct:
+		verb = 'o'
+	case Hex + Oct:
+		if prefix0(val) {
+			verb = 'v'
+		} else {
+			return errIntAmbig
+		}
+	}
+	if verb == 0 {
+		panic("unsupported mode")
+	}
+	return ScanFully(intptr, val, verb)
+}
diff --git a/vendor/gopkg.in/gcfg.v1/types/int_test.go b/vendor/gopkg.in/gcfg.v1/types/int_test.go
new file mode 100644
index 0000000..b63dbcb
--- /dev/null
+++ b/vendor/gopkg.in/gcfg.v1/types/int_test.go
@@ -0,0 +1,67 @@
+package types
+
+import (
+	"reflect"
+	"testing"
+)
+
+func elem(p interface{}) interface{} {
+	return reflect.ValueOf(p).Elem().Interface()
+}
+
+func TestParseInt(t *testing.T) {
+	for _, tt := range []struct {
+		val  string
+		mode IntMode
+		exp  interface{}
+		ok   bool
+	}{
+		{"0", Dec, int(0), true},
+		{"10", Dec, int(10), true},
+		{"-10", Dec, int(-10), true},
+		{"x", Dec, int(0), false},
+		{"0xa", Hex, int(0xa), true},
+		{"a", Hex, int(0xa), true},
+		{"10", Hex, int(0x10), true},
+		{"-0xa", Hex, int(-0xa), true},
+		{"0x", Hex, int(0x0), true},  // Scanf doesn't require digit behind 0x
+		{"-0x", Hex, int(0x0), true}, // Scanf doesn't require digit behind 0x
+		{"-a", Hex, int(-0xa), true},
+		{"-10", Hex, int(-0x10), true},
+		{"x", Hex, int(0), false},
+		{"10", Oct, int(010), true},
+		{"010", Oct, int(010), true},
+		{"-10", Oct, int(-010), true},
+		{"-010", Oct, int(-010), true},
+		{"10", Dec | Hex, int(10), true},
+		{"010", Dec | Hex, int(10), true},
+		{"0x10", Dec | Hex, int(0x10), true},
+		{"10", Dec | Oct, int(10), true},
+		{"010", Dec | Oct, int(010), true},
+		{"0x10", Dec | Oct, int(0), false},
+		{"10", Hex | Oct, int(0), false}, // need prefix to distinguish Hex/Oct
+		{"010", Hex | Oct, int(010), true},
+		{"0x10", Hex | Oct, int(0x10), true},
+		{"10", Dec | Hex | Oct, int(10), true},
+		{"010", Dec | Hex | Oct, int(010), true},
+		{"0x10", Dec | Hex | Oct, int(0x10), true},
+	} {
+		typ := reflect.TypeOf(tt.exp)
+		res := reflect.New(typ).Interface()
+		err := ParseInt(res, tt.val, tt.mode)
+		switch {
+		case tt.ok && err != nil:
+			t.Errorf("ParseInt(%v, %#v, %v): fail; got error %v, want ok",
+				typ, tt.val, tt.mode, err)
+		case !tt.ok && err == nil:
+			t.Errorf("ParseInt(%v, %#v, %v): fail; got %v, want error",
+				typ, tt.val, tt.mode, elem(res))
+		case tt.ok && !reflect.DeepEqual(elem(res), tt.exp):
+			t.Errorf("ParseInt(%v, %#v, %v): fail; got %v, want %v",
+				typ, tt.val, tt.mode, elem(res), tt.exp)
+		default:
+			t.Logf("ParseInt(%v, %#v, %s): pass; got %v, error %v",
+				typ, tt.val, tt.mode, elem(res), err)
+		}
+	}
+}
diff --git a/vendor/gopkg.in/gcfg.v1/types/scan.go b/vendor/gopkg.in/gcfg.v1/types/scan.go
new file mode 100644
index 0000000..db2f6ed
--- /dev/null
+++ b/vendor/gopkg.in/gcfg.v1/types/scan.go
@@ -0,0 +1,23 @@
+package types
+
+import (
+	"fmt"
+	"io"
+	"reflect"
+)
+
+// ScanFully uses fmt.Sscanf with verb to fully scan val into ptr.
+func ScanFully(ptr interface{}, val string, verb byte) error {
+	t := reflect.ValueOf(ptr).Elem().Type()
+	// attempt to read extra bytes to make sure the value is consumed
+	var b []byte
+	n, err := fmt.Sscanf(val, "%"+string(verb)+"%s", ptr, &b)
+	switch {
+	case n < 1 || n == 1 && err != io.EOF:
+		return fmt.Errorf("failed to parse %q as %v: %v", val, t, err)
+	case n > 1:
+		return fmt.Errorf("failed to parse %q as %v: extra characters %q", val, t, string(b))
+	}
+	// n == 1 && err == io.EOF
+	return nil
+}
diff --git a/vendor/gopkg.in/gcfg.v1/types/scan_test.go b/vendor/gopkg.in/gcfg.v1/types/scan_test.go
new file mode 100644
index 0000000..a8083e0
--- /dev/null
+++ b/vendor/gopkg.in/gcfg.v1/types/scan_test.go
@@ -0,0 +1,36 @@
+package types
+
+import (
+	"reflect"
+	"testing"
+)
+
+func TestScanFully(t *testing.T) {
+	for _, tt := range []struct {
+		val  string
+		verb byte
+		res  interface{}
+		ok   bool
+	}{
+		{"a", 'v', int(0), false},
+		{"0x", 'v', int(0), true},
+		{"0x", 'd', int(0), false},
+	} {
+		d := reflect.New(reflect.TypeOf(tt.res)).Interface()
+		err := ScanFully(d, tt.val, tt.verb)
+		switch {
+		case tt.ok && err != nil:
+			t.Errorf("ScanFully(%T, %q, '%c'): want ok, got error %v",
+				d, tt.val, tt.verb, err)
+		case !tt.ok && err == nil:
+			t.Errorf("ScanFully(%T, %q, '%c'): want error, got %v",
+				d, tt.val, tt.verb, elem(d))
+		case tt.ok && err == nil && !reflect.DeepEqual(tt.res, elem(d)):
+			t.Errorf("ScanFully(%T, %q, '%c'): want %v, got %v",
+				d, tt.val, tt.verb, tt.res, elem(d))
+		default:
+			t.Logf("ScanFully(%T, %q, '%c') = %v; *ptr==%v",
+				d, tt.val, tt.verb, err, elem(d))
+		}
+	}
+}
diff --git a/vendor/gopkg.in/warnings.v0/LICENSE b/vendor/gopkg.in/warnings.v0/LICENSE
new file mode 100644
index 0000000..d65f7e9
--- /dev/null
+++ b/vendor/gopkg.in/warnings.v0/LICENSE
@@ -0,0 +1,24 @@
+Copyright (c) 2016 Péter Surányi.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+   * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+   * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/vendor/gopkg.in/warnings.v0/README b/vendor/gopkg.in/warnings.v0/README
new file mode 100644
index 0000000..974212b
--- /dev/null
+++ b/vendor/gopkg.in/warnings.v0/README
@@ -0,0 +1,77 @@
+Package warnings implements error handling with non-fatal errors (warnings).
+
+import path:   "gopkg.in/warnings.v0"
+package docs:  https://godoc.org/gopkg.in/warnings.v0 
+issues:        https://github.com/go-warnings/warnings/issues
+pull requests: https://github.com/go-warnings/warnings/pulls
+
+A recurring pattern in Go programming is the following:
+
+ func myfunc(params) error {
+     if err := doSomething(...); err != nil {
+         return err
+     }
+     if err := doSomethingElse(...); err != nil {
+         return err
+     }
+     if ok := doAnotherThing(...); !ok {
+         return errors.New("my error")
+     }
+     ...
+     return nil
+ }
+
+This pattern allows interrupting the flow on any received error. But what if
+there are errors that should be noted but still not fatal, for which the flow
+should not be interrupted? Implementing such logic at each if statement would
+make the code complex and the flow much harder to follow.
+
+Package warnings provides the Collector type and a clean and simple pattern
+for achieving such logic. The Collector takes care of deciding when to break
+the flow and when to continue, collecting any non-fatal errors (warnings)
+along the way. The only requirement is that fatal and non-fatal errors can be
+distinguished programmatically; that is a function such as
+
+ IsFatal(error) bool
+
+must be implemented. The following is an example of what the above snippet
+could look like using the warnings package:
+
+ import "gopkg.in/warnings.v0"
+
+ func isFatal(err error) bool {
+     _, ok := err.(WarningType)
+     return !ok
+ }
+
+ func myfunc(params) error {
+     c := warnings.NewCollector(isFatal)
+     c.FatalWithWarnings = true
+     if err := c.Collect(doSomething()); err != nil {
+         return err
+     }
+     if err := c.Collect(doSomethingElse(...)); err != nil {
+         return err
+     }
+     if ok := doAnotherThing(...); !ok {
+         if err := c.Collect(errors.New("my error")); err != nil {
+             return err
+         }
+     }
+     ...
+     return c.Done()
+ }
+
+For an example of a non-trivial code base using this library, see
+gopkg.in/gcfg.v1
+
+Rules for using warnings
+
+ - ensure that warnings are programmatically distinguishable from fatal
+   errors (i.e. implement an isFatal function and any necessary error types)
+ - ensure that there is a single Collector instance for a call of each
+   exported function
+ - ensure that all errors (fatal or warning) are fed through Collect
+ - ensure that every time an error is returned, it is one returned by a
+   Collector (from Collect or Done)
+ - ensure that Collect is never called after Done
diff --git a/vendor/gopkg.in/warnings.v0/warnings.go b/vendor/gopkg.in/warnings.v0/warnings.go
new file mode 100644
index 0000000..b849d1e
--- /dev/null
+++ b/vendor/gopkg.in/warnings.v0/warnings.go
@@ -0,0 +1,194 @@
+// Package warnings implements error handling with non-fatal errors (warnings).
+//
+// A recurring pattern in Go programming is the following:
+//
+//  func myfunc(params) error {
+//      if err := doSomething(...); err != nil {
+//          return err
+//      }
+//      if err := doSomethingElse(...); err != nil {
+//          return err
+//      }
+//      if ok := doAnotherThing(...); !ok {
+//          return errors.New("my error")
+//      }
+//      ...
+//      return nil
+//  }
+//
+// This pattern allows interrupting the flow on any received error. But what if
+// there are errors that should be noted but still not fatal, for which the flow
+// should not be interrupted? Implementing such logic at each if statement would
+// make the code complex and the flow much harder to follow.
+//
+// Package warnings provides the Collector type and a clean and simple pattern
+// for achieving such logic. The Collector takes care of deciding when to break
+// the flow and when to continue, collecting any non-fatal errors (warnings)
+// along the way. The only requirement is that fatal and non-fatal errors can be
+// distinguished programmatically; that is a function such as
+//
+//  IsFatal(error) bool
+//
+// must be implemented. The following is an example of what the above snippet
+// could look like using the warnings package:
+//
+//  import "gopkg.in/warnings.v0"
+//
+//  func isFatal(err error) bool {
+//      _, ok := err.(WarningType)
+//      return !ok
+//  }
+//
+//  func myfunc(params) error {
+//      c := warnings.NewCollector(isFatal)
+//      c.FatalWithWarnings = true
+//      if err := c.Collect(doSomething()); err != nil {
+//          return err
+//      }
+//      if err := c.Collect(doSomethingElse(...)); err != nil {
+//          return err
+//      }
+//      if ok := doAnotherThing(...); !ok {
+//          if err := c.Collect(errors.New("my error")); err != nil {
+//              return err
+//          }
+//      }
+//      ...
+//      return c.Done()
+//  }
+//
+// For an example of a non-trivial code base using this library, see
+// gopkg.in/gcfg.v1
+//
+// Rules for using warnings
+//
+//  - ensure that warnings are programmatically distinguishable from fatal
+//    errors (i.e. implement an isFatal function and any necessary error types)
+//  - ensure that there is a single Collector instance for a call of each
+//    exported function
+//  - ensure that all errors (fatal or warning) are fed through Collect
+//  - ensure that every time an error is returned, it is one returned by a
+//    Collector (from Collect or Done)
+//  - ensure that Collect is never called after Done
+//
+// TODO
+//
+//  - optionally limit the number of warnings (e.g. stop after 20 warnings) (?)
+//  - consider interaction with contexts
+//  - go vet-style invocations verifier
+//  - semi-automatic code converter
+//
+package warnings // import "gopkg.in/warnings.v0"
+
+import (
+	"bytes"
+	"fmt"
+)
+
+// List holds a collection of warnings and optionally one fatal error.
+type List struct {
+	Warnings []error
+	Fatal    error
+}
+
+// Error implements the error interface.
+func (l List) Error() string {
+	b := bytes.NewBuffer(nil)
+	if l.Fatal != nil {
+		fmt.Fprintln(b, "fatal:")
+		fmt.Fprintln(b, l.Fatal)
+	}
+	switch len(l.Warnings) {
+	case 0:
+	// nop
+	case 1:
+		fmt.Fprintln(b, "warning:")
+	default:
+		fmt.Fprintln(b, "warnings:")
+	}
+	for _, err := range l.Warnings {
+		fmt.Fprintln(b, err)
+	}
+	return b.String()
+}
+
+// A Collector collects errors up to the first fatal error.
+type Collector struct {
+	// IsFatal distinguishes between warnings and fatal errors.
+	IsFatal func(error) bool
+	// FatalWithWarnings set to true means that a fatal error is returned as
+	// a List together with all warnings so far. The default behavior is to
+	// only return the fatal error and discard any warnings that have been
+	// collected.
+	FatalWithWarnings bool
+
+	l    List
+	done bool
+}
+
+// NewCollector returns a new Collector; it uses isFatal to distinguish between
+// warnings and fatal errors.
+func NewCollector(isFatal func(error) bool) *Collector {
+	return &Collector{IsFatal: isFatal}
+}
+
+// Collect collects a single error (warning or fatal). It returns nil if
+// collection can continue (only warnings so far), or otherwise the errors
+// collected. Collect mustn't be called after the first fatal error or after
+// Done has been called.
+func (c *Collector) Collect(err error) error {
+	if c.done {
+		panic("warnings.Collector already done")
+	}
+	if err == nil {
+		return nil
+	}
+	if c.IsFatal(err) {
+		c.done = true
+		c.l.Fatal = err
+	} else {
+		c.l.Warnings = append(c.l.Warnings, err)
+	}
+	if c.l.Fatal != nil {
+		return c.erorr()
+	}
+	return nil
+}
+
+// Done ends collection and returns the collected error(s).
+func (c *Collector) Done() error {
+	c.done = true
+	return c.erorr()
+}
+
+func (c *Collector) erorr() error {
+	if !c.FatalWithWarnings && c.l.Fatal != nil {
+		return c.l.Fatal
+	}
+	if c.l.Fatal == nil && len(c.l.Warnings) == 0 {
+		return nil
+	}
+	// Note that a single warning is also returned as a List. This is to make it
+	// easier to determine fatal-ness of the returned error.
+	return c.l
+}
+
+// FatalOnly returns the fatal error, if any, **in an error returned by a
+// Collector**. It returns nil if and only if err is nil or err is a List
+// with err.Fatal == nil.
+func FatalOnly(err error) error {
+	l, ok := err.(List)
+	if !ok {
+		return err
+	}
+	return l.Fatal
+}
+
+// WarningsOnly returns the warnings **in an error returned by a Collector**.
+func WarningsOnly(err error) []error {
+	l, ok := err.(List)
+	if !ok {
+		return nil
+	}
+	return l.Warnings
+}
diff --git a/vendor/gopkg.in/warnings.v0/warnings_test.go b/vendor/gopkg.in/warnings.v0/warnings_test.go
new file mode 100644
index 0000000..b4a6ea4
--- /dev/null
+++ b/vendor/gopkg.in/warnings.v0/warnings_test.go
@@ -0,0 +1,82 @@
+package warnings_test
+
+import (
+	"errors"
+	"reflect"
+	"testing"
+
+	w "gopkg.in/warnings.v0"
+)
+
+var _ error = w.List{}
+
+type warn string
+
+func (w warn) Error() string { return string(w) }
+
+func warning(s string) error { return warn(s) }
+func fatal(s string) error   { return errors.New(s) }
+
+func isFatal(err error) bool {
+	_, ok := err.(warn)
+	return !ok
+}
+
+func omitNils(errs []error) []error {
+	if errs == nil {
+		return nil
+	}
+	res := []error{}
+	for _, err := range errs {
+		if err != nil {
+			res = append(res, err)
+		}
+	}
+	return res
+}
+
+var collectorTests = [...]struct {
+	collector w.Collector
+	warnings  []error
+	fatal     error
+}{
+	{w.Collector{IsFatal: isFatal}, nil, nil},
+	{w.Collector{IsFatal: isFatal}, nil, fatal("1f")},
+	{w.Collector{IsFatal: isFatal}, []error{warning("1w")}, nil},
+	{w.Collector{IsFatal: isFatal}, []error{warning("1w")}, fatal("2f")},
+	{w.Collector{IsFatal: isFatal}, []error{warning("1w"), warning("2w")}, fatal("3f")},
+	{w.Collector{IsFatal: isFatal}, []error{warning("1w"), nil, warning("2w")}, fatal("3f")},
+	{w.Collector{IsFatal: isFatal, FatalWithWarnings: true}, []error{warning("1w")}, fatal("2f")},
+}
+
+func TestCollector(t *testing.T) {
+	for _, tt := range collectorTests {
+		c := tt.collector
+		for _, warn := range tt.warnings {
+			err := c.Collect(warn)
+			if err != nil {
+				t.Fatalf("Collect(%v) = %v; want nil", warn, err)
+			}
+		}
+		if tt.fatal != nil {
+			err := c.Collect(tt.fatal)
+			if err == nil || w.FatalOnly(err) != tt.fatal {
+				t.Fatalf("Collect(%v) = %v; want fatal %v", tt.fatal,
+					err, tt.fatal)
+			}
+		}
+		err := c.Done()
+		if tt.fatal != nil {
+			if err == nil || w.FatalOnly(err) != tt.fatal {
+				t.Fatalf("Done() = %v; want fatal %v", err, tt.fatal)
+			}
+		}
+		if tt.fatal == nil || c.FatalWithWarnings {
+			warns := w.WarningsOnly(err)
+			if !reflect.DeepEqual(warns, omitNils(tt.warnings)) {
+				t.Fatalf("Done() = %v; want warnings %v", err,
+					omitNils(tt.warnings))
+			}
+		}
+	}
+}